$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: chochlik_at_[hidden]
Date: 2008-06-09 12:15:11
Author: matus.chochlik
Date: 2008-06-09 12:15:10 EDT (Mon, 09 Jun 2008)
New Revision: 46274
URL: http://svn.boost.org/trac/boost/changeset/46274
Log:
- Added support for traversal contexts that will be used in meta-path expressions
Added:
   sandbox/mirror/boost/mirror/visitors/dtd_writer.hpp   (contents, props changed)
Removed:
   sandbox/mirror/boost/mirror/visitors/fallback.hpp
Text files modified: 
   sandbox/mirror/boost/mirror/traversal.hpp       |    68 ++++++++++++++++++++++++--------------- 
   sandbox/mirror/boost/mirror/visitors/sample.hpp |    44 +++++++++++++------------               
   2 files changed, 64 insertions(+), 48 deletions(-)
Modified: sandbox/mirror/boost/mirror/traversal.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/traversal.hpp	(original)
+++ sandbox/mirror/boost/mirror/traversal.hpp	2008-06-09 12:15:10 EDT (Mon, 09 Jun 2008)
@@ -21,15 +21,16 @@
 namespace mirror {
 
 
-template <class MetaClass> class deep_traversal_of;
-template <class MetaClass> class flat_traversal_of;
+template <class MetaClass, class Context> class deep_traversal_of;
+template <class MetaClass, class Context> class flat_traversal_of;
 
 namespace detail {
 
         template <
-		class MetaClass, 
+		class MetaClass,
+		class Context,
                 class MetaAttributes,
-		template <class> class TraversalType
+		template <class, class> class TraversalType
 	>
         struct traversal_utils
         {
@@ -56,37 +57,40 @@
                         template <class MetaAttribute>
                         void operator ()(MetaAttribute ma) const
                         {
-				process_single(ma, typename VisitorType::works_on_instances());
+				typename mpl::push_back<Context, MetaClass>::type c;
+				process_single(ma, c, typename VisitorType::works_on_instances());
                         }
                 private:
                         VisitorType& visitor;
                         typename MetaClass::reflected_type* ptr_to_inst;
 
                         // process single attribute WITH an instance
-			template <class MetaAttribute>
-			void process_single(MetaAttribute ma, mpl::bool_<true>) const
+			template <class MetaAttribute, class NewContext>
+			void process_single(MetaAttribute ma, NewContext ctx, mpl::bool_<true>) const
                         {
-				visitor.enter_attribute(ma);
+				visitor.enter_attribute(ma, ctx);
                                 typedef typename MetaAttribute::type attrib_type;
                                 assert(ptr_to_inst != 0);
                                 typedef BOOST_TYPEOF(ma.get(*ptr_to_inst)) instance_type;
                                 instance_type instance(ma.get(*ptr_to_inst));
                                 TraversalType<
-					BOOST_MIRROR_REFLECT_CLASS(attrib_type)
+					BOOST_MIRROR_REFLECT_CLASS(attrib_type),
+					typename mpl::push_back<NewContext, MetaAttribute>::type
 				>::accept(visitor, &instance);
-				visitor.leave_attribute(ma);
+				visitor.leave_attribute(ma, ctx);
                         }
 
                         // process single attribute W/O an instance
-			template <class MetaAttribute>
-			void process_single(MetaAttribute ma, mpl::bool_<false>) const
+			template <class MetaAttribute, class NewContext>
+			void process_single(MetaAttribute ma, NewContext ctx, mpl::bool_<false>) const
                         {
-				visitor.enter_attribute(ma);
+				visitor.enter_attribute(ma, ctx);
                                 typedef typename MetaAttribute::type attrib_type;
                                 TraversalType<
-					BOOST_MIRROR_REFLECT_CLASS(attrib_type)
+					BOOST_MIRROR_REFLECT_CLASS(attrib_type),
+					typename mpl::push_back<NewContext, MetaAttribute>::type
 				>::accept(visitor, 0);
-				visitor.leave_attribute(ma);
+				visitor.leave_attribute(ma, ctx);
                         }
                 };
         
@@ -123,12 +127,18 @@
                         template <class MetaInheritance>
                         void operator ()(MetaInheritance mbc) const
                         {
-				visitor.enter_base_class(mbc);
+				typedef typename mpl::push_back<Context, MetaClass>::type 
+					NewContext;
+				NewContext ctx;
+				visitor.enter_base_class(mbc, ctx);
                                 typedef MetaInheritance meta_inheritance;
                                 typedef typename meta_inheritance::meta_base_class
                                         meta_base_class;
-				TraversalType<meta_base_class>::accept(visitor, ptr_to_inst);
-				visitor.leave_base_class(mbc);
+				TraversalType<
+					meta_base_class,
+					typename mpl::push_back<NewContext, MetaInheritance>::type
+				>::accept(visitor, ptr_to_inst);
+				visitor.leave_base_class(mbc, ctx);
                         }
                 private:
                         VisitorType& visitor;
@@ -149,10 +159,11 @@
 
 } // namespace detail
 
-template <class MetaClass>
+template <class MetaClass, class Context = mpl::vector0<> >
 class deep_traversal_of 
 : detail::traversal_utils<
-	MetaClass, 
+	MetaClass,
+	Context,
         typename MetaClass::attributes,
         deep_traversal_of
 >
@@ -183,10 +194,11 @@
         )
         {
                 MetaClass mc;
+		Context ctx;
                 // enter the type
-		visitor.get().enter_type(mc);
+		visitor.get().enter_type(mc, ctx);
                 // visit the instance
-		visitor.get().visit_instance(mc, ptr_to_inst);
+		visitor.get().visit_instance(mc, ctx, ptr_to_inst);
                 // go through the base classes
                 for_each<typename MetaClass::base_classes>(
                         cref(show_bases_to(visitor, ptr_to_inst))
@@ -196,14 +208,15 @@
                         cref(show_attribs_to(visitor, ptr_to_inst))
                 );
                 // leave the type
-		visitor.get().leave_type(mc);
+		visitor.get().leave_type(mc, ctx);
         }
 };
 
-template <class MetaClass>
+template <class MetaClass, class Context = mpl::vector0<> >
 class flat_traversal_of
 : detail::traversal_utils<
         MetaClass, 
+	Context,
         typename MetaClass::all_attributes,
         flat_traversal_of
 >
@@ -233,16 +246,17 @@
         )
         {
                 MetaClass mc;
+		Context ctx;
                 // enter the type
-		visitor.get().enter_type(mc);
+		visitor.get().enter_type(mc, ctx);
                 // visit the instance
-		visitor.get().visit_instance(mc, ptr_to_inst);
+		visitor.get().visit_instance(mc, ctx, ptr_to_inst);
                 // go through all of the class' attributes
                 for_each<typename MetaClass::all_attributes>(
                         cref(show_attribs_to(visitor, ptr_to_inst))
                 );
                 // leave the type
-		visitor.get().leave_type(mc);
+		visitor.get().leave_type(mc, ctx);
         }
 };
 
Added: sandbox/mirror/boost/mirror/visitors/dtd_writer.hpp
==============================================================================
--- (empty file)
+++ sandbox/mirror/boost/mirror/visitors/dtd_writer.hpp	2008-06-09 12:15:10 EDT (Mon, 09 Jun 2008)
@@ -0,0 +1,103 @@
+/**
+ * \file boost/mirror/visitors/dtd_writer.hpp
+ * meta-class/type visitor that writes DTD for the given class
+ *
+ *  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)
+ */
+
+#ifndef BOOST_MIRROR_VISITORS_DTD_WRITER_HPP
+#define BOOST_MIRROR_VISITORS_DTD_WRITER_HPP
+
+// meta namespaces (includes boost/char_type_switch/string.hpp)
+#include <boost/mirror/meta_namespace.hpp>
+// meta types 
+#include <boost/mirror/meta_class.hpp>
+// traits
+#include <boost/mirror/traits/reflects_virtual_inheritance.hpp>
+#include <boost/mirror/traits/reflects_global_scope.hpp>
+//
+#include <boost/type_traits/is_fundamental.hpp>
+
+namespace boost {
+namespace mirror {
+
+namespace visitors {
+
+class dtd_writer
+{
+public:
+	typedef mpl::bool_<false> works_on_instances;
+
+	dtd_writer(void){ }
+
+	// enter a class/type
+	template <class MetaClass>
+	void enter_type(MetaClass)
+	{
+	}
+
+	// leave the class/type
+	template <class MetaClass>
+	void leave_type(MetaClass)
+	{
+	}
+
+	template <class MetaClass>
+	inline void enter_base_classes(MetaClass){ }
+	template <class MetaClass>
+	inline void leave_base_classes(MetaClass){ }
+
+
+	// enter a base class
+	template <class MetaInheritance>
+	void enter_base_class(MetaInheritance)
+	{
+		using namespace ::std;
+		using namespace ::boost;
+	}
+
+	// leave base class
+	template <class MetaInheritance>
+	void leave_base_class(MetaInheritance)
+	{
+		using namespace ::std;
+		using namespace ::boost;
+	}
+
+
+	template <class MetaClass, class MetaAttributes>
+	void enter_attributes(MetaClass, MetaAttributes)
+	{
+	}
+
+	template <class MetaClass, class MetaAttributes>
+	void leave_attributes(MetaClass, MetaAttributes)
+	{
+	}
+
+	template <class MetaAttribute>
+	inline void enter_attribute(MetaAttribute)
+	{
+		using namespace ::std;
+		using namespace ::boost;
+	}
+
+	template <class MetaAttribute>
+	void leave_attribute(MetaAttribute)
+	{
+		using namespace ::std;
+		using namespace ::boost;
+	}
+
+private:
+	std::map<bstring, bstring> lines;
+};
+
+} // namespace visitors
+} // namespace mirror
+} // namespace boost
+
+#endif //include guard
+
Deleted: sandbox/mirror/boost/mirror/visitors/fallback.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/visitors/fallback.hpp	2008-06-09 12:15:10 EDT (Mon, 09 Jun 2008)
+++ (empty file)
@@ -1,56 +0,0 @@
-/**
- * \file boost/mirror/visitors/fallback.hpp
- * Base implementation of a meta-object visitor
- *
- *  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)
- */
-
-#ifndef BOOST_MIRROR_VISITORS_FALLBACK
-#define BOOST_MIRROR_VISITORS_FALLBACK
-
-// meta namespaces (includes boost/char_type_switch/string.hpp)
-#include <boost/mirror/meta_namespace.hpp>
-// meta types 
-#include <boost/mirror/meta_type.hpp>
-
-namespace boost {
-namespace mirror {
-
-struct fallback_visitor 
-{
-	template <class MetaClass>
-	inline void enter_type(MetaClass){ }
-
-	template <class MetaClass>
-	inline void leave_type(MetaClass){ }
-
-	template <class MetaClass>
-	inline void enter_attributes(void){ }
-	template <class MetaClass>
-	inline void leave_attributes(void){ }
-
-	template <class MetaClass>
-	inline void enter_base_classes(void){ }
-	template <class MetaClass>
-	inline void leave_base_classes(void){ }
-
-	template <class MetaInheritance>
-	inline void enter_base_class(MetaInheritance){ }
-
-	template <class MetaInheritance>
-	inline void leave_base_class(MetaInheritance){ }
-
-	template <class MetaAttribute>
-	inline void enter_attribute(MetaAttribute){ }
-
-	template <class MetaAttribute>
-	inline void leave_attribute(MetaAttribute){ }
-};
-
-} // namespace mirror
-} // namespace boost
-
-#endif //include guard
-
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-09 12:15:10 EDT (Mon, 09 Jun 2008)
@@ -17,8 +17,7 @@
 // traits
 #include <boost/mirror/traits/reflects_virtual_inheritance.hpp>
 #include <boost/mirror/traits/reflects_global_scope.hpp>
-// the base fallback visitor implementation
-#include <boost/mirror/visitors/fallback.hpp>
+// container size
 #include <boost/mirror/algorithm/size.hpp>
 //
 //
@@ -36,8 +35,8 @@
         sample_visitor(void):indent(0){ }
 
         // enter a class/type
-	template <class MetaClass>
-	void enter_type(MetaClass)
+	template <class MetaClass, class Context>
+	void enter_type(MetaClass, Context)
         {
                 using namespace ::std;
                 using namespace ::boost;
@@ -58,8 +57,8 @@
         }
 
         // leave the class/type
-	template <class MetaClass>
-	void leave_type(MetaClass)
+	template <class MetaClass, class Context>
+	void leave_type(MetaClass, Context)
         {
                 using namespace ::std;
                 using namespace ::boost;
@@ -75,8 +74,8 @@
 
 
         // enter a base class
-	template <class MetaInheritance>
-	void enter_base_class(MetaInheritance)
+	template <class MetaInheritance, class Context>
+	void enter_base_class(MetaInheritance, Context)
         {
                 using namespace ::std;
                 using namespace ::boost;
@@ -92,8 +91,8 @@
         }
 
         // leave base class
-	template <class MetaInheritance>
-	void leave_base_class(MetaInheritance)
+	template <class MetaInheritance, class Context>
+	void leave_base_class(MetaInheritance, Context)
         {
                 using namespace ::std;
                 using namespace ::boost;
@@ -137,8 +136,8 @@
                 }
         }
 
-	template <class MetaAttribute>
-	inline void enter_attribute(MetaAttribute)
+	template <class MetaAttribute, class Context>
+	inline void enter_attribute(MetaAttribute, Context)
         {
                 using namespace ::std;
                 using namespace ::boost;
@@ -153,8 +152,8 @@
                         endl;
         }
 
-	template <class MetaAttribute>
-	void leave_attribute(MetaAttribute)
+	template <class MetaAttribute, class Context>
+	void leave_attribute(MetaAttribute, Context)
         {
                 using namespace ::std;
                 using namespace ::boost;
@@ -163,10 +162,11 @@
                 bcout << "</attribute>" << endl;
         }
 
-	template <class MetaClass, typename InstanceType>
-	void visit_instance(MetaClass, InstanceType* ptr_to_inst)
+	template <class MetaClass, class Context, typename InstanceType>
+	void visit_instance(MetaClass, Context ctx, InstanceType* ptr_to_inst)
         {
                 print_value(
+			ctx,
                         ptr_to_inst, 
                         is_fundamental<typename MetaClass::reflected_type>()
                 );
@@ -174,17 +174,19 @@
 
 private:
 
-	template <typename Type>
-	void print_value(Type* ptr_to_inst, mpl::bool_<false>){ }
+	template <typename Type, class Context>
+	void print_value(Context, Type* ptr_to_inst, mpl::bool_<false>){ }
 
-	template <typename Type>
-	void print_value(Type* ptr_to_inst, mpl::bool_<true>)
+	template <typename Type, class Context>
+	void print_value(Context, Type* ptr_to_inst, mpl::bool_<true>)
         {
                 using namespace ::std;
                 using namespace ::boost;
                 print_indentation();
                 bcout << 
-			"<value>" <<
+			"<value depth='" <<
+			mpl::size<Context>::value << 
+			"'>" <<
                         *ptr_to_inst << 
                         "</value>" << 
                         endl;