# HG changeset patch # User Michael Goffioul # Date 1411955031 14400 # Node ID e0a7718ac085c1f0f7d73aa09b1bc138357c2ce1 # Parent 666c4e0aca1e692b4638c2aaea691481ea8778f3 Implement calling "struct" on classdef objects. * ov-classdef.h (cdef_object::map_value, octave_classdef::map_value): New methods. (cdef_class::get_properties, cdef_class::cdef_class_rep::get_properties, cdef_class::cdef_class_rep::find_properties): Change signature to include an int argument "mode". (cdef_class::get_property_map, cdef_class::cdef_class_rep::get_property_map): New methods. (class cdef_class): New enum to hold possible values of mode argument for method get_properties/get_property_map. (cdef_object_rep::map_keys): Code style. * ov-classdef.cc (cdef_class::cdef_class_rep::find_properties): Change signature to include an int argument "mode". (cdef_class::cdef_class_rep::get_properties): Likewise. Use get_property_map instead of find_properties. (cdef_class::cdef_class_rep::get_property_map): New method. (cdef_object::map_value): Likewise. diff -r 666c4e0aca1e -r e0a7718ac085 libinterp/octave-value/ov-classdef.cc --- a/libinterp/octave-value/ov-classdef.cc Sun Sep 28 12:55:03 2014 -0700 +++ b/libinterp/octave-value/ov-classdef.cc Sun Sep 28 21:43:51 2014 -0400 @@ -1330,6 +1330,63 @@ //---------------------------------------------------------------------------- +octave_map +cdef_object::map_value (void) const +{ + octave_map retval; + + warning_with_id ("Octave:classdef-to-struct", + "struct: converting a classdef object into a struct " + "overrides the access restrictions defined for properties. " + "All properties are returned, including private and " + "protected ones."); + + cdef_class cls = get_class (); + + if (cls.ok ()) + { + std::map props; + + props = cls.get_property_map (cdef_class::property_all); + + for (std::map::iterator it = props.begin (); + it != props.end (); ++it) + { + octave_value pvalue; + + if (is_array ()) + { + Array a_obj = array_value (); + + Cell cvalue (a_obj.dims ()); + + for (octave_idx_type i = 0; i < a_obj.numel (); i++) + { + cvalue (i) = it->second.get_value (a_obj(i), false); + + if (error_state) + break; + } + + if (! error_state) + retval.setfield (it->first, cvalue); + } + else + { + Cell cvalue (dim_vector (1, 1), it->second.get_value (*this, false)); + + if (! error_state) + retval.setfield (it->first, cvalue); + } + + if (error_state) + break; + } + } + + return retval; +} + string_vector cdef_object_rep::map_keys (void) const { @@ -2218,11 +2275,11 @@ } Cell -cdef_class::cdef_class_rep::get_properties (void) +cdef_class::cdef_class_rep::get_properties (int mode) { std::map props; - find_properties (props, false); + props = get_property_map (mode); if (! error_state) { @@ -2240,9 +2297,19 @@ return Cell (); } +std::map +cdef_class::cdef_class_rep::get_property_map (int mode) +{ + std::map props; + + find_properties (props, mode); + + return props; +} + void cdef_class::cdef_class_rep::find_properties (std::map& props, - bool only_inherited) + int mode) { property_const_iterator it; @@ -2253,7 +2320,7 @@ if (props.find (nm) == props.end ()) { - if (only_inherited) + if (mode == property_inherited) { octave_value acc = it->second.get ("GetAccess"); @@ -2275,7 +2342,10 @@ cdef_class cls = lookup_class (super_classes(i)); if (! error_state) - cls.get_rep ()->find_properties (props, true); + cls.get_rep ()->find_properties (props, + (mode == property_all ? + property_all : + property_inherited)); else break; } diff -r 666c4e0aca1e -r e0a7718ac085 libinterp/octave-value/ov-classdef.h --- a/libinterp/octave-value/ov-classdef.h Sun Sep 28 12:55:03 2014 -0700 +++ b/libinterp/octave-value/ov-classdef.h Sun Sep 28 21:43:51 2014 -0400 @@ -122,7 +122,7 @@ return octave_value (); } - virtual string_vector map_keys(void) const; + virtual string_vector map_keys (void) const; virtual bool is_valid (void) const { return false; } @@ -270,6 +270,8 @@ string_vector map_keys (void) const { return rep->map_keys (); } + octave_map map_value (void) const; + const cdef_object_rep* get_rep (void) const { return rep; } bool ok (void) const { return rep->is_valid (); } @@ -646,7 +648,9 @@ void install_property (const cdef_property& prop); - Cell get_properties (void); + Cell get_properties (int mode); + + std::map get_property_map (int mode); string_vector get_names (void); @@ -708,7 +712,7 @@ void find_names (std::set& names, bool all); void find_properties (std::map& props, - bool only_inherited); + int mode = 0); void find_methods (std::map& meths, bool only_inherited); @@ -804,7 +808,12 @@ void install_property (const cdef_property& prop) { get_rep ()->install_property (prop); } - Cell get_properties (void) { return get_rep ()->get_properties (); } + Cell get_properties (int mode = property_normal) + { return get_rep ()->get_properties (mode); } + + std::map + get_property_map (int mode = property_normal) + { return get_rep ()->get_property_map (mode); } string_vector get_names (void) { return get_rep ()->get_names (); } @@ -866,6 +875,14 @@ void unregister_object (void) { get_rep ()->unregister_object (); } +public: + enum + { + property_normal, + property_inherited, + property_all + }; + private: cdef_class_rep* get_rep (void) { return dynamic_cast (cdef_object::get_rep ()); } @@ -1452,6 +1469,8 @@ string_vector map_keys (void) const { return object.map_keys (); } + octave_map map_value (void) const { return object.map_value (); } + dim_vector dims (void) const { return object.dims (); } private: