Changeset 44700


Ignore:
Timestamp:
Apr 21, 2008, 4:40:25 PM (10 years ago)
Author:
matus.chochlik
Message:

Added support for accessing the types and values of inherited class member attributes
Updated support for virtual inheritance (still some minor problems though)
Updated example on virtual inheritance
Updated example on serialization (not finished, yet)

Location:
sandbox/mirror
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • sandbox/mirror/boost/mirror/meta_attribs_base.hpp

    r44690 r44700  
    164164                return context.NAME;\
    165165        }\
    166         static TYPE& query(const the_class& context, mpl::int_<NUMBER>, TYPE& dest)\
    167         {\
    168                 dest = context.NAME;\
     166        template <typename dest_type>\
     167        static dest_type& query(const the_class& context, mpl::int_<NUMBER>, dest_type& dest)\
     168        {\
     169                dest = dest_type(context.NAME);\
    169170                return dest;\
    170171        }
     
    174175#define BOOST_MIRROR_REG_CLASS_ATTRIB_DECL_NO_GETTER(NUMBER, TYPE) \
    175176        static void get(const the_class& context, mpl::int_<NUMBER>){ }\
    176         static void query(const the_class& context, mpl::int_<NUMBER>, TYPE& dest){ }
     177        template <typename dest_type>\
     178        static void query(const the_class& context, mpl::int_<NUMBER>, dest_type& dest){ }
    177179
    178180/** Helper macros
    179181 */
    180182#define BOOST_MIRROR_REG_CLASS_ATTRIB_DECL_SIMPLE_SET(NUMBER, TYPE, NAME) \
    181         static call_traits<TYPE>::param_type set(the_class& context, mpl::int_<NUMBER>, call_traits<TYPE>::param_type val)\
     183        static void set(the_class& context, mpl::int_<NUMBER>, call_traits<TYPE>::param_type val)\
    182184        {\
    183185                context.NAME = val;\
    184                 return val;\
    185186        } \
    186187        static void set(const the_class& context, mpl::int_<NUMBER>, call_traits<TYPE>::param_type val)\
  • sandbox/mirror/boost/mirror/meta_attribs_getset.hpp

    r44508 r44700  
    5151                return const_cast<the_class&>(context).GETTER_NAME(BOOST_PP_LIST_ENUM(BOOST_PP_TUPLE_TO_LIST(ARG_COUNT, GETTER_ARGS_TUPLE)));\
    5252        } \
    53         static TYPE& do_query(the_class& context, mpl::int_<NUMBER>, TYPE& dest, mpl::bool_<true>)\
    54         {\
    55                 dest = context.GETTER_NAME(BOOST_PP_LIST_ENUM(BOOST_PP_TUPLE_TO_LIST(ARG_COUNT, GETTER_ARGS_TUPLE)));\
     53        template <typename dest_type>\
     54        static dest_type& do_query(the_class& context, mpl::int_<NUMBER>, dest_type& dest, mpl::bool_<true>)\
     55        {\
     56                dest = dest_type(context.GETTER_NAME(BOOST_PP_LIST_ENUM(BOOST_PP_TUPLE_TO_LIST(ARG_COUNT, GETTER_ARGS_TUPLE))));\
    5657                return dest;\
    5758        } \
    58         static TYPE& do_query(const the_class& context, mpl::int_<NUMBER>, TYPE& dest, mpl::bool_<function_types::is_member_function_pointer<BOOST_TYPEOF(&the_class::GETTER_NAME), function_types::const_qualified>::value>)\
    59         {\
    60                 dest = const_cast<the_class&>(context).GETTER_NAME(BOOST_PP_LIST_ENUM(BOOST_PP_TUPLE_TO_LIST(ARG_COUNT, GETTER_ARGS_TUPLE)));\
     59        template <typename dest_type>\
     60        static dest_type& do_query(const the_class& context, mpl::int_<NUMBER>, dest_type& dest, mpl::bool_<function_types::is_member_function_pointer<BOOST_TYPEOF(&the_class::GETTER_NAME), function_types::const_qualified>::value>)\
     61        {\
     62                dest = dest_type(const_cast<the_class&>(context).GETTER_NAME(BOOST_PP_LIST_ENUM(BOOST_PP_TUPLE_TO_LIST(ARG_COUNT, GETTER_ARGS_TUPLE))));\
    6163                return dest;\
    6264        } \
     
    6567                return do_get(context, mpl::int_<NUMBER>(), mpl::bool_<true>());\
    6668        }\
    67         template <class a_class> static TYPE& query(a_class& context, mpl::int_<NUMBER>, TYPE& dest)\
     69        template <class a_class, typename dest_type> \
     70        static dest_type& query(a_class& context, mpl::int_<NUMBER>, dest_type& dest)\
    6871        {\
    6972                return do_query(context, mpl::int_<NUMBER>(), dest, mpl::bool_<true>());\
     
    7679 */
    7780#define BOOST_MIRROR_REG_CLASS_ATTRIB_DECL_SETTER_ARGS(NUMBER, TYPE, SETTER_NAME, SETTER_ARGS_TUPLE, ARG_COUNT) \
    78         static call_traits<TYPE>::param_type set(the_class& context, mpl::int_<NUMBER>, call_traits<TYPE>::param_type val)\
     81        static void set(the_class& context, mpl::int_<NUMBER>, call_traits<TYPE>::param_type val)\
    7982        {\
    8083                context.SETTER_NAME(BOOST_PP_LIST_ENUM(BOOST_PP_TUPLE_TO_LIST(ARG_COUNT, SETTER_ARGS_TUPLE)));\
    81                 return val;\
    8284        }
    8385
  • sandbox/mirror/boost/mirror/meta_class.hpp

    r44696 r44700  
    263263                        {
    264264                                typedef typename meta_inheritance::
    265                                                 meta_class meta_class;
    266 
    267                                 typedef typename meta_class::
     265                                                meta_class base_meta_class;
     266
     267                                typedef typename base_meta_class::
    268268                                                attributes::
    269269                                                type_list type_list;
     
    271271                                typedef typename mpl::size<
    272272                                                current_list
    273                                         > offset;
     273                                >::type offset;
    274274                                typedef typename mpl::pair<
    275                                                 meta_class,
     275                                                base_meta_class,
    276276                                                offset         
    277277                                        > pair;
     
    305305                        >::type inherited_attrib_owners_and_offsets;
    306306
    307                        
    308                         /** The count of virtually inherited attributes
    309                          */
    310                         typedef typename mpl::accumulate<
    311                                 typename mpl::transform<
    312                                         virtual_base_class_layout,
    313                                         get_base_class_attrib_type_list<
    314                                                 mpl::_1
    315                                         >
    316                                 >::type,
    317                                 mpl::int_<0>,
    318                                 mpl::plus<
    319                                         mpl::_1,
    320                                         mpl::size< mpl::_2 >
    321                                 >
    322                         >::type virtual_attrib_count;
    323                
    324 
    325                         /** Is a true type if the I-th member attribute is
    326                          *  virtually inherited.
    327                          */
    328                         template <long I>
    329                         struct is_virtually_inherited
    330                         : mpl::less<
    331                                 mpl::int_<I>,
    332                                 virtual_attrib_count
    333                         >::type { };
    334 
    335 
    336 
    337307                        /** This template is used to query the return value
    338308                         *  type of the getter for the I-th member attribute
    339309                         */
    340                         template <long I>
     310                        template <int I>
    341311                        struct result_of_get
    342312                        {
     
    349319               
    350320                        /** This function is used to get the member attributes
    351                          *  base classes.
     321                         *  from the base classes.
    352322                         */
    353                         template <class a_class, long I>
     323                        template <class a_class, int I>
    354324                        static typename result_of_get<I>::type
    355                         get(a_class context, mpl::int_<I> pos)
     325                        get(a_class context, mpl::int_<I> pos, mpl::bool_<true>)
    356326                        {
    357327                                typedef typename mpl::at<
     
    361331
    362332                                typedef typename owner_and_offset::first meta_class;
    363                                 typedef typename mpl::minus<
     333                                typedef typename mpl::int_<mpl::minus<
    364334                                        mpl::int_<I>,
    365335                                        typename owner_and_offset::second
    366                                 >::type new_pos_type;
     336                                >::value> new_pos_type;
    367337
    368338                                return meta_class::attributes::get(context, new_pos_type());
    369339
    370340                        }
     341                        template <class a_class, int I>
     342                        static typename result_of_get<I>::type
     343                        get(a_class context, mpl::int_<I> pos, mpl::bool_<false>)
     344                        {
     345                                typedef typename mpl::int_<mpl::minus<
     346                                        mpl::int_<I>,
     347                                        mpl::size<inherited_member_attrib_type_list>::type
     348                                >::value> new_pos_type;
     349                                return meta_class::attributes::get(context, new_pos_type());
     350                        }
     351
     352               
     353                        /** This function is used to query the member attributes
     354                         *  from the base classes.
     355                         */
     356                        template <class a_class, int I, typename dest_type>
     357                        static dest_type&
     358                        query(a_class context, mpl::int_<I> pos, dest_type& dest, mpl::bool_<true>)
     359                        {
     360                                typedef typename mpl::at<
     361                                        typename detail::inherited_attrib_owners_and_offsets,
     362                                        mpl::int_<I>
     363                                >::type owner_and_offset;
     364
     365                                typedef typename owner_and_offset::first meta_class;
     366                                typedef typename mpl::int_<mpl::minus<
     367                                        mpl::int_<I>,
     368                                        typename owner_and_offset::second
     369                                >::value> new_pos_type;
     370
     371                                return meta_class::attributes::query(context, new_pos_type(), dest);
     372
     373                        }
     374
     375                        template <class a_class, int I, typename dest_type>
     376                        static dest_type&
     377                        query(a_class context, mpl::int_<I> pos, dest_type& dest, mpl::bool_<false>)
     378                        {
     379                                typedef typename mpl::int_<mpl::minus<
     380                                        mpl::int_<I>,
     381                                        mpl::size<inherited_member_attrib_type_list>::type
     382                                >::value> new_pos_type;
     383                                return meta_class::attributes::query(context, new_pos_type(), dest);
     384                        }
     385
     386               
     387                        /** This function is used to query the member attributes
     388                         *  from the base classes.
     389                         */
     390                        template <class a_class, int I, typename value_type>
     391                        static void
     392                        set(a_class& context, mpl::int_<I> pos, value_type value, mpl::bool_<true>)
     393                        {
     394                                typedef typename mpl::at<
     395                                        typename detail::inherited_attrib_owners_and_offsets,
     396                                        mpl::int_<I>
     397                                >::type owner_and_offset;
     398
     399                                typedef typename owner_and_offset::first meta_class;
     400                                typedef typename mpl::int_<mpl::minus<
     401                                        mpl::int_<I>,
     402                                        typename owner_and_offset::second
     403                                >::value> new_pos_type;
     404
     405                                meta_class::attributes::set(context, new_pos_type(), value);
     406                        }
     407
     408                        template <class a_class, int I, typename value_type>
     409                        static void
     410                        set(a_class& context, mpl::int_<I> pos, value_type value, mpl::bool_<false>)
     411                        {
     412                                typedef typename mpl::int_<mpl::minus<
     413                                        mpl::int_<I>,
     414                                        mpl::size<inherited_member_attrib_type_list>::type
     415                                >::value> new_pos_type;
     416                                meta_class::attributes::set(context, new_pos_type(), value);
     417                        }
     418
    371419                }; // struct detail
    372420               
     
    388436                struct size : public mpl::size<type_list> { };
    389437               
    390                 /**
    391                  */
    392                 template <class a_class, long I>
     438                /** Gets the value of the I-th member (including
     439                 *  the inherited ones)
     440                 */
     441                template <class a_class, int I>
    393442                static typename detail::template result_of_get<I>::type
    394443                get(a_class context, mpl::int_<I> pos)
    395444                {
    396                         return detail::get(
    397                                 context,
    398                                 pos
    399                         );
     445                        typedef typename mpl::less<
     446                                mpl::int_<I>,
     447                                inherited_size
     448                        >::type is_inherited;
     449
     450                        return detail::get(context, pos, is_inherited());
    400451                }
    401         }; // all_attrbutes
     452
     453                /** Queries the value of the I-th member (including
     454                 *  the inherited ones)
     455                 */
     456                template <class a_class, int I, typename dest_type>
     457                static dest_type&
     458                query(a_class context, mpl::int_<I> pos, dest_type& dest)
     459                {
     460                        typedef typename mpl::less<
     461                                mpl::int_<I>,
     462                                inherited_size
     463                        >::type is_inherited;
     464
     465                        return detail::query(context, pos, dest, is_inherited());
     466                }
     467
     468                /** Sets the value of the I-th member (including
     469                 *  the inherited ones)
     470                 */
     471                template <class a_class, int I, typename value_type>
     472                static void
     473                set(a_class& context, mpl::int_<I> pos, value_type value)
     474                {
     475                        typedef typename mpl::less<
     476                                mpl::int_<I>,
     477                                inherited_size
     478                        >::type is_inherited;
     479
     480                        detail::set(context, pos, value, is_inherited());
     481                }
     482        }; // all_attributes
    402483
    403484};
  • sandbox/mirror/libs/examples/registering/virtual_bases.cpp

    r44696 r44700  
    256256        t.w = L'0';
    257257        //
    258         bcout << meta_T::all_attributes::get(t, mpl::int_<0>()) << endl;
     258        // the values of all attributes can be accessed via get() ...
     259        //
     260        assert(t.l == meta_T::all_attributes::get(t, mpl::int_<0>()));
     261        assert(t.i == meta_T::all_attributes::get(t, mpl::int_<1>()));
     262        assert(t.d == meta_T::all_attributes::get(t, mpl::int_<2>()));
     263        assert(t.s == meta_T::all_attributes::get(t, mpl::int_<3>()));
     264        assert(t.f == meta_T::all_attributes::get(t, mpl::int_<4>()));
     265        assert(t.b == meta_T::all_attributes::get(t, mpl::int_<5>()));
     266        assert(t.c == meta_T::all_attributes::get(t, mpl::int_<6>()));
     267        assert(t.w == meta_T::all_attributes::get(t, mpl::int_<7>()));
     268        //
     269        // ... they can be queried using query()  ...
     270        //
     271        int dest_for_f = 0;
     272        assert(int(t.f) == meta_T::all_attributes::query(t, mpl::int_<4>(), dest_for_f));
     273        wchar_t dest_for_w = L'1';
     274        assert(t.w == meta_T::all_attributes::query(t, mpl::int_<7>(), dest_for_w));
     275        //
     276        // ... and set
     277        //
     278        meta_T::all_attributes::set(t, mpl::int_<0>(), 2345L);
     279        assert(t.l == 2345L);
     280        meta_T::all_attributes::set(t, mpl::int_<2>(), 456.7);
     281        assert(t.d == 456.7);
     282        meta_T::all_attributes::set(t, mpl::int_<4>(), 789.0f);
     283        assert(t.f == 789.0f);
     284        meta_T::all_attributes::set(t, mpl::int_<5>(), false);
     285        assert(t.b == false);
     286        meta_T::all_attributes::set(t, mpl::int_<7>(), L'A');
     287        assert(t.w == L'A');
    259288        //
    260289        bcout << "--------------------------------------------" << endl;
    261         //
    262         bcout << meta_T::all_attributes::detail::is_virtually_inherited<4>::value << endl;
    263         bcout << meta_T::all_attributes::detail::is_virtually_inherited<5>::value << endl;
    264         //
    265290        //
    266291        return 0;
  • sandbox/mirror/libs/examples/serialization/cube.cpp

    r44690 r44700  
    2020#include <boost/mpl/size.hpp>
    2121#include <boost/mpl/at.hpp>
     22
     23#include <fstream>
     24#include <boost/archive/xml_iarchive.hpp>
     25#include <boost/archive/xml_oarchive.hpp>
    2226
    2327#include <boost/char_type_switch/iostream.hpp>
     
    8387        };
    8488
     89        // a cube
     90        class Cube
     91        {
     92        public:
     93                typedef Vector::float_type float_type;
     94                //
     95                Cube(float_type _width = 1.0f, float_type _height = 1.0f, float_type _depth = 1.0f)
     96                        : lbb(-_width/2.0f, -_height/2.0f, -_depth/2.0f)
     97                        , lbf(-_width/2.0f, -_height/2.0f,  _depth/2.0f)
     98                        , ltb(-_width/2.0f,  _height/2.0f, -_depth/2.0f)
     99                        , ltf(-_width/2.0f,  _height/2.0f,  _depth/2.0f)
     100                        , rbb( _width/2.0f, -_height/2.0f, -_depth/2.0f)
     101                        , rbf( _width/2.0f, -_height/2.0f,  _depth/2.0f)
     102                        , rtb( _width/2.0f,  _height/2.0f, -_depth/2.0f)
     103                        , rtf( _width/2.0f,  _height/2.0f,  _depth/2.0f)
     104                { }
     105        private:
     106                // left-bottom-back
     107                Vector lbb;
     108                // left-bottom-front
     109                Vector lbf;
     110                // left-top-back
     111                Vector ltb;
     112                // left-top-front
     113                Vector ltf;
     114                // right-bottom-back
     115                Vector rbb;
     116                // right-bottom-front
     117                Vector rbf;
     118                // right-top-back
     119                Vector rtb;
     120                // right-top-front
     121                Vector rtf;
     122        };
     123
    85124} // namespace Graphics
    86125
     
    139178BOOST_MIRROR_REG_CLASS_ATTRIBS_END
    140179
     180/** Support for serialization
     181 */
     182
     183template <class Class>
     184struct to_be_loaded
     185{
     186        to_be_loaded(Class& _inst):inst(_inst){ }
     187        Class& inst;
     188};
     189
     190template <class Class>
     191struct to_be_saved
     192{
     193        to_be_saved(const Class& _inst):inst(_inst){ }
     194        const Class& inst;
     195};
     196
     197template<class Archive, class Class>
     198void load(Archive & ar, Class & c, const unsigned int version)
     199{
     200        typedef BOOST_MIRROR_REFLECT_CLASS(Class) meta_Class;
     201}
     202
     203template<class Archive, class Class>
     204void save(Archive & ar, const Class & c, const unsigned int version)
     205{
     206        typedef BOOST_MIRROR_REFLECT_CLASS(Class) meta_Class;
     207}
     208
    141209
    142210} // namespace mirror
     211
     212namespace serialization {
     213
     214template<class Archive, class Class>
     215void serialize(Archive & ar, mirror::to_be_saved<Class> dst, const unsigned int version)
     216{
     217        mirror::save(ar, dst.inst, version);
     218}
     219
     220template<class Archive, class Class>
     221void serialize(Archive & ar, mirror::to_be_loaded<Class> src, const unsigned int version)
     222{
     223        mirror::load(ar, src.inst, version);
     224}
     225
     226
     227} // namespace serialization
    143228} // namespace boost
    144229
     
    151236        using ::Graphics::Coords;
    152237        using ::Graphics::Vector;
    153         //
    154         typedef BOOST_MIRROR_REFLECT_CLASS(Vector) meta_Vector;
    155         //
    156         bcout << meta_Vector::base_classes::size::value << endl;
    157         bcout << meta_Vector::attributes::size::value << endl;
    158         //bcout << meta_Vector::all_attributes::size::value << endl;
     238        using ::Graphics::Cube;
     239        //
     240        Cube c1(2.0f, 2.0f, 2.0f), c2;
     241        //
     242        boost::archive::xml_oarchive oa(cout);
     243        //
     244        oa << BOOST_SERIALIZATION_NVP(to_be_saved<Cube>(c1));
    159245        //
    160246        //
Note: See TracChangeset for help on using the changeset viewer.