comparison libinterp/octave-value/ov-classdef.h @ 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
comparison
equal deleted inserted replaced
15968:cdeb6eb656be 15986:14aa0b5a980c
81 return new cdef_object_rep (); 81 return new cdef_object_rep ();
82 } 82 }
83 83
84 virtual bool is_array (void) const { return false; } 84 virtual bool is_array (void) const { return false; }
85 85
86 virtual bool is_class (void) const { return false; } 86 virtual bool is_value_object (void) const { return false; }
87 87
88 virtual bool is_property (void) const { return false; } 88 virtual bool is_handle_object (void) const { return false; }
89 89
90 virtual bool is_method (void) const { return false; } 90 virtual bool is_meta_object (void) const { return false; }
91
92 virtual bool is_package (void) const { return false; }
93 91
94 virtual Array<cdef_object> array_value (void) const 92 virtual Array<cdef_object> array_value (void) const
95 { 93 {
96 gripe_invalid_object ("array_value"); 94 gripe_invalid_object ("array_value");
97 return Array<cdef_object> (); 95 return Array<cdef_object> ();
238 cdef_object copy (void) const 236 cdef_object copy (void) const
239 { return cdef_object (rep->copy ()); } 237 { return cdef_object (rep->copy ()); }
240 238
241 bool is_array (void) const { return rep->is_array (); } 239 bool is_array (void) const { return rep->is_array (); }
242 240
243 bool is_class (void) const { return rep->is_class (); } 241 bool is_value_object (void) const { return rep->is_value_object (); }
244 242
245 bool is_property (void) const { return rep->is_property (); } 243 bool is_handle_object (void) const { return rep->is_handle_object (); }
246 244
247 bool is_method (void) const { return rep->is_method (); } 245 bool is_meta_object (void) const { return rep->is_meta_object (); }
248
249 bool is_package (void) const { return rep->is_package (); }
250 246
251 Array<cdef_object> array_value (void) const { return rep->array_value (); } 247 Array<cdef_object> array_value (void) const { return rep->array_value (); }
252 248
253 void put (const std::string& pname, const octave_value& val) 249 void put (const std::string& pname, const octave_value& val)
254 { rep->put (pname, val); } 250 { rep->put (pname, val); }
471 cdef_object_rep* copy (void) const 467 cdef_object_rep* copy (void) const
472 { return new handle_cdef_object (*this); } 468 { return new handle_cdef_object (*this); }
473 469
474 bool is_valid (void) const { return true; } 470 bool is_valid (void) const { return true; }
475 471
472 bool is_handle_object (void) const { return true; }
473
476 protected: 474 protected:
477 // Restricted copying! 475 // Restricted copying!
478 handle_cdef_object (const handle_cdef_object& obj) 476 handle_cdef_object (const handle_cdef_object& obj)
479 : cdef_object_scalar (obj) { } 477 : cdef_object_scalar (obj) { }
480 478
497 495
498 cdef_object_rep* copy (void) const { return clone (); } 496 cdef_object_rep* copy (void) const { return clone (); }
499 497
500 bool is_valid (void) const { return true; } 498 bool is_valid (void) const { return true; }
501 499
500 bool is_value_object (void) const { return true; }
501
502 private: 502 private:
503 // Private copying! 503 // Private copying!
504 value_cdef_object (const value_cdef_object& obj) 504 value_cdef_object (const value_cdef_object& obj)
505 : cdef_object_scalar (obj) { } 505 : cdef_object_scalar (obj) { }
506 506
507 // No assignment! 507 // No assignment!
508 value_cdef_object& operator = (const value_cdef_object&); 508 value_cdef_object& operator = (const value_cdef_object&);
509 }; 509 };
510 510
511 class 511 class
512 cdef_class : public cdef_object 512 cdef_meta_object_rep : public handle_cdef_object
513 {
514 public:
515 cdef_meta_object_rep (void)
516 : handle_cdef_object () { }
517
518 ~cdef_meta_object_rep (void) { }
519
520 cdef_object_rep* copy (void) const
521 { return new cdef_meta_object_rep (*this); }
522
523 bool is_meta_object (void) const { return true; }
524
525 virtual bool is_class (void) const { return false; }
526
527 virtual bool is_property (void) const { return false; }
528
529 virtual bool is_method (void) const { return false; }
530
531 virtual bool is_package (void) const { return false; }
532
533 virtual octave_value_list
534 meta_subsref (const std::string& /* type */,
535 const std::list<octave_value_list>& /* idx */,
536 int /* nargout */)
537 {
538 ::error ("subsref: invalid meta object");
539 return octave_value_list ();
540 }
541
542 virtual void meta_release (void) { }
543
544 virtual bool meta_is_postfix_index_handled (char /* type */) const
545 { return false; }
546
547 protected:
548 // Restricted copying!
549 cdef_meta_object_rep (const cdef_meta_object_rep& obj)
550 : handle_cdef_object (obj) { }
551
552 private:
553 // No assignment!
554 cdef_meta_object_rep& operator = (const cdef_meta_object_rep&);
555 };
556
557 class
558 cdef_meta_object : public cdef_object
559 {
560 public:
561 cdef_meta_object (void)
562 : cdef_object () { }
563
564 cdef_meta_object (const cdef_meta_object& obj)
565 : cdef_object (obj) { }
566
567 cdef_meta_object (cdef_meta_object_rep *r)
568 : cdef_object (r) { }
569
570 // Object consistency is checked in sub-classes.
571 cdef_meta_object (const cdef_object& obj)
572 : cdef_object (obj) { }
573
574 ~cdef_meta_object (void) { }
575
576 bool is_class (void) const { return get_rep ()->is_class (); }
577
578 bool is_property (void) const { return get_rep ()->is_property (); }
579
580 bool is_method (void) const { return get_rep ()->is_method (); }
581
582 bool is_package (void) const { return get_rep ()->is_package (); }
583
584 octave_value_list
585 meta_subsref (const std::string& type,
586 const std::list<octave_value_list>& idx, int nargout)
587 { return get_rep ()->meta_subsref (type, idx, nargout); }
588
589 void meta_release (void) { get_rep ()->meta_release (); }
590
591 bool meta_is_postfix_index_handled (char type) const
592 { return get_rep ()->meta_is_postfix_index_handled (type); }
593
594 private:
595 cdef_meta_object_rep* get_rep (void)
596 { return dynamic_cast<cdef_meta_object_rep *> (cdef_object::get_rep ()); }
597
598 const cdef_meta_object_rep* get_rep (void) const
599 { return dynamic_cast<const cdef_meta_object_rep *> (cdef_object::get_rep ()); }
600 };
601
602 class
603 cdef_class : public cdef_meta_object
513 { 604 {
514 private: 605 private:
515 606
516 class 607 class
517 cdef_class_rep : public handle_cdef_object 608 cdef_class_rep : public cdef_meta_object_rep
518 { 609 {
519 public: 610 public:
520 cdef_class_rep (void) 611 cdef_class_rep (void)
521 : handle_cdef_object (), member_count (0), handle_class (false), 612 : cdef_meta_object_rep (), member_count (0), handle_class (false),
522 object_count (0), meta (false) { } 613 object_count (0), meta (false) { }
523 614
524 cdef_class_rep (const std::list<cdef_class>& superclasses); 615 cdef_class_rep (const std::list<cdef_class>& superclasses);
525 616
526 cdef_object_rep* copy (void) const { return new cdef_class_rep (*this); } 617 cdef_object_rep* copy (void) const { return new cdef_class_rep (*this); }
555 std::string get_directory (void) const { return directory; } 646 std::string get_directory (void) const { return directory; }
556 647
557 void delete_object (cdef_object obj); 648 void delete_object (cdef_object obj);
558 649
559 octave_value_list 650 octave_value_list
560 subsref_meta (const std::string& type, 651 meta_subsref (const std::string& type,
561 const std::list<octave_value_list>& idx, int nargout); 652 const std::list<octave_value_list>& idx, int nargout);
653
654 void meta_release (void);
655
656 bool meta_is_postfix_index_handled (char type) const
657 { return (type == '(' || type == '.'); }
562 658
563 octave_value construct (const octave_value_list& args); 659 octave_value construct (const octave_value_list& args);
564 660
565 cdef_object construct_object (const octave_value_list& args); 661 cdef_object construct_object (const octave_value_list& args);
566 662
649 typedef std::map<std::string,cdef_property>::iterator property_iterator; 745 typedef std::map<std::string,cdef_property>::iterator property_iterator;
650 typedef std::map<std::string,cdef_property>::const_iterator property_const_iterator; 746 typedef std::map<std::string,cdef_property>::const_iterator property_const_iterator;
651 747
652 private: 748 private:
653 cdef_class_rep (const cdef_class_rep& c) 749 cdef_class_rep (const cdef_class_rep& c)
654 : handle_cdef_object (c), directory (c.directory), 750 : cdef_meta_object_rep (c), directory (c.directory),
655 method_map (c.method_map), property_map (c.property_map), 751 method_map (c.method_map), property_map (c.property_map),
656 member_count (c.member_count), handle_class (c.handle_class), 752 member_count (c.member_count), handle_class (c.handle_class),
657 implicit_ctor_list (c.implicit_ctor_list), 753 implicit_ctor_list (c.implicit_ctor_list),
658 object_count (c.object_count), meta (c.meta) { } 754 object_count (c.object_count), meta (c.meta) { }
659 }; 755 };
660 756
661 public: 757 public:
662 // Create and invalid class object 758 // Create and invalid class object
663 cdef_class (void) 759 cdef_class (void)
664 : cdef_object () { } 760 : cdef_meta_object () { }
665 761
666 cdef_class (const std::string& nm, 762 cdef_class (const std::string& nm,
667 const std::list<cdef_class>& superclasses) 763 const std::list<cdef_class>& superclasses)
668 : cdef_object (new cdef_class_rep (superclasses)) 764 : cdef_meta_object (new cdef_class_rep (superclasses))
669 { get_rep ()->set_name (nm); } 765 { get_rep ()->set_name (nm); }
670 766
671 cdef_class (const cdef_class& cls) 767 cdef_class (const cdef_class& cls)
672 : cdef_object (cls) { } 768 : cdef_meta_object (cls) { }
673 769
674 cdef_class (const cdef_object& obj) 770 cdef_class (const cdef_object& obj)
675 : cdef_object (obj) 771 : cdef_meta_object (obj)
676 { 772 {
677 // This should never happen... 773 // This should never happen...
678 if (! is_class ()) 774 if (! is_class ())
679 error ("internal error: invalid assignment from %s to meta.class object", 775 error ("internal error: invalid assignment from %s to meta.class object",
680 class_name ().c_str ()); 776 class_name ().c_str ());
685 cdef_object::operator= (cls); 781 cdef_object::operator= (cls);
686 782
687 return *this; 783 return *this;
688 } 784 }
689 785
690 cdef_class& operator = (const cdef_object& obj)
691 {
692 if (obj.is_class ())
693 cdef_object::operator= (obj);
694 else
695 error ("internal error: invalid assignment from %s to meta.class object",
696 class_name ().c_str ());
697
698 return *this;
699 }
700
701 cdef_method find_method (const std::string& nm, bool local = false); 786 cdef_method find_method (const std::string& nm, bool local = false);
702 787
703 void install_method (const cdef_method& meth) 788 void install_method (const cdef_method& meth)
704 { get_rep ()->install_method (meth); } 789 { get_rep ()->install_method (meth); }
705 790
730 bool is_builtin (void) const 815 bool is_builtin (void) const
731 { return get_directory ().empty (); } 816 { return get_directory ().empty (); }
732 817
733 void delete_object (cdef_object obj) 818 void delete_object (cdef_object obj)
734 { get_rep ()->delete_object (obj); } 819 { get_rep ()->delete_object (obj); }
735
736 octave_value_list subsref_meta (const std::string& type,
737 const std::list<octave_value_list>& idx,
738 int nargout)
739 { return get_rep ()->subsref_meta (type, idx, nargout); }
740 820
741 static cdef_class make_meta_class (tree_classdef* t); 821 static cdef_class make_meta_class (tree_classdef* t);
742 822
743 octave_function* get_method_function (const std::string& nm); 823 octave_function* get_method_function (const std::string& nm);
744 824
809 inline bool 889 inline bool
810 operator < (const cdef_class& clsa, const cdef_class& clsb) 890 operator < (const cdef_class& clsa, const cdef_class& clsb)
811 { return clsa.get_rep () < clsb.get_rep (); } 891 { return clsa.get_rep () < clsb.get_rep (); }
812 892
813 class 893 class
814 cdef_property : public cdef_object 894 cdef_property : public cdef_meta_object
815 { 895 {
816 friend class cdef_class; 896 friend class cdef_class;
817 897
818 private: 898 private:
819 899
820 class 900 class
821 cdef_property_rep : public handle_cdef_object 901 cdef_property_rep : public cdef_meta_object_rep
822 { 902 {
823 public: 903 public:
824 cdef_property_rep (void) 904 cdef_property_rep (void)
825 : handle_cdef_object () { } 905 : cdef_meta_object_rep () { }
826 906
827 cdef_object_rep* copy (void) const { return new cdef_property_rep (*this); } 907 cdef_object_rep* copy (void) const { return new cdef_property_rep (*this); }
828 908
829 bool is_property (void) const { return true; } 909 bool is_property (void) const { return true; }
830 910
849 929
850 bool check_set_access (void) const; 930 bool check_set_access (void) const;
851 931
852 private: 932 private:
853 cdef_property_rep (const cdef_property_rep& p) 933 cdef_property_rep (const cdef_property_rep& p)
854 : handle_cdef_object (p) { } 934 : cdef_meta_object_rep (p) { }
855 935
856 bool is_recursive_set (const cdef_object& obj) const; 936 bool is_recursive_set (const cdef_object& obj) const;
857 937
858 cdef_property wrap (void) 938 cdef_property wrap (void)
859 { 939 {
861 return cdef_property (this); 941 return cdef_property (this);
862 } 942 }
863 }; 943 };
864 944
865 public: 945 public:
866 cdef_property (void) : cdef_object () { } 946 cdef_property (void) : cdef_meta_object () { }
867 947
868 cdef_property (const std::string& nm) 948 cdef_property (const std::string& nm)
869 : cdef_object (new cdef_property_rep ()) 949 : cdef_meta_object (new cdef_property_rep ())
870 { get_rep ()->set_name (nm); } 950 { get_rep ()->set_name (nm); }
871 951
872 cdef_property (const cdef_property& prop) 952 cdef_property (const cdef_property& prop)
873 : cdef_object (prop) { } 953 : cdef_meta_object (prop) { }
874 954
875 cdef_property (const cdef_object& obj) 955 cdef_property (const cdef_object& obj)
876 : cdef_object (obj) 956 : cdef_meta_object (obj)
877 { 957 {
878 // This should never happen... 958 // This should never happen...
879 if (! is_property ()) 959 if (! is_property ())
880 error ("internal error: invalid assignment from %s to meta.property object", 960 error ("internal error: invalid assignment from %s to meta.property object",
881 class_name ().c_str ()); 961 class_name ().c_str ());
918 const cdef_property_rep* get_rep (void) const 998 const cdef_property_rep* get_rep (void) const
919 { return dynamic_cast<const cdef_property_rep *> (cdef_object::get_rep ()); } 999 { return dynamic_cast<const cdef_property_rep *> (cdef_object::get_rep ()); }
920 }; 1000 };
921 1001
922 class 1002 class
923 cdef_method : public cdef_object 1003 cdef_method : public cdef_meta_object
924 { 1004 {
925 friend class cdef_class; 1005 friend class cdef_class;
926 1006
927 private: 1007 private:
928 1008
929 class 1009 class
930 cdef_method_rep : public handle_cdef_object 1010 cdef_method_rep : public cdef_meta_object_rep
931 { 1011 {
932 public: 1012 public:
933 cdef_method_rep (void) : handle_cdef_object () { } 1013 cdef_method_rep (void) : cdef_meta_object_rep () { }
934 1014
935 cdef_object_rep* copy (void) const { return new cdef_method_rep(*this); } 1015 cdef_object_rep* copy (void) const { return new cdef_method_rep(*this); }
936 1016
937 bool is_method (void) const { return true; } 1017 bool is_method (void) const { return true; }
938 1018
959 1039
960 bool is_constructor (void) const; 1040 bool is_constructor (void) const;
961 1041
962 private: 1042 private:
963 cdef_method_rep (const cdef_method_rep& m) 1043 cdef_method_rep (const cdef_method_rep& m)
964 : handle_cdef_object (m), function (m.function) { } 1044 : cdef_meta_object_rep (m), function (m.function) { }
965 1045
966 void check_method (void); 1046 void check_method (void);
967 1047
968 cdef_method wrap (void) 1048 cdef_method wrap (void)
969 { 1049 {
974 private: 1054 private:
975 octave_value function; 1055 octave_value function;
976 }; 1056 };
977 1057
978 public: 1058 public:
979 cdef_method (void) : cdef_object () { } 1059 cdef_method (void) : cdef_meta_object () { }
980 1060
981 cdef_method (const std::string& nm) 1061 cdef_method (const std::string& nm)
982 : cdef_object (new cdef_method_rep ()) 1062 : cdef_meta_object (new cdef_method_rep ())
983 { get_rep ()->set_name (nm); } 1063 { get_rep ()->set_name (nm); }
984 1064
985 cdef_method (const cdef_property& prop) 1065 cdef_method (const cdef_method& meth)
986 : cdef_object (prop) { } 1066 : cdef_meta_object (meth) { }
987 1067
988 cdef_method (const cdef_object& obj) 1068 cdef_method (const cdef_object& obj)
989 : cdef_object (obj) 1069 : cdef_meta_object (obj)
990 { 1070 {
991 // This should never happen... 1071 // This should never happen...
992 if (! is_method ()) 1072 if (! is_method ())
993 error ("internal error: invalid assignment from %s to meta.method object", 1073 error ("internal error: invalid assignment from %s to meta.method object",
994 class_name ().c_str ()); 1074 class_name ().c_str ());
1110 inline cdef_property 1190 inline cdef_property
1111 cdef_class::find_property (const std::string& nm) 1191 cdef_class::find_property (const std::string& nm)
1112 { return get_rep ()->find_property (nm); } 1192 { return get_rep ()->find_property (nm); }
1113 1193
1114 class 1194 class
1115 cdef_package : public cdef_object 1195 cdef_package : public cdef_meta_object
1116 { 1196 {
1117 friend class cdef_class; 1197 friend class cdef_class;
1118 1198
1119 private: 1199 private:
1120 1200
1121 class 1201 class
1122 cdef_package_rep : public handle_cdef_object 1202 cdef_package_rep : public cdef_meta_object_rep
1123 { 1203 {
1124 public: 1204 public:
1125 cdef_package_rep (void) : handle_cdef_object (), member_count (0) { } 1205 cdef_package_rep (void) : cdef_meta_object_rep (), member_count (0) { }
1126 1206
1127 cdef_object_rep* copy (void) const { return new cdef_package_rep (*this); } 1207 cdef_object_rep* copy (void) const { return new cdef_package_rep (*this); }
1128 1208
1129 bool is_package (void) const { return true; } 1209 bool is_package (void) const { return true; }
1130 1210
1177 typedef std::map<std::string, cdef_package>::iterator package_iterator; 1257 typedef std::map<std::string, cdef_package>::iterator package_iterator;
1178 typedef std::map<std::string, cdef_package>::const_iterator package_const_iterator; 1258 typedef std::map<std::string, cdef_package>::const_iterator package_const_iterator;
1179 1259
1180 private: 1260 private:
1181 cdef_package_rep (const cdef_package_rep& p) 1261 cdef_package_rep (const cdef_package_rep& p)
1182 : handle_cdef_object (p), class_map (p.class_map), 1262 : cdef_meta_object_rep (p), class_map (p.class_map),
1183 function_map (p.function_map), package_map (p.package_map), 1263 function_map (p.function_map), package_map (p.package_map),
1184 member_count (p.member_count) { } 1264 member_count (p.member_count) { }
1185 }; 1265 };
1186 1266
1187 public: 1267 public:
1188 cdef_package (void) : cdef_object () { } 1268 cdef_package (void) : cdef_meta_object () { }
1189 1269
1190 cdef_package (const std::string& nm) 1270 cdef_package (const std::string& nm)
1191 : cdef_object (new cdef_package_rep ()) 1271 : cdef_meta_object (new cdef_package_rep ())
1192 { get_rep ()->set_name (nm); } 1272 { get_rep ()->set_name (nm); }
1193 1273
1274 cdef_package (const cdef_package& pack)
1275 : cdef_meta_object (pack) { }
1276
1194 cdef_package (const cdef_object& obj) 1277 cdef_package (const cdef_object& obj)
1195 : cdef_object (obj) 1278 : cdef_meta_object (obj)
1196 { 1279 {
1197 // This should never happen... 1280 // This should never happen...
1198 if (! is_package ()) 1281 if (! is_package ())
1199 error ("internal error: invalid assignment from %s to meta.package object", 1282 error ("internal error: invalid assignment from %s to meta.package object",
1200 class_name ().c_str ()); 1283 class_name ().c_str ());