Boost logo

Boost-Commit :

From: chochlik_at_[hidden]
Date: 2008-07-15 09:46:41


Author: matus.chochlik
Date: 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
New Revision: 47442
URL: http://svn.boost.org/trac/boost/changeset/47442

Log:
[mirror 0.2.x]
- Documentation update
Added:
   sandbox/mirror/libs/mirror/doc/samples/meta_namespace_ancestors_01.xml (contents, props changed)
   sandbox/mirror/libs/mirror/doc/samples/meta_namespace_ancestors_02.xml (contents, props changed)
   sandbox/mirror/libs/mirror/doc/samples/usage_meta_namespace_01.xml (contents, props changed)
   sandbox/mirror/libs/mirror/doc/samples/usage_meta_namespace_02.xml (contents, props changed)
   sandbox/mirror/libs/mirror/doc/samples/usage_meta_type_03.xml (contents, props changed)
Text files modified:
   sandbox/mirror/boost/mirror/meta_data_fwd.hpp | 10 ++
   sandbox/mirror/boost/mirror/meta_types/_native.hpp | 2
   sandbox/mirror/doc/html/boost/mirror/meta_class.html | 8 +-
   sandbox/mirror/doc/html/boost/mirror/meta_namespace.html | 142 +++++++++++++++++++++++++++++++++++----
   sandbox/mirror/doc/html/boost/mirror/meta_type.html | 108 ++++++++++++++++++++++++-----
   sandbox/mirror/doc/html/index.html | 2
   sandbox/mirror/doc/html/mirror.html | 2
   sandbox/mirror/libs/mirror/doc/reference/meta_namespace.xml | 70 +++++++++----------
   sandbox/mirror/libs/mirror/doc/reference/meta_type.xml | 14 +++
   sandbox/mirror/libs/mirror/doc/samples/usage_meta_type_02.xml | 33 ++++++--
   10 files changed, 302 insertions(+), 89 deletions(-)

Modified: sandbox/mirror/boost/mirror/meta_data_fwd.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_data_fwd.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_data_fwd.hpp 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -61,6 +61,16 @@
         ::boost::mirror::meta_type<TYPE>
 
 /** Macro that expands into the meta_type for the
+ * given type or class. This is an alternate version
+ * of the BOOST_MIRRORED_TYPE taking the namespace
+ * and the type separatelly as two distinct args
+ * (thus the _NS suffix). It works however only
+ * with types defined in named namespaces.
+ */
+#define BOOST_MIRRORED_TYPE_NS(NAMESPACE, TYPE) \
+ ::boost::mirror::meta_type<NAMESPACE :: TYPE>
+
+/** Macro that expands into the meta_type for the
  * given typedefined type.
  */
 #define BOOST_MIRRORED_TYPEDEF(NAMESPACE, TYPEDEF) \

Modified: sandbox/mirror/boost/mirror/meta_types/_native.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/_native.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/_native.hpp 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -37,6 +37,8 @@
 BOOST_MIRROR_REG_TYPE_GLOBAL_SCOPE(float)
 BOOST_MIRROR_REG_TYPE_GLOBAL_SCOPE(double)
 
+BOOST_MIRROR_REG_TYPEDEF(::std, size_t)
+
 } // namespace mirror
 } // namespace boost
 

Modified: sandbox/mirror/doc/html/boost/mirror/meta_class.html
==============================================================================
--- sandbox/mirror/doc/html/boost/mirror/meta_class.html (original)
+++ sandbox/mirror/doc/html/boost/mirror/meta_class.html 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -43,16 +43,16 @@
                                         </em></span>
 {
 <span class="bold"><strong>public</strong></span>:
- <span class="emphasis"><em>// <a class="link" href="meta_class.html#id495310-bbtypes">types</a></em></span>
+ <span class="emphasis"><em>// <a class="link" href="meta_class.html#id459098-bbtypes">types</a></em></span>
   <span class="bold"><strong>typedef</strong></span> <span class="emphasis"><em>unspecified</em></span> <a class="link" href="meta_class.html#boost.mirror.meta_class.base_classes">base_classes</a>;
   <span class="bold"><strong>typedef</strong></span> <span class="emphasis"><em>unspecified</em></span> <a class="link" href="meta_class.html#boost.mirror.meta_class.attributes">attributes</a>;
   <span class="bold"><strong>typedef</strong></span> <span class="emphasis"><em>unspecified</em></span> <a class="link" href="meta_class.html#boost.mirror.meta_class.all_attributes">all_attributes</a>;
 };</pre></div>
 <div class="refsect1" lang="en">
-<a name="id671795"></a><h2>Description</h2>
+<a name="id706902"></a><h2>Description</h2>
 <div class="refsect2" lang="en">
-<a name="id671798"></a><h3>
-<a name="id495310-bbtypes"></a><code class="computeroutput">meta_class</code> public types</h3>
+<a name="id706906"></a><h3>
+<a name="id459098-bbtypes"></a><code class="computeroutput">meta_class</code> public types</h3>
 <div class="orderedlist"><ol type="1">
 <li>
 <p>

Modified: sandbox/mirror/doc/html/boost/mirror/meta_namespace.html
==============================================================================
--- sandbox/mirror/doc/html/boost/mirror/meta_namespace.html (original)
+++ sandbox/mirror/doc/html/boost/mirror/meta_namespace.html 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -37,7 +37,7 @@
                                 namespace (with the exception of the global scope) use the reflection
                                 macro <code class="computeroutput">BOOST_MIRRORED_NAMESPACE(FULL_NAMESPACE_NAME)</code>. To
                                 get the <code class="computeroutput">meta_namespace</code> specialization for
- the global scope use the <code class="computeroutput">BOOST_MIRRORED_NAMESPACE()</code>
+ the global scope use the <code class="computeroutput">BOOST_MIRRORED_GLOBAL_SCOPE()</code>
                                 macro.
                                 </p>
 </div>
@@ -45,19 +45,130 @@
 <div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> NamespacePlaceholder&gt;
 <span class="bold"><strong>class</strong></span> <a class="link" href="meta_namespace.html" title="Class template meta_namespace">meta_namespace</a> {
 <span class="bold"><strong>public</strong></span>:
- <span class="emphasis"><em>// <a class="link" href="meta_namespace.html#id496123-bbtypes">types</a></em></span>
+ <span class="emphasis"><em>// <a class="link" href="meta_namespace.html#id459983-bbtypes">types</a></em></span>
   <span class="bold"><strong>typedef</strong></span> <span class="emphasis"><em>unspecified</em></span> <a class="link" href="meta_namespace.html#boost.mirror.meta_namespace.scope">scope</a>;
   <span class="bold"><strong>typedef</strong></span> <span class="emphasis"><em>unspecified</em></span> <a class="link" href="meta_namespace.html#boost.mirror.meta_namespace.ancestors">ancestors</a>;
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_namespace.html#id496009-bb">base_name</a>();
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_namespace.html#id495967-bb">full_name</a>();
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_namespace.html#id459860-bb">base_name</a>();
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_namespace.html#id459818-bb">full_name</a>();
   <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>bool</strong></span> FullName&gt;
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_namespace.html#id495913-bb">get_name</a>(::boost::mpl::bool_&lt;FullName&gt;);
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_namespace.html#id459764-bb">get_name</a>(::boost::mpl::bool_&lt;FullName&gt;);
 };</pre></div>
 <div class="refsect1" lang="en">
-<a name="id670751"></a><h2>Description</h2>
+<a name="id705703"></a><h2>Description</h2>
+<p>The specializations of <code class="computeroutput">meta_type</code> can
+ be used to get meta-information about the reflected types, some at compile-time and some at run-time.
+ The following examples show type reflection and basic
+ <code class="computeroutput">meta_type</code> usage. Mirror works with the native C++ types
+ and some of the very common types like <code class="computeroutput">::std::string</code>, etc. out of the box.
+ Meta-types for many other types from the standard library and Boost
+ are also provided and can be <code class="computeroutput">#include</code>d when necessary.
+ </p>
+<div class="section" lang="en">
+<div class="titlepage"></div>
+<div class="toc"><dl>
+<dt><span class="section">Example - Basic usage</span></dt>
+<dt><span class="section">Example - Scope and ancestors</span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="mirror.meta_namespace.reference.sample01"></a>Example - Basic usage</h6></div></div></div>
+<p>This sample code shows how to reflect a namespace and how to get its
+ base and full name.
+ </p>
+<a name="mirror.reference.sample.meta_namespace.usage01"></a><pre class="programlisting">
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
+#include &lt;boost/mirror/meta_namespace.hpp&gt;
+
+int main(void)
+{
+ using namespace ::std;
+ using namespace ::boost;
+ using namespace ::boost::mirror;
+ cts::bostream&amp; bcout = cts::bcout();
+
+ // several namespaces are pre-registered
+ bcout &lt;&lt; BOOST_MIRRORED_GLOBAL_SCOPE() ::base_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::std) ::base_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost) ::base_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost::mirror) ::base_name() &lt;&lt; endl;
+ //
+ bcout &lt;&lt; BOOST_MIRRORED_GLOBAL_SCOPE() ::full_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::std) ::full_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost) ::full_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost::mirror) ::full_name() &lt;&lt; endl;
+
+ return 0;
+}
+</pre>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="mirror.meta_namespace.reference.sample02"></a>Example - Scope and ancestors</h6></div></div></div>
+<p>The following example shows what can be done with the
+ <code class="computeroutput">meta_namespace</code>s <code class="computeroutput">scope</code> and
+ <code class="computeroutput">ancestors</code> <code class="computeroutput">typedef</code>s. It also shows the usage
+ of the <code class="computeroutput">reflects_global_scope</code> trait
+ template.
+ </p>
+<a name="mirror.reference.sample.meta_namespace.usage02"></a><pre class="programlisting">
+#include &lt;boost/mpl/for_each.hpp&gt;
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
+#include &lt;boost/mirror/meta_namespace.hpp&gt;
+#include &lt;boost/mirror/traits/reflects_global_scope.hpp&gt;
+
+class printer
+{
+public:
+ template &lt;class MetaNamespace&gt;
+ void operator()(MetaNamespace mn)
+ {
+ using namespace ::std;
+ using namespace ::boost;
+ cts::bostream&amp; bcout = cts::bcout();
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("ancestor ") &lt;&lt;
+ ctr++ &lt;&lt;
+ BOOST_CTS_LIT(": '") &lt;&lt;
+ MetaNamespace::base_name() &lt;&lt;
+ BOOST_CTS_LIT("'") &lt;&lt;
+ endl;
+ }
+
+ printer(void):ctr(0){ }
+private:
+ int ctr;
+};
+
+int main(void)
+{
+ using namespace ::std;
+ using namespace ::boost;
+ using namespace ::boost::mirror;
+ cts::bostream&amp; bcout = cts::bcout();
+ //
+ typedef BOOST_MIRRORED_NAMESPACE(::boost::mirror) meta_boost_mirror;
+ //
+ // get the full name of the parent scope of the reflected namespace
+ bcout &lt;&lt; meta_boost_mirror::scope::full_name() &lt;&lt; endl;
+ //
+ // check whether the grandparent namespace is the global scope
+ if(reflects_global_scope&lt;meta_boost_mirror::scope::scope&gt; :: value)
+ bcout &lt;&lt; BOOST_CTS_LIT("OK") &lt;&lt; endl;
+ else
+ bcout &lt;&lt; BOOST_CTS_LIT("Error") &lt;&lt; endl;
+
+ // the ancestors typedef is an mpl vector of meta_namespaces
+ printer p;
+ mpl::for_each&lt;meta_boost_mirror::ancestors&gt;(p);
+
+ return 0;
+}
+</pre>
+</div>
+</div>
 <div class="refsect2" lang="en">
-<a name="id670754"></a><h3>
-<a name="id496123-bbtypes"></a><code class="computeroutput">meta_namespace</code> public types</h3>
+<a name="id705799"></a><h3>
+<a name="id459983-bbtypes"></a><code class="computeroutput">meta_namespace</code> public types</h3>
 <div class="orderedlist"><ol type="1">
 <li>
 <p>
@@ -84,7 +195,7 @@
                                         for <code class="computeroutput">meta_namespace</code>s
                                         reflecting any namespace with the exception of the global scope:
                                         </p>
-<pre class="programlisting">
+<a name="mirror.reference.sample.meta_namespace.ancestors01"></a><pre class="programlisting">
 using namespace ::boost;
 using namespace ::boost::mirror;
 
@@ -112,24 +223,25 @@
                 BOOST_MIRRORED_NAMESPACE(::boost::mirror)::scope
         &gt;
 ));
- </pre>
+</pre>
 <p>For the <code class="computeroutput">meta_namespace</code>
                                         reflecting the global scope the following holds true.
                                         </p>
-<pre class="programlisting">
+<a name="mirror.reference.sample.meta_namespace.ancestors02"></a><pre class="programlisting">
 BOOST_MPL_ASSERT((
         mpl::empty &lt;
                 BOOST_MIRRORED_GLOBAL_SCOPE()::ancestors
         &gt;
 ));
- </pre>
+
+</pre>
 <p>To find out whether a meta-namespace reflects the global scope
                                         use the <code class="computeroutput">reflects_global_scope</code> template meta-function.
                                         </p>
 </li>
 </ol></div>
 </div>
-<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id496009-bb"></a>base_name();</pre>
+<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id459860-bb"></a>base_name();</pre>
 <p>This static member function returns the base name of the
                                         namespace reflected by a <code class="computeroutput">meta_namespace</code>.
                                         For example the base namespace name "returned" by the invocation of
@@ -141,7 +253,7 @@
                                         <span class="bold"><strong>with</strong></span> the nested name specifier
                                         is needed use the <code class="computeroutput">full_name</code> member function
                                                instead.</p>
-<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id495967-bb"></a>full_name();</pre>
+<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id459818-bb"></a>full_name();</pre>
 <p>This static member function returns the full name of the
                                         namespace reflected by a <code class="computeroutput">meta_namespace</code>
                                         with the nested name specifier. For example:
@@ -167,7 +279,7 @@
 </tr></tbody>
 </table></div>
 <pre class="literallayout"><span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>bool</strong></span> FullName&gt;
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id495913-bb"></a>get_name(::boost::mpl::bool_&lt;FullName&gt; full);</pre>
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id459764-bb"></a>get_name(::boost::mpl::bool_&lt;FullName&gt; full);</pre>
 <p>This static member template function returns either the base name
                                         <span class="bold"><strong>without</strong></span> the nested name specifier
                                         or the full name <span class="bold"><strong>with</strong></span> the

Modified: sandbox/mirror/doc/html/boost/mirror/meta_type.html
==============================================================================
--- sandbox/mirror/doc/html/boost/mirror/meta_type.html (original)
+++ sandbox/mirror/doc/html/boost/mirror/meta_type.html 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -44,16 +44,16 @@
 <div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>typename</strong></span> Type&gt;
 <span class="bold"><strong>class</strong></span> <a class="link" href="meta_type.html" title="Class template meta_type">meta_type</a> {
 <span class="bold"><strong>public</strong></span>:
- <span class="emphasis"><em>// <a class="link" href="meta_type.html#id495672-bbtypes">types</a></em></span>
+ <span class="emphasis"><em>// <a class="link" href="meta_type.html#id459471-bbtypes">types</a></em></span>
   <span class="bold"><strong>typedef</strong></span> Type <a class="link" href="meta_type.html#boost.mirror.meta_type.reflected_type">reflected_type</a>;
   <span class="bold"><strong>typedef</strong></span> <span class="emphasis"><em>unspecified</em></span> <a class="link" href="meta_type.html#boost.mirror.meta_type.scope">scope</a>;
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_type.html#id495610-bb">base_name</a>();
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_type.html#id495550-bb">full_name</a>();
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_type.html#id459410-bb">base_name</a>();
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_type.html#id459350-bb">full_name</a>();
   <span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>bool</strong></span> FullName&gt;
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_type.html#id495490-bb">get_name</a>(::boost::mpl::bool_&lt;FullName&gt;);
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a class="link" href="meta_type.html#id459290-bb">get_name</a>(::boost::mpl::bool_&lt;FullName&gt;);
 };</pre></div>
 <div class="refsect1" lang="en">
-<a name="id671255"></a><h2>Description</h2>
+<a name="id706304"></a><h2>Description</h2>
 <p>The specializations of <code class="computeroutput">meta_type</code> can
                                 be used to get meta-information about the reflected types, some at compile-time and some at run-time.
                                 The following examples show type reflection and basic
@@ -67,6 +67,7 @@
 <div class="toc"><dl>
 <dt><span class="section">Example - Basic usage</span></dt>
 <dt><span class="section">Example - Using with typeof and getting scope-related information</span></dt>
+<dt><span class="section">Example - Reflection of typedef-ined types</span></dt>
 </dl></div>
 <div class="section" lang="en">
 <div class="titlepage"><div><div><h6 class="title">
@@ -115,8 +116,8 @@
                                         </p>
 <a name="mirror.reference.sample.meta_type.usage02"></a><pre class="programlisting">
 
-#include &lt;iostream&gt;
 #include &lt;string&gt;
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
 #include &lt;boost/typeof/typeof.hpp&gt;
 #include &lt;boost/mirror/meta_type.hpp&gt;
 #include &lt;boost/mirror/meta_types/std_pair.hpp&gt;
@@ -128,17 +129,30 @@
         using namespace ::std;
         using namespace ::boost;
         using namespace ::boost::mirror;
-
+ cts::bostream&amp; bcout = cts::bcout();
         // print out the base type name
- wcout &lt;&lt; "The type name is: "&lt;&lt; MetaType::base_name() &lt;&lt; endl;
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("The type name is: ") &lt;&lt;
+ MetaType::base_name() &lt;&lt;
+ endl;
         //
- if(reflects_global_scope&lt;MetaType::scope&gt;::value)
- wcout &lt;&lt; "It's defined on the global scope" &lt;&lt; endl;
- else wcout &lt;&lt;
- "It's defined in the " &lt;&lt;
- MetaType::scope::full_name() &lt;&lt;
- " namespace" &lt;&lt; endl;
- wcout &lt;&lt; "--------------------------------------" &lt;&lt; endl;
+ if(reflects_global_scope&lt;typename MetaType::scope&gt;::value)
+ {
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("It's defined on the global scope") &lt;&lt;
+ endl;
+ }
+ else
+ {
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("It's defined in the ") &lt;&lt;
+ MetaType::scope::full_name() &lt;&lt;
+ BOOST_CTS_LIT(" namespace") &lt;&lt;
+ endl;
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("--------------------------------------") &lt;&lt;
+ endl;
+ }
 }
 
 int main(void)
@@ -166,10 +180,64 @@
 }
 </pre>
 </div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h6 class="title">
+<a name="mirror.meta_type.reference.sample03"></a>Example - Reflection of <code class="computeroutput">typedef</code>-ined types</h6></div></div></div>
+<p>The next example shows how to reflect <code class="computeroutput">typedef</code>-ined
+ types. This is useful when the info about the name and the scope of the <code class="computeroutput">typedef</code>
+ is required instead of the meta-information about the "source" type.
+ However, the usage shown in this example is not very common. The full utility becomes obvious
+ only when the <code class="computeroutput">meta_type</code> is part of
+ some other meta-structure like for example with <code class="computeroutput">typedef</code>'d class member attributes.
+ </p>
+<p>Mirror comes with several pre-registered <code class="computeroutput">typedef</code>s. If user-defined
+ <code class="computeroutput">typedef</code>s are to be reflected they need to be registered first.
+ </p>
+<a name="mirror.reference.sample.meta_type.usage03"></a><pre class="programlisting">
+
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
+#include &lt;boost/mirror/meta_type.hpp&gt;
+
+template &lt;class MetaType&gt;
+void print_meta_data(void)
+{
+ using namespace ::std;
+ using namespace ::boost;
+ cts::bostream&amp; bcout = cts::bcout();
+ bcout &lt;&lt; BOOST_CTS_LIT("type: '");
+ bcout &lt;&lt; MetaType::base_name();
+ bcout &lt;&lt; BOOST_CTS_LIT("' defined in: '");
+ bcout &lt;&lt; MetaType::scope::full_name();
+ bcout &lt;&lt; BOOST_CTS_LIT("'");
+ bcout &lt;&lt; endl;
+}
+
+int main(void)
+{
+ using namespace ::boost::mirror;
+ //
+ // the first arg is the namespace the second the typedefined type
+ typedef BOOST_MIRRORED_TYPEDEF(::boost::cts, bstring) meta_bstring_td;
+ // reflection of the "source" type
+ typedef BOOST_MIRRORED_TYPE(::boost::cts::bstring) meta_bstring;
+ //
+ print_meta_data&lt; meta_bstring_td &gt;();
+ print_meta_data&lt; meta_bstring &gt;();
+ //
+ print_meta_data&lt; BOOST_MIRRORED_TYPEDEF(::std, size_t) &gt;();
+ // this is another version of the BOOST_MIRRORED_TYPE macro
+ // that gets the namespace and the type as two separate args
+ print_meta_data&lt; BOOST_MIRRORED_TYPE_NS(::std, size_t) &gt;();
+ //
+
+ return 0;
+}
+</pre>
+</div>
 </div>
 <div class="refsect2" lang="en">
-<a name="id671335"></a><h3>
-<a name="id495672-bbtypes"></a><code class="computeroutput">meta_type</code> public types</h3>
+<a name="id706442"></a><h3>
+<a name="id459471-bbtypes"></a><code class="computeroutput">meta_type</code> public types</h3>
 <div class="orderedlist"><ol type="1">
 <li>
 <p>
@@ -188,7 +256,7 @@
 </li>
 </ol></div>
 </div>
-<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id495610-bb"></a>base_name();</pre>
+<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id459410-bb"></a>base_name();</pre>
 <p>This static member function returns the base name of the
                                         type reflected by <code class="computeroutput">meta_type</code>
                                         without the nested name specifier. For example:
@@ -218,7 +286,7 @@
                                         </p></td>
 </tr></tbody>
 </table></div>
-<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id495550-bb"></a>full_name();</pre>
+<pre class="literallayout"><span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id459350-bb"></a>full_name();</pre>
 <p>This static member function returns the full name of the
                                         type reflected by <code class="computeroutput">meta_type</code>
                                         with the nested name specifier. For example:
@@ -249,7 +317,7 @@
 </tr></tbody>
 </table></div>
 <pre class="literallayout"><span class="bold"><strong>template</strong></span>&lt;<span class="bold"><strong>bool</strong></span> FullName&gt;
- <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id495490-bb"></a>get_name(::boost::mpl::bool_&lt;FullName&gt; full);</pre>
+ <span class="type"><span class="bold"><strong>const</strong></span> cts::bstring&amp;</span> <a name="id459290-bb"></a>get_name(::boost::mpl::bool_&lt;FullName&gt; full);</pre>
 <p>This static member template function returns either the base name
                                         <span class="bold"><strong>without</strong></span> the nested name specifier
                                         or the full name <span class="bold"><strong>with</strong></span> the

Modified: sandbox/mirror/doc/html/index.html
==============================================================================
--- sandbox/mirror/doc/html/index.html (original)
+++ sandbox/mirror/doc/html/index.html 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -21,7 +21,7 @@
 <div class="book" lang="en">
 <div class="titlepage">
 <div><div><h1 class="title">
-<a name="id568709"></a>The Mirror library documentation</h1></div></div>
+<a name="id603662"></a>The Mirror library documentation</h1></div></div>
 <hr>
 </div>
 <div class="toc">

Modified: sandbox/mirror/doc/html/mirror.html
==============================================================================
--- sandbox/mirror/doc/html/mirror.html (original)
+++ sandbox/mirror/doc/html/mirror.html 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -34,7 +34,7 @@
 </div></div>
 <div><p class="copyright">Copyright © 2008 Matú&#353; Chochlík</p></div>
 <div><div class="legalnotice">
-<a name="id670193"></a><p>Use, modification and distribution is subject to the Boost
+<a name="id705145"></a><p>Use, modification and distribution is subject to the Boost
                         Software License, Version 1.0. (See accompanying file
                         <code class="filename">LICENSE_1_0.txt</code> or copy at http://www.boost.org/LICENSE_1_0.txt)
                         </p>

Modified: sandbox/mirror/libs/mirror/doc/reference/meta_namespace.xml
==============================================================================
--- sandbox/mirror/libs/mirror/doc/reference/meta_namespace.xml (original)
+++ sandbox/mirror/libs/mirror/doc/reference/meta_namespace.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -21,10 +21,39 @@
                                 namespace (with the exception of the global scope) use the reflection
                                 macro <code><macroname>BOOST_MIRRORED_NAMESPACE</macroname>(FULL_NAMESPACE_NAME)</code>. To
                                 get the <code><classname>meta_namespace</classname></code> specialization for
- the global scope use the <code><macroname>BOOST_MIRRORED_NAMESPACE</macroname>()</code>
+ the global scope use the <code><macroname>BOOST_MIRRORED_GLOBAL_SCOPE</macroname>()</code>
                                 macro.
                                 </para>
                         </purpose>
+ <description>
+ <para>The specializations of <code><classname>meta_type</classname></code> can
+ be used to get meta-information about the reflected types, some at compile-time and some at run-time.
+ The following examples show type reflection and basic
+ <code><classname>meta_type</classname></code> usage. Mirror works with the native C++ types
+ and some of the very common types like <code>::std::string</code>, etc. out of the box.
+ Meta-types for many other types from the standard library and <libraryname>Boost</libraryname>
+ are also provided and can be <code>#include</code>d when necessary.
+ </para>
+ <section id="mirror.meta_namespace.reference.samples">
+ <section id="mirror.meta_namespace.reference.sample01">
+ <title>Example - Basic usage</title>
+ <para>This sample code shows how to reflect a namespace and how to get its
+ base and full name.
+ </para>
+ <xi:include href="../samples/usage_meta_namespace_01.xml"/>
+ </section>
+ <section id="mirror.meta_namespace.reference.sample02">
+ <title>Example - Scope and ancestors</title>
+ <para>The following example shows what can be done with the
+ <code><classname>meta_namespace</classname></code>s <code>scope</code> and
+ <code>ancestors</code> <code>typedef</code>s. It also shows the usage
+ of the <code><classname>reflects_global_scope</classname></code> trait
+ template.
+ </para>
+ <xi:include href="../samples/usage_meta_namespace_02.xml"/>
+ </section>
+ </section>
+ </description>
 
                         <access name="public">
                         <typedef name="scope">
@@ -55,46 +84,11 @@
                                         for <code><classname>meta_namespace</classname></code>s
                                         reflecting any namespace with the exception of the global scope:
                                         </para>
- <programlisting>
-using namespace ::boost;
-using namespace ::boost::mirror;
-
-BOOST_MPL_ASSERT((
- reflects_global_scope &lt;
- mpl::front &lt;
- BOOST_MIRRORED_NAMESPACE(::std)::ancestors
- &gt;
- &gt;
-));
-
-BOOST_MPL_ASSERT((
- reflects_global_scope &lt;
- mpl::front &lt;
- BOOST_MIRRORED_NAMESPACE(::boost::mirror)::ancestors
- &gt;
- &gt;
-));
-
-BOOST_MPL_ASSERT((
- is_same &lt;
- mpl::back &lt;
- BOOST_MIRRORED_NAMESPACE(::boost::mirror)::ancestors
- &gt;,
- BOOST_MIRRORED_NAMESPACE(::boost::mirror)::scope
- &gt;
-));
- </programlisting>
+ <xi:include href="../samples/meta_namespace_ancestors_01.xml"/>
                                         <para>For the <code><classname>meta_namespace</classname></code>
                                         reflecting the global scope the following holds true.
                                         </para>
-
- <programlisting>
-BOOST_MPL_ASSERT((
- mpl::empty &lt;
- BOOST_MIRRORED_GLOBAL_SCOPE()::ancestors
- &gt;
-));
- </programlisting>
+ <xi:include href="../samples/meta_namespace_ancestors_02.xml"/>
                                         <para>To find out whether a meta-namespace reflects the global scope
                                         use the <code><classname>reflects_global_scope</classname></code> template meta-function.
                                         </para>

Modified: sandbox/mirror/libs/mirror/doc/reference/meta_type.xml
==============================================================================
--- sandbox/mirror/libs/mirror/doc/reference/meta_type.xml (original)
+++ sandbox/mirror/libs/mirror/doc/reference/meta_type.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -50,6 +50,20 @@
                                         </para>
                                         <xi:include href="../samples/usage_meta_type_02.xml"/>
                                 </section>
+ <section id="mirror.meta_type.reference.sample03">
+ <title>Example - Reflection of <code>typedef</code>-ined types</title>
+ <para>The next example shows how to reflect <code>typedef</code>-ined
+ types. This is useful when the info about the name and the scope of the <code>typedef</code>
+ is required instead of the meta-information about the "source" type.
+ However, the usage shown in this example is not very common. The full utility becomes obvious
+ only when the <code><classname>meta_type</classname></code> is part of
+ some other meta-structure like for example with <code>typedef</code>'d class member attributes.
+ </para>
+ <para>Mirror comes with several pre-registered <code>typedef</code>s. If user-defined
+ <code>typedef</code>s are to be reflected they need to be registered first.
+ </para>
+ <xi:include href="../samples/usage_meta_type_03.xml"/>
+ </section>
                                 </section>
                         </description>
 

Added: sandbox/mirror/libs/mirror/doc/samples/meta_namespace_ancestors_01.xml
==============================================================================
--- (empty file)
+++ sandbox/mirror/libs/mirror/doc/samples/meta_namespace_ancestors_01.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE section PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+ "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<programlisting id="mirror.reference.sample.meta_namespace.ancestors01">
+using namespace ::boost;
+using namespace ::boost::mirror;
+
+BOOST_MPL_ASSERT((
+ reflects_global_scope &lt;
+ mpl::front &lt;
+ BOOST_MIRRORED_NAMESPACE(::std)::ancestors
+ &gt;
+ &gt;
+));
+
+BOOST_MPL_ASSERT((
+ reflects_global_scope &lt;
+ mpl::front &lt;
+ BOOST_MIRRORED_NAMESPACE(::boost::mirror)::ancestors
+ &gt;
+ &gt;
+));
+
+BOOST_MPL_ASSERT((
+ is_same &lt;
+ mpl::back &lt;
+ BOOST_MIRRORED_NAMESPACE(::boost::mirror)::ancestors
+ &gt;,
+ BOOST_MIRRORED_NAMESPACE(::boost::mirror)::scope
+ &gt;
+));
+</programlisting>
+

Added: sandbox/mirror/libs/mirror/doc/samples/meta_namespace_ancestors_02.xml
==============================================================================
--- (empty file)
+++ sandbox/mirror/libs/mirror/doc/samples/meta_namespace_ancestors_02.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE section PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+ "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<programlisting id="mirror.reference.sample.meta_namespace.ancestors02">
+BOOST_MPL_ASSERT((
+ mpl::empty &lt;
+ BOOST_MIRRORED_GLOBAL_SCOPE()::ancestors
+ &gt;
+));
+
+</programlisting>
+

Added: sandbox/mirror/libs/mirror/doc/samples/usage_meta_namespace_01.xml
==============================================================================
--- (empty file)
+++ sandbox/mirror/libs/mirror/doc/samples/usage_meta_namespace_01.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE section PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+ "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<programlisting id="mirror.reference.sample.meta_namespace.usage01">
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
+#include &lt;boost/mirror/meta_namespace.hpp&gt;
+
+int main(void)
+{
+ using namespace ::std;
+ using namespace ::boost;
+ using namespace ::boost::mirror;
+ cts::bostream&amp; bcout = cts::bcout();
+
+ // several namespaces are pre-registered
+ bcout &lt;&lt; BOOST_MIRRORED_GLOBAL_SCOPE() ::base_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::std) ::base_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost) ::base_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost::mirror) ::base_name() &lt;&lt; endl;
+ //
+ bcout &lt;&lt; BOOST_MIRRORED_GLOBAL_SCOPE() ::full_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::std) ::full_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost) ::full_name() &lt;&lt; endl;
+ bcout &lt;&lt; BOOST_MIRRORED_NAMESPACE(::boost::mirror) ::full_name() &lt;&lt; endl;
+
+ return 0;
+}
+</programlisting>
+

Added: sandbox/mirror/libs/mirror/doc/samples/usage_meta_namespace_02.xml
==============================================================================
--- (empty file)
+++ sandbox/mirror/libs/mirror/doc/samples/usage_meta_namespace_02.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE section PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+ "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<programlisting id="mirror.reference.sample.meta_namespace.usage02">
+#include &lt;boost/mpl/for_each.hpp&gt;
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
+#include &lt;boost/mirror/meta_namespace.hpp&gt;
+#include &lt;boost/mirror/traits/reflects_global_scope.hpp&gt;
+
+class printer
+{
+public:
+ template &lt;class MetaNamespace&gt;
+ void operator()(MetaNamespace mn)
+ {
+ using namespace ::std;
+ using namespace ::boost;
+ cts::bostream&amp; bcout = cts::bcout();
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("ancestor ") &lt;&lt;
+ ctr++ &lt;&lt;
+ BOOST_CTS_LIT(": '") &lt;&lt;
+ MetaNamespace::base_name() &lt;&lt;
+ BOOST_CTS_LIT("'") &lt;&lt;
+ endl;
+ }
+
+ printer(void):ctr(0){ }
+private:
+ int ctr;
+};
+
+int main(void)
+{
+ using namespace ::std;
+ using namespace ::boost;
+ using namespace ::boost::mirror;
+ cts::bostream&amp; bcout = cts::bcout();
+ //
+ typedef BOOST_MIRRORED_NAMESPACE(::boost::mirror) meta_boost_mirror;
+ //
+ // get the full name of the parent scope of the reflected namespace
+ bcout &lt;&lt; meta_boost_mirror::scope::full_name() &lt;&lt; endl;
+ //
+ // check whether the grandparent namespace is the global scope
+ if(reflects_global_scope&lt;meta_boost_mirror::scope::scope&gt; :: value)
+ bcout &lt;&lt; BOOST_CTS_LIT("OK") &lt;&lt; endl;
+ else
+ bcout &lt;&lt; BOOST_CTS_LIT("Error") &lt;&lt; endl;
+
+ // the ancestors typedef is an mpl vector of meta_namespaces
+ printer p;
+ mpl::for_each&lt;meta_boost_mirror::ancestors&gt;(p);
+
+ return 0;
+}
+</programlisting>
+

Modified: sandbox/mirror/libs/mirror/doc/samples/usage_meta_type_02.xml
==============================================================================
--- sandbox/mirror/libs/mirror/doc/samples/usage_meta_type_02.xml (original)
+++ sandbox/mirror/libs/mirror/doc/samples/usage_meta_type_02.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -3,8 +3,8 @@
         "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
 <programlisting id="mirror.reference.sample.meta_type.usage02">
 
-#include &lt;iostream&gt;
 #include &lt;string&gt;
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
 #include &lt;boost/typeof/typeof.hpp&gt;
 #include &lt;boost/mirror/meta_type.hpp&gt;
 #include &lt;boost/mirror/meta_types/std_pair.hpp&gt;
@@ -16,17 +16,30 @@
         using namespace ::std;
         using namespace ::boost;
         using namespace ::boost::mirror;
-
+ cts::bostream&amp; bcout = cts::bcout();
         // print out the base type name
- wcout &lt;&lt; "The type name is: "&lt;&lt; MetaType::base_name() &lt;&lt; endl;
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("The type name is: ") &lt;&lt;
+ MetaType::base_name() &lt;&lt;
+ endl;
         //
- if(reflects_global_scope&lt;MetaType::scope&gt;::value)
- wcout &lt;&lt; "It's defined on the global scope" &lt;&lt; endl;
- else wcout &lt;&lt;
- "It's defined in the " &lt;&lt;
- MetaType::scope::full_name() &lt;&lt;
- " namespace" &lt;&lt; endl;
- wcout &lt;&lt; "--------------------------------------" &lt;&lt; endl;
+ if(reflects_global_scope&lt;typename MetaType::scope&gt;::value)
+ {
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("It's defined on the global scope") &lt;&lt;
+ endl;
+ }
+ else
+ {
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("It's defined in the ") &lt;&lt;
+ MetaType::scope::full_name() &lt;&lt;
+ BOOST_CTS_LIT(" namespace") &lt;&lt;
+ endl;
+ bcout &lt;&lt;
+ BOOST_CTS_LIT("--------------------------------------") &lt;&lt;
+ endl;
+ }
 }
 
 int main(void)

Added: sandbox/mirror/libs/mirror/doc/samples/usage_meta_type_03.xml
==============================================================================
--- (empty file)
+++ sandbox/mirror/libs/mirror/doc/samples/usage_meta_type_03.xml 2008-07-15 09:46:40 EDT (Tue, 15 Jul 2008)
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE section PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+ "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<programlisting id="mirror.reference.sample.meta_type.usage03">
+
+#include &lt;boost/char_type_switch/iostream.hpp&gt;
+#include &lt;boost/mirror/meta_type.hpp&gt;
+
+template &lt;class MetaType&gt;
+void print_meta_data(void)
+{
+ using namespace ::std;
+ using namespace ::boost;
+ cts::bostream&amp; bcout = cts::bcout();
+ bcout &lt;&lt; BOOST_CTS_LIT("type: '");
+ bcout &lt;&lt; MetaType::base_name();
+ bcout &lt;&lt; BOOST_CTS_LIT("' defined in: '");
+ bcout &lt;&lt; MetaType::scope::full_name();
+ bcout &lt;&lt; BOOST_CTS_LIT("'");
+ bcout &lt;&lt; endl;
+}
+
+int main(void)
+{
+ using namespace ::boost::mirror;
+ //
+ // the first arg is the namespace the second the typedefined type
+ typedef BOOST_MIRRORED_TYPEDEF(::boost::cts, bstring) meta_bstring_td;
+ // reflection of the "source" type
+ typedef BOOST_MIRRORED_TYPE(::boost::cts::bstring) meta_bstring;
+ //
+ print_meta_data&lt; meta_bstring_td &gt;();
+ print_meta_data&lt; meta_bstring &gt;();
+ //
+ print_meta_data&lt; BOOST_MIRRORED_TYPEDEF(::std, size_t) &gt;();
+ // this is another version of the BOOST_MIRRORED_TYPE macro
+ // that gets the namespace and the type as two separate args
+ print_meta_data&lt; BOOST_MIRRORED_TYPE_NS(::std, size_t) &gt;();
+ //
+
+ return 0;
+}
+</programlisting>
+


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