Mercurial > octave-nkf
diff libinterp/octave-value/ov-classdef.cc @ 15986:14aa0b5a980c classdef
Abstract the meta-protocol layer to use it for other meta objects.
* libinterp/octave-value/ov-classdef.h (class cdef_meta_object_rep,
class cdef_meta_object): New classes.
(cdef_object_rep::is_class, cdef_object_rep::is_method,
cdef_object_rep::is_property, cdef_object_rep::is_package): Moved to
cdef_meta_object_rep.
(cdef_object::is_class, cdef_object::is_method, cdef_object::is_property,
cdef_object::is_package): Moved to cdef_meta_object.
(cdef_object_rep::is_handle_object, cdef_object_rep::is_value_object,
cdef_object_rep::is_meta_object): New virtual methods.
(cdef_object::is_handle_object, cdef_object::is_value_object,
cdef_object::is_meta_object): New methods.
(handle_cdef_object::is_handle_object): New method.
(value_cdef_object::is_value_object): Likewise.
(class cdef_class, class cdef_property, class_cdef_method,
class cdef_package): Inherit from cdef_meta_object.
(class cdef_class::cdef_class_rep, class cdef_property::cdef_property_rep,
class cdef_method::cdef_method_rep, class cdef_package::cdef_package_rep):
Inherit from cdef_meta_object_rep.
(cdef_class::cdef_class_rep::meta_subsref): Renamed from subsref_meta.
(cdef_class::cdef_class_rep::meta_release,
cdef_class::cdef_class_rep::meta_is_postfix_index_handled): New method, moved
from octave_classdef_proxy.
(cdef_class::operator=(const cdef_object&)): Remove method.
(cdef_class::subsref_meta): Remove method, replaced by
cdef_meta_object::meta_subsref.
(cdef_method::cdef_method(const cdef_method&)): Fix signature of copy
constructor, was using "const cdef_property&".
(cdef_package::cdef_package(const cdef_package&)): Add copy constructor.
* libinterp/octave-value/ov-classdef.cc (class octave_classdef_meta): Renamed
from octave_classdef_proxy.
(octave_classdef_meta::meta_subsref): Method renamed from subsref_meta.
(octave_classdef_meta::meta_subsref, octave_classdef_meta::octave_classdef_meta,
octave_classdef_meta::is_postfix_index_handled): Forward calls to
cdef_meta_object.
(cdef_class::cdef_class_rep::meta_subsref): Renamed from subsref_meta.
(cdef_class::cdef_class_rep::meta_release): New method.
(cdef_class::get_method_function): Use renamed class octave_classdef_meta.
(cdef_class::cdef_class_rep::cdef_class_rep): Inherit from cdef_meta_object_rep.
author | Michael Goffioul <michael.goffioul@gmail.com> |
---|---|
date | Mon, 28 Jan 2013 21:56:01 -0500 |
parents | cdeb6eb656be |
children | 10142aad4b9f |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-classdef.cc Sun Jan 20 23:03:17 2013 -0500 +++ b/libinterp/octave-value/ov-classdef.cc Mon Jan 28 21:56:01 2013 -0500 @@ -832,17 +832,14 @@ //---------------------------------------------------------------------------- -class octave_classdef_proxy : public octave_function +class octave_classdef_meta : public octave_function { public: - octave_classdef_proxy (const cdef_class& _klass) - : klass (_klass) { } - - ~octave_classdef_proxy (void) - { - // This means the class has been cleared from the symbol table. - all_classes.erase (klass.get_name ()); - } + octave_classdef_meta (const cdef_meta_object& obj) + : object (obj) { } + + ~octave_classdef_meta (void) + { object.meta_release (); } octave_function* function_value (bool = false) { return this; } @@ -850,7 +847,7 @@ subsref (const std::string& type, const std::list<octave_value_list>& idx, int nargout) - { return klass.subsref_meta (type, idx, nargout); } + { return object.meta_subsref (type, idx, nargout); } octave_value subsref (const std::string& type, @@ -866,7 +863,7 @@ octave_value_list do_multi_index_op (int nargout, const octave_value_list& idx) { - // Emulate constructor + // Emulate ()-type meta subsref std::list<octave_value_list> l (1, idx); std::string type ("("); @@ -875,10 +872,10 @@ } bool is_postfix_index_handled (char type) const - { return (type == '(' || type == '.'); } + { return object.meta_is_postfix_index_handled (type); } private: - cdef_class klass; + cdef_meta_object object; }; //---------------------------------------------------------------------------- @@ -1407,7 +1404,7 @@ } cdef_class::cdef_class_rep::cdef_class_rep (const std::list<cdef_class>& superclasses) - : handle_cdef_object (), member_count (0), handle_class (false), + : cdef_meta_object_rep (), member_count (0), handle_class (false), object_count (0), meta (false) { put ("SuperClasses", to_ov (superclasses)); @@ -1917,7 +1914,7 @@ } octave_value_list -cdef_class::cdef_class_rep::subsref_meta (const std::string& type, +cdef_class::cdef_class_rep::meta_subsref (const std::string& type, const std::list<octave_value_list>& idx, int nargout) { @@ -2002,6 +1999,12 @@ } void +cdef_class::cdef_class_rep::meta_release (void) +{ + all_classes.erase (get_name ()); +} + +void cdef_class::cdef_class_rep::initialize_object (cdef_object& obj) { // Populate the object with default property values @@ -2400,7 +2403,7 @@ octave_function* cdef_class::get_method_function (const std::string& /* nm */) { - octave_classdef_proxy* p = new octave_classdef_proxy (*this); + octave_classdef_meta* p = new octave_classdef_meta (*this); return p; }