$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: chochlik_at_[hidden]
Date: 2008-06-20 08:31:53
Author: matus.chochlik
Date: 2008-06-20 08:31:52 EDT (Fri, 20 Jun 2008)
New Revision: 46552
URL: http://svn.boost.org/trac/boost/changeset/46552
Log:
Added example/traversal/sample_meta_path.cpp showing how meta-path expressions can be used in visitors
Added:
   sandbox/mirror/libs/mirror/example/traversal/sample_meta_path.cpp   (contents, props changed)
Text files modified: 
   sandbox/mirror/boost/mirror/visitors/sample.hpp                 |     4 ++--                                    
   sandbox/mirror/libs/mirror/example/Jamfile.v2                   |     3 ++-                                     
   sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp |     5 -----                                   
   3 files changed, 4 insertions(+), 8 deletions(-)
Modified: sandbox/mirror/boost/mirror/visitors/sample.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/visitors/sample.hpp	(original)
+++ sandbox/mirror/boost/mirror/visitors/sample.hpp	2008-06-20 08:31:52 EDT (Fri, 20 Jun 2008)
@@ -73,7 +73,7 @@
         {
                 using namespace ::std;
                 using namespace ::boost;
-		if(mirror::size<MetaClass::base_classes>::value > 0)
+		if(mirror::size<BaseClasses>::value > 0)
                 {
                         print_indentation();
                         ++indent;
@@ -88,7 +88,7 @@
         {
                 using namespace ::std;
                 using namespace ::boost;
-		if(mirror::size<MetaClass::base_classes>::value > 0)
+		if(mirror::size<BaseClasses>::value > 0)
                 {
                         --indent;
                         print_indentation();
Modified: sandbox/mirror/libs/mirror/example/Jamfile.v2
==============================================================================
--- sandbox/mirror/libs/mirror/example/Jamfile.v2	(original)
+++ sandbox/mirror/libs/mirror/example/Jamfile.v2	2008-06-20 08:31:52 EDT (Fri, 20 Jun 2008)
@@ -32,7 +32,8 @@
 #
 # traversal by visitors
 #
-exe tvrsl_sample_visitor    : traversal/sample_visitor.cpp ;
+exe tvrsl_sample_visitor       : traversal/sample_visitor.cpp ;
+exe tvrsl_meta_path_visitor    : traversal/sample_meta_path.cpp ;
 #
 # cooperation with Boost.Serialization
 #
Added: sandbox/mirror/libs/mirror/example/traversal/sample_meta_path.cpp
==============================================================================
--- (empty file)
+++ sandbox/mirror/libs/mirror/example/traversal/sample_meta_path.cpp	2008-06-20 08:31:52 EDT (Fri, 20 Jun 2008)
@@ -0,0 +1,186 @@
+/**
+ * \file examples/traversal/sample_meta_path.cpp
+ *
+ * Example of class structure deep and flat traversal
+ *
+ * NOTE: if You are not familiar with registration
+ * and reflection, You should probably 
+ * see examples in examples/registering/ first.
+ *
+ *  Copyright 2008 Matus Chochlik. Distributed under the Boost
+ *  Software License, Version 1.0. (See accompanying file
+ *  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#include <boost/char_type_switch/iostream.hpp>
+
+#include <boost/mirror/meta_namespace.hpp>
+#include <boost/mirror/meta_type.hpp>
+#include <boost/mirror/meta_class.hpp>
+
+#include <boost/mirror/meta_types/std_pair.hpp>
+#include <boost/mirror/meta_types/boost_tuple.hpp>
+#include <boost/mirror/meta_classes/boost_tuple.hpp>
+
+#include <boost/mirror/meta_path/ancestors.hpp>
+#include <boost/mirror/meta_path/size.hpp>
+
+#include <boost/mirror/visitors/meta_path_sample.hpp>
+#include <boost/mirror/traversal.hpp>
+
+/** First declare some namespaces and classes
+ */
+
+namespace Test {
+
+	struct A 
+	{
+		long l;
+	};
+
+	struct B : virtual A
+	{
+		int i;
+	};
+
+	struct C : virtual A
+	{
+		double d;
+	};
+
+	struct D : virtual A
+	{
+		short s;
+	};
+
+	struct E : B, C, D
+	{
+		float f;
+	};
+
+	struct F : virtual E
+	{
+		bool b;
+	};
+
+	struct G : virtual E
+	{
+		char c;
+	};
+
+	struct H : F, G
+	{
+		wchar_t w;
+	};
+
+
+} // namespace Test
+
+namespace boost { 
+namespace mirror {
+
+/** Register the Test namespace
+ */
+BOOST_MIRROR_REG_NAMESPACE_TOP_LEVEL(Test)
+
+/** Register the types and classes
+ */
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, A)
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, B)
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, C)
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, D)
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, E)
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, F)
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, G)
+BOOST_MIRROR_REG_TYPE(_Test, ::Test, H)
+
+
+BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::B)
+BOOST_MIRROR_REG_BASE_CLASS_VIRTUAL(0,  public, ::Test::A)
+BOOST_MIRROR_REG_BASE_CLASSES_END
+
+BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::C)
+BOOST_MIRROR_REG_BASE_CLASS_VIRTUAL(0,  public, ::Test::A)
+BOOST_MIRROR_REG_BASE_CLASSES_END
+
+BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::D)
+BOOST_MIRROR_REG_BASE_CLASS_VIRTUAL(0,  public, ::Test::A)
+BOOST_MIRROR_REG_BASE_CLASSES_END
+
+BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::E)
+BOOST_MIRROR_REG_BASE_CLASS_SIMPLE(0,  ::Test::B)
+BOOST_MIRROR_REG_BASE_CLASS_SIMPLE(1,  ::Test::C)
+BOOST_MIRROR_REG_BASE_CLASS_SIMPLE(2,  ::Test::D)
+BOOST_MIRROR_REG_BASE_CLASSES_END
+
+BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::F)
+BOOST_MIRROR_REG_BASE_CLASS_VIRTUAL(0,  public, ::Test::E)
+BOOST_MIRROR_REG_BASE_CLASSES_END
+
+BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::G)
+BOOST_MIRROR_REG_BASE_CLASS_VIRTUAL(0,  public, ::Test::E)
+BOOST_MIRROR_REG_BASE_CLASSES_END
+
+BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::H)
+BOOST_MIRROR_REG_BASE_CLASS_SIMPLE(0,  ::Test::F)
+BOOST_MIRROR_REG_BASE_CLASS_SIMPLE(1,  ::Test::G)
+BOOST_MIRROR_REG_BASE_CLASSES_END
+
+
+/** Class attributes
+ */
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::A)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, long, l)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::B)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, int, i)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::C)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, double, d)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::D)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, short, s)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::E)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, float, f)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::F)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, bool, b)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::G)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, char, c)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+BOOST_MIRROR_REG_CLASS_ATTRIBS_BEGIN(::Test::H)	
+	BOOST_MIRROR_REG_CLASS_ATTRIB(0, wchar_t, w)
+BOOST_MIRROR_REG_CLASS_ATTRIBS_END
+
+} // namespace mirror
+} // namespace boost
+
+
+int main(void)
+{
+	using namespace ::std;
+	using namespace ::boost;
+	using namespace ::boost::mirror;
+	//
+	using namespace ::Test;
+	//
+	typedef BOOST_MIRROR_REFLECT_CLASS(H) meta_H;
+	//
+	bcout << "--------------------------------------------" << endl;
+	deep_traversal_of<meta_H>::accept(meta_path_sample_visitor());
+	bcout << "--------------------------------------------" << endl;
+	flat_traversal_of<meta_H>::accept(meta_path_sample_visitor());
+	bcout << "--------------------------------------------" << endl;
+	//
+	//
+	return 0;
+}
Modified: sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp	(original)
+++ sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp	2008-06-20 08:31:52 EDT (Fri, 20 Jun 2008)
@@ -26,7 +26,6 @@
 #include <boost/mirror/meta_path/size.hpp>
 
 #include <boost/mirror/visitors/sample.hpp>
-#include <boost/mirror/visitors/meta_path_sample.hpp>
 #include <boost/mirror/traversal.hpp>
 
 /** First declare some namespaces and classes
@@ -190,10 +189,6 @@
         bcout << "--------------------------------------------" << endl;
         flat_traversal_of<meta_H>::accept(sample_visitor<true>(), &h);
         bcout << "--------------------------------------------" << endl;
-	deep_traversal_of<meta_H>::accept(meta_path_sample_visitor());
-	bcout << "--------------------------------------------" << endl;
-	flat_traversal_of<meta_H>::accept(meta_path_sample_visitor());
-	bcout << "--------------------------------------------" << endl;
         //
         //
         typedef pair<int volatile, long const> T1;