Boost logo

Boost-Commit :

From: chochlik_at_[hidden]
Date: 2008-07-09 13:58:06


Author: matus.chochlik
Date: 2008-07-09 13:58:05 EDT (Wed, 09 Jul 2008)
New Revision: 47275
URL: http://svn.boost.org/trac/boost/changeset/47275

Log:
- Added several comments to the examples
- The query-meta-functions do not need to and should not return the 'dest' reference anymore, this was rewritten to work automatically

Text files modified:
   sandbox/mirror/boost/mirror/detail/meta_attribs_base.hpp | 8 +-
   sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml | 5 +
   sandbox/mirror/libs/mirror/example/registering/classes.cpp | 93 +++++++++++++++++++++++++++++++++++----
   sandbox/mirror/libs/mirror/example/registering/namespaces.cpp | 2
   sandbox/mirror/libs/mirror/example/registering/types.cpp | 10 +--
   5 files changed, 96 insertions(+), 22 deletions(-)

Modified: sandbox/mirror/boost/mirror/detail/meta_attribs_base.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/detail/meta_attribs_base.hpp (original)
+++ sandbox/mirror/boost/mirror/detail/meta_attribs_base.hpp 2008-07-09 13:58:05 EDT (Wed, 09 Jul 2008)
@@ -206,7 +206,7 @@
                 const Class& instance, \
                 position_of_##NAME, \
                 DestType& dest \
- ) QUERY_BODY
+ ) { QUERY_BODY return dest;}
 
  /** Helper macro expanding into the declaraion of setter
  * function of the meta-attribute
@@ -347,7 +347,7 @@
 ) BOOST_MIRROR_REG_TEMPLATE_OR_CLASS_ATTRIB( \
                 SPECIFIERS, TYPE_SELECTOR, NAME, \
                 {return instance.NAME;}, \
- {dest = DestType(instance.NAME); return dest;}, \
+ {dest = DestType(instance.NAME);}, \
                 {instance.NAME = value;}, \
                 TYPENAME_KW \
         )
@@ -398,7 +398,7 @@
 ) BOOST_MIRROR_REG_TEMPLATE_OR_CLASS_ATTRIB( \
                 SPECIFIERS, TYPE_SELECTOR, NAME, \
                 {return instance.GETTER_CALL;}, \
- {dest = DestType(instance.GETTER_CALL); return dest;}, \
+ {dest = DestType(instance.GETTER_CALL);}, \
                 {instance.SETTER_CALL;}, \
                 TYPENAME_KW \
         )
@@ -480,7 +480,7 @@
                 TYPE_SELECTOR, \
                 NAME, \
                 {return instance.NAME;}, \
- {dest = DestType(instance.NAME); return dest;}, \
+ {dest = DestType(instance.NAME);}, \
                 {instance.NAME = value;}, \
                 BOOST_PP_EMPTY() \
         )

Modified: sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml
==============================================================================
--- sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml (original)
+++ sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml 2008-07-09 13:58:05 EDT (Wed, 09 Jul 2008)
@@ -275,7 +275,10 @@
                         - Tested with intel 10.1 on SuSE (fails with some examples)
                 </revision>
                 <revision id="20080709" major="0" minor="2" micro="1" author="m_ch">
- - The name_to_string utility has been removed meta_object's base_name and full_name member functions are to be used instead.
+ - Added support for types derived from a typedef-ined type
+ - The name_to_string utility has been removed meta_object's base_name and full_name member functions are to be used instead
+ - Added several comments to the examples
+ - The query-meta-functions do not need to and should not return the 'dest' reference anymore, this was rewritten to work automatically
                 </revision>
         </revisions>
 </library>

Modified: sandbox/mirror/libs/mirror/example/registering/classes.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/registering/classes.cpp (original)
+++ sandbox/mirror/libs/mirror/example/registering/classes.cpp 2008-07-09 13:58:05 EDT (Wed, 09 Jul 2008)
@@ -34,7 +34,6 @@
 
 /** First declare some namespaces and classes
  */
-
 namespace test {
 namespace feature {
 namespace detail {
@@ -59,6 +58,8 @@
         // This line allows mirror to access non-public
         // class members
         BOOST_MIRROR_FRIENDLY_CLASS(bar_base)
+
+ // declare some members
         int an_int;
         long a_long;
 };
@@ -166,7 +167,24 @@
 /** Class attributes
  */
 // register the attributes of bar_base
-BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::test::stuff::detail::bar_base)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::test::stuff::detail::bar_base)
+ //
+ // this is a macro for registering simple attributes without any
+ // without getter a or a setter function
+ //
+ // the first argument is the storage class specifier.
+ // it can have these three values:
+ // _ - for non static nor mutable member attributes
+ // static - for static attribs
+ // mutable - for mutable attribs
+ //
+ // the second argument is the type of the attribute
+ //
+ // the third argument is the name of the argument
+ //
+ // this macro can be used if the attribute is public
+ // or the class has been declared to include the
+ // BOOST_MIRROR_FRIENDLY_CLASS(...) macro
         BOOST_MIRROR_REG_SIMPLE_CLASS_ATTRIB(_, int, an_int)
         BOOST_MIRROR_REG_SIMPLE_CLASS_ATTRIB(_, long, a_long)
 BOOST_MIRROR_REG_CLASS_ATTRIBS_END
@@ -178,47 +196,99 @@
         BOOST_MIRROR_REG_SIMPLE_CLASS_ATTRIB(_, double, a_double)
         //
         // this 'virtual' attribute has only a getter (cannot be set)
+ //
+ // this is a more general registering macro that allows to specify
+ // how to get, query and set the value of an attribute
+ //
+ // the first three arguments are the same as with
+ // BOOST_MIRROR_REG_SIMPLE_CLASS_ATTRIB(...) macro
+ //
+ // The fourth argument is the body of a meta-getter function.
+ // Basically it should be wrapped in curly braces
+ // and contain a return statement returning the value of the attribute.
+ // There are several types and variables accessible in the body of
+ // the function:
+ // - Class = the type of the class to which the attribute belongs
+ // - instance = a const reference to the instance of the class
+ // to which the attribute belongs
+ //
+ // The fifth argument is the body of a meta-query function
+ // This function should assign the value of the argument to the
+ // passed reference
+ // Again there are several types and variables that can be referenced
+ // in the body of the function:
+ // - Class = the type of the class to which the attribute belongs
+ // - DestType = the type of the reference to which the attribute's
+ // value is going to be assigned
+ // - instance = a const reference to the instance of the class
+ // to which the attribute belongs
+ // - dest = a reference to a variable where the value of the attribute
+ // should be assigned.
+ //
+ // The sixth argument is a meta-setter function
+ // This function should assign the passed value to the attribute
+ //
+ // There are several types and variables that can be referenced
+ // in the body of the function:
+ // - Class = the type of the class to which the attribute belongs
+ // - instance = a const reference to the instance of the class
+ // to which the attribute belongs
+ // - value = the value that should be assigned to the attribute
+ // directly or by the means of a setter function
         BOOST_MIRROR_REG_CLASS_ATTRIB(
                 _, int, a_ro_val,
                 {return instance.get_ro_val();},
- {dest = DestType(instance.get_ro_val()); return dest;},
- { }
+ {dest = DestType(instance.get_ro_val());},
+ { } // no setting
         )
         // this 'virtual' attribute has only a setter (cannot be queried)
         BOOST_MIRROR_REG_CLASS_ATTRIB(
                 _, int, a_wo_val,
- {return 0;},
- {return dest;},
+ {return 0;}, // get a dummy value
+ { }, // do not query the value
                 {instance.set_wo_val(value);}
         )
         //
         // this is an attrib that has no getter but has a setter function
         // NOTE that the type of this attribute is typedef'd
+ //
+ // When registering attributes that have typedef-ined types
+ // the BOOST_MIRROR_TYPEDEF(namespace, typedef'd type)
+ // to notify mirror that the type was typedefined
+ // The typedef must be registered with mirror prior doing this
         BOOST_MIRROR_REG_CLASS_ATTRIB(
                 _, BOOST_MIRROR_TYPEDEF(::boost, bstring), a_string,
                 {return instance.a_string;},
- {dest = DestType(instance.a_string); return dest;},
+ {dest = DestType(instance.a_string);},
                 {instance.set_string(value);}
         )
         // another typedefd attribute
+ //
+ // The types of attributes can also be types derived from a typedef'd
+ // type. Such types are again referred to by the BOOST_MIRROR_TYPEDEF
+ // macro
         BOOST_MIRROR_REG_CLASS_ATTRIB(
                 static, const BOOST_MIRROR_TYPEDEF(::boost, bchar) * (*)(int), a_function,
                 {return instance.a_function;},
- {dest = DestType(instance.a_function); return dest;},
+ {dest = DestType(instance.a_function);},
                 { } // no setter
         )
         //
- // and the last one is accessed by the means of a pair of getter/setter functions
+ // this attribute is accessed by the means of a pair of getter/setter functions
+ //
+ // note that is the getter function is not const a const_cast is necessary
         BOOST_MIRROR_REG_CLASS_ATTRIB(
                 _, bool, a_bool,
                 {return const_cast<Class&>(instance).get_bool();},
- {dest = DestType(const_cast<Class&>(instance).get_bool()); return dest;},
+ {dest = DestType(const_cast<Class&>(instance).get_bool());},
                 {instance.set_bool(value);}
         )
         //
         // register a static member attribute
+ // instead of the '_', the keyword 'static' is used
         BOOST_MIRROR_REG_SIMPLE_CLASS_ATTRIB(static, short, a_short)
         // register a mutable member attribute
+ // instead of the '_', the keyword 'mutable' is used
         BOOST_MIRROR_REG_SIMPLE_CLASS_ATTRIB(mutable, wchar_t, a_widechar)
 BOOST_MIRROR_REG_CLASS_ATTRIBS_END
 
@@ -405,7 +475,10 @@
         //
         // pointer to native type
         bcout << "|01| " << endl << pretty_printer<BOOST_MIRRORED_TYPE(double*)>() << endl;
+ //
         // a class defined in a namespace
+ // classes are reflected using the BOOST_MIRRORED_CLASS(Class) macro
+ // this macro expands into a meta_class specialization
         bcout << "|02| " << endl << pretty_printer<BOOST_MIRRORED_CLASS(foo)>() << endl;
         bcout << "|03| " << endl << pretty_printer<BOOST_MIRRORED_CLASS(bar)>() << endl;
         // an embedded class

Modified: sandbox/mirror/libs/mirror/example/registering/namespaces.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/registering/namespaces.cpp (original)
+++ sandbox/mirror/libs/mirror/example/registering/namespaces.cpp 2008-07-09 13:58:05 EDT (Wed, 09 Jul 2008)
@@ -62,7 +62,7 @@
         // meta_namespace<> specialization for the given namespace
         //
         // define an alternative name for the global scope meta-namespace
- // BOOST_MIRRORED_NAMESPACE(::) is equivalent to this
+ // BOOST_MIRRORED_NAMESPACE_GS is equivalent to this
         typedef BOOST_MIRRORED_GLOBAL_SCOPE() meta_ns_global_scope;
 
         // define an alternative name for the ::test namespace meta-data

Modified: sandbox/mirror/libs/mirror/example/registering/types.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/registering/types.cpp (original)
+++ sandbox/mirror/libs/mirror/example/registering/types.cpp 2008-07-09 13:58:05 EDT (Wed, 09 Jul 2008)
@@ -93,13 +93,12 @@
         typedef BOOST_MIRRORED_TYPE(foo) meta_foo;
         typedef BOOST_MIRRORED_TYPE(bar) meta_bar;
         //
- // put the full name of the type to the output stream
- //
+ // write the full name of the type to the output stream
         bcout << "|00| " << BOOST_MIRRORED_TYPE(int) ::full_name() << endl;
         bcout << "|01| " << BOOST_MIRRORED_TYPE(foo) ::full_name() << endl;
         bcout << "|02| " << BOOST_MIRRORED_TYPE(bar) ::full_name() << endl;
         //
- // Do the same thing with the typedef'd type
+ // Do the same thing with the typedef'd meta-type
         bcout << "|03| " << meta_foo ::full_name() << endl;
         bcout << "|04| " << meta_bar ::full_name() << endl;
 
@@ -111,7 +110,6 @@
         bcout << "|08| " << BOOST_MIRRORED_TYPE(bar**&) ::full_name() << endl;
         bcout << "|09| " << BOOST_MIRRORED_TYPE(const foo**)::full_name() << endl;
         bcout << "|10| " << BOOST_MIRRORED_TYPE(volatile bar*&)::full_name() << endl;
- //
         bcout << "|11| " << BOOST_MIRRORED_TYPE(const volatile foo)::full_name() << endl;
         bcout << "|12| " << BOOST_MIRRORED_TYPE(const volatile bar*)::full_name() << endl;
         //
@@ -137,8 +135,8 @@
         typedef BOOST_MIRRORED_TYPEDEF(::boost, bchar) meta_bchar_td;
         // this reflects the meta-type for the typedef type foobar
         typedef BOOST_MIRRORED_TYPEDEF(::test::feature::detail, foobar) meta_foobar_td;
-
- //
+ //
+ // use the typedefined meta-types
         bcout << "|19| " << meta_bchar ::full_name() << endl;
         bcout << "|20| " << meta_bchar_td ::full_name() << endl;
         bcout << "|21| " << meta_foobar_td ::full_name() << endl;


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk