Mercurial > octave
changeset 24252:f8c263f961c1
use shared_ptr to manage graphics_object and graphics_event objects
* graphics.in.h, graphics.cc (base_graphics_object::count): Delete
data member and all uses.
(graphics_object::rep): Manage with shared_ptr.
(class graphics_object): Use default constructor and destructor functions
where possible.
(base_graphics_event::count): Delete data member and all uses.
(graphics_event::rep): Manage with shared_ptr.
(class graphics_event): Use default constructor and destructor
functions where possible.
(graphics_event::create_callback_event,
graphics_Event::create_fucntion_event,
graphics_event::create_set_event): Don't set rep directly.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 15 Nov 2017 14:21:52 -0500 |
parents | 599fe61a5619 |
children | cf15cb87bad9 |
files | libinterp/corefcn/graphics.cc libinterp/corefcn/graphics.in.h |
diffstat | 2 files changed, 36 insertions(+), 87 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/graphics.cc Tue Nov 14 09:41:07 2017 +0100 +++ b/libinterp/corefcn/graphics.cc Wed Nov 15 14:21:52 2017 -0500 @@ -10055,11 +10055,7 @@ const std::string& name, const octave_value& data) { - graphics_event e; - - e.rep = new callback_event (h, name, data); - - return e; + return graphics_event (new callback_event (h, name, data)); } graphics_event @@ -10067,22 +10063,14 @@ const octave_value& cb, const octave_value& data) { - graphics_event e; - - e.rep = new callback_event (h, cb, data); - - return e; + return graphics_event (new callback_event (h, cb, data)); } graphics_event graphics_event::create_function_event (graphics_event::event_fcn fcn, void *data) { - graphics_event e; - - e.rep = new function_event (fcn, data); - - return e; + return graphics_event (new function_event (fcn, data)); } graphics_event @@ -10091,11 +10079,7 @@ const octave_value& data, bool notify_toolkit) { - graphics_event e; - - e.rep = new set_event (h, name, data, notify_toolkit); - - return e; + return graphics_event (new set_event (h, name, data, notify_toolkit)); } static void
--- a/libinterp/corefcn/graphics.in.h Tue Nov 14 09:41:07 2017 +0100 +++ b/libinterp/corefcn/graphics.in.h Wed Nov 15 14:21:52 2017 -0500 @@ -31,6 +31,7 @@ #include <algorithm> #include <list> #include <map> +#include <memory> #include <set> #include <sstream> #include <string> @@ -2405,7 +2406,7 @@ public: friend class graphics_object; - base_graphics_object (void) : count (1), toolkit_flag (false) { } + base_graphics_object (void) : toolkit_flag (false) { } // No copying! @@ -2642,8 +2643,6 @@ } protected: - // A reference count. - octave::refcount<int> count; // A flag telling whether this object is a valid object // in the backend context. @@ -2653,35 +2652,16 @@ class OCTINTERP_API graphics_object { public: + graphics_object (void) : rep (new base_graphics_object ()) { } - graphics_object (base_graphics_object *new_rep) - : rep (new_rep) { } - - graphics_object (const graphics_object& obj) : rep (obj.rep) - { - rep->count++; - } - - graphics_object& operator = (const graphics_object& obj) - { - if (rep != obj.rep) - { - if (--rep->count == 0) - delete rep; - - rep = obj.rep; - rep->count++; - } - - return *this; - } - - ~graphics_object (void) - { - if (--rep->count == 0) - delete rep; - } + graphics_object (base_graphics_object *new_rep) : rep (new_rep) { } + + graphics_object (const graphics_object& obj) = default; + + graphics_object& operator = (const graphics_object& obj) = default; + + ~graphics_object (void) = default; void mark_modified (void) { rep->mark_modified (); } @@ -2879,7 +2859,8 @@ { rep->reset_default_properties (); } private: - base_graphics_object *rep; + + std::shared_ptr<base_graphics_object> rep; }; // --------------------------------------------------------------------- @@ -5966,57 +5947,40 @@ base_graphics_event { public: + friend class graphics_event; - base_graphics_event (void) : count (1) { } + base_graphics_event (void) = default; virtual ~base_graphics_event (void) = default; virtual void execute (void) = 0; - -private: - octave::refcount<int> count; }; class graphics_event { public: + typedef void (*event_fcn) (void*); - graphics_event (void) : rep (nullptr) { } - - graphics_event (const graphics_event& e) : rep (e.rep) - { - rep->count++; - } - - ~graphics_event (void) - { - if (rep && --rep->count == 0) - delete rep; - } - - graphics_event& operator = (const graphics_event& e) - { - if (rep != e.rep) - { - if (rep && --rep->count == 0) - delete rep; - - rep = e.rep; - if (rep) - rep->count++; - } - - return *this; - } + graphics_event (void) = default; + + graphics_event (base_graphics_event *new_rep) : rep (new_rep) { } + + graphics_event (const graphics_event& e) = default; + + ~graphics_event (void) = default; + + graphics_event& operator = (const graphics_event& e) = default; void execute (void) - { if (rep) rep->execute (); } - - bool ok (void) const - { return (rep != nullptr); } + { + if (ok ()) + rep->execute (); + } + + bool ok (void) const { return (rep != nullptr); } static graphics_event create_callback_event (const graphics_handle& h, @@ -6036,7 +6000,8 @@ const octave_value& value, bool notify_toolkit = true); private: - base_graphics_event *rep; + + std::shared_ptr <base_graphics_event> rep; }; class OCTINTERP_API gh_manager