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;
 }