$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: stipe_at_[hidden]
Date: 2007-11-17 22:15:41
Author: srajko
Date: 2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
New Revision: 41189
URL: http://svn.boost.org/trac/boost/changeset/41189
Log:
reimplement blueprint::get_port using the Switch lib, expand example, make port_traits a data struct, add to docs
Added:
   sandbox/SOC/2007/signals/boost/switch.hpp   (contents, props changed)
Text files modified: 
   sandbox/SOC/2007/signals/boost/dataflow/blueprint/component.hpp                                |    16 ++-                                     
   sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection.hpp                               |     1                                         
   sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection_t.hpp                             |     4                                         
   sandbox/SOC/2007/signals/boost/dataflow/blueprint/get_port.hpp                                 |    71 ++++++--------                          
   sandbox/SOC/2007/signals/boost/dataflow/blueprint/network.hpp                                  |    43 ++++++++                                
   sandbox/SOC/2007/signals/boost/dataflow/blueprint/port.hpp                                     |    39 +++++++-                                
   sandbox/SOC/2007/signals/boost/dataflow/blueprint/port_t.hpp                                   |    16 +-                                      
   sandbox/SOC/2007/signals/boost/dataflow/signals/component/filter.hpp                           |     2                                         
   sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/signal_network.xcodeproj/project.pbxproj |     2                                         
   sandbox/SOC/2007/signals/libs/dataflow/doc/blueprint/blueprint.qbk                             |     5                                         
   sandbox/SOC/2007/signals/libs/dataflow/doc/concepts.qbk                                        |    17 ++-                                     
   sandbox/SOC/2007/signals/libs/dataflow/doc/dataflow.qbk                                        |     2                                         
   sandbox/SOC/2007/signals/libs/dataflow/doc/future.qbk                                          |    15 +++                                     
   sandbox/SOC/2007/signals/libs/dataflow/doc/introduction.qbk                                    |    25 ++--                                    
   sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/blueprint_example.qbk                  |    76 +++++++++++++--                         
   sandbox/SOC/2007/signals/libs/dataflow/doc/phoenix.qbk                                         |     2                                         
   sandbox/SOC/2007/signals/libs/dataflow/example/blueprint/blueprint_example.cpp                 |   182 +++++++++++++++++++++++++-------------- 
   17 files changed, 353 insertions(+), 165 deletions(-)
Modified: sandbox/SOC/2007/signals/boost/dataflow/blueprint/component.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/blueprint/component.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/blueprint/component.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -24,6 +24,8 @@
     virtual void invoke()=0;
     virtual int num_ports() const=0;
     virtual std::auto_ptr<port> get_port(int port_num)=0;
+    
+    virtual std::auto_ptr<component> copy() const=0;
     virtual ~component() {};
 };
 
@@ -33,11 +35,11 @@
 public:
     component_t() {}
     template<typename T0>
-    component_t(const T0 &t0) : component(t0) {}
+    component_t(const T0 &t0) : c(t0) {}
     
     void invoke()
     {
-        component_operation<operations::invoke, Mechanism>(component);
+        component_operation<operations::invoke, Mechanism>(c);
     }
     int num_ports() const
     {
@@ -45,11 +47,15 @@
     }
     std::auto_ptr<port> get_port(int port_num)
     {
-        return blueprint::get_port<Mechanism, Component>(component, port_num);
+        return blueprint::get_port<Mechanism, Component>(c, port_num);
+    }
+    virtual std::auto_ptr<component> copy() const
+    {
+        return std::auto_ptr<component>(new component_t<Mechanism,Component>(*this));
     }
-    Component &get() {return component;}
+    Component &get() {return c;}
 private:
-    Component component;
+    Component c;
 };
 
 } } } // namespace boost::dataflow::blueprint
Modified: sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -15,6 +15,7 @@
 {
 public:
     virtual void connect(port &producer, port &consumer)=0;
+    virtual std::auto_ptr<connection> copy() const=0;
     virtual ~connection() {};
 };
 
Modified: sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection_t.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection_t.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/blueprint/connection_t.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -23,6 +23,10 @@
             *(typename remove_reference<ProducerPort>::type *) producer.get(),
             *(typename remove_reference<ConsumerPort>::type *) consumer.get());
     }
+    virtual std::auto_ptr<connection> copy() const
+    {
+        return std::auto_ptr<connection>(new connection_t(*this));
+    }
 };
 
 } } } // namespace boost::dataflow::blueprint
Modified: sandbox/SOC/2007/signals/boost/dataflow/blueprint/get_port.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/blueprint/get_port.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/blueprint/get_port.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -9,51 +9,38 @@
 #include <boost/dataflow/blueprint/port_t.hpp>
 #include <boost/dataflow/support/reflective_component.hpp>
 
+#include <boost/mpl/range_c.hpp>
+#include <boost/switch.hpp>
+
 #include <memory>
 
 namespace boost { namespace dataflow { namespace blueprint {
 
 namespace detail {
 
-template<typename Mechanism, typename Component, int Ports>
-struct get_port_impl;
-
 template<typename Mechanism, typename Component>
-struct get_port_impl<Mechanism, Component, 2>
+struct get_port_case
 {
-    std::auto_ptr<port> operator()(Component &c, int port_num)
+    typedef void result_type;
+    template<class Case>
+    void operator()(Case) const
     {
-        std::auto_ptr<port> ret;
-        switch(port_num)
-        {
-        case 0:
-            ret.reset(new port_t<
-                typename mpl::at_c<
-                    typename component_traits_of<Mechanism, Component>::type::ports,
-                    0
-                >::type,
-                typename get_component_port_result_type<
-                    Mechanism,
-                    mpl::int_<0>,
-                    Component
-                >::type
-            >(get_component_port<Mechanism, mpl::int_<0>, Component >(c)));
-            break;
-        case 1:
-            ret.reset(new port_t<
-                typename mpl::at_c<
-                    typename component_traits_of<Mechanism, Component>::type::ports,
-                    1
-                >::type,
-                typename get_component_port_result_type<
-                    Mechanism,
-                    mpl::int_<1>,
-                    Component
-                >::type
-            >(get_component_port<Mechanism, mpl::int_<1>, Component>(c)));
-        }
-        return ret;
+        ret.reset(new port_t<
+            typename mpl::at_c<
+                typename component_traits_of<Mechanism, Component>::type::ports,
+                Case::value
+            >::type,
+            typename get_component_port_result_type<
+                Mechanism,
+                mpl::int_<Case::value>,
+                Component
+            >::type
+        >(get_component_port<Mechanism, mpl::int_<Case::value>, Component >(c))); \
     }
+    get_port_case(Component& c, std::auto_ptr<port> &ret) : c(c), ret(ret)
+    {}
+    Component &c;
+    std::auto_ptr<port> &ret;
 };
 
 } // namespace detail
@@ -61,11 +48,15 @@
 template<typename Mechanism, typename Component>
 std::auto_ptr<port> get_port(Component &c, int port_num)
 {
-    return detail::get_port_impl<
-        Mechanism,
-        Component,
-        mpl::size<typename component_traits_of<Mechanism, Component>::type::ports>::value
-    >()(c, port_num);
+    std::auto_ptr<port> ret;
+    typedef mpl::range_c<
+        int,
+        0,
+        mpl::size<
+            typename component_traits_of<Mechanism, Component>::type::ports>
+        ::value> range;
+    boost::switch_<range>(port_num, detail::get_port_case<Mechanism, Component>(c, ret));
+    return ret;
 }
 
 } } } // namespace boost::dataflow::blueprint
Modified: sandbox/SOC/2007/signals/boost/dataflow/blueprint/network.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/blueprint/network.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/blueprint/network.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -10,6 +10,7 @@
 #include <boost/dataflow/blueprint/connection_t.hpp>
 
 #include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/copy.hpp>
 
 #include <exception>
 #include <iostream>
@@ -32,9 +33,42 @@
 public:
     typedef boost::adjacency_list<
         boost::vecS, boost::vecS, boost::bidirectionalS, node_t, edge_t> graph_type;
-
     typedef typename graph_type::vertex_descriptor component_type;
-
+    typedef typename graph_type::edge_descriptor connection_type;
+private:
+    struct vc
+    {
+        vc(const graph_type &g_src, graph_type &g_dst)
+            : g_src(g_src), g_dst(g_dst)
+        {}
+        void operator()(component_type src, component_type &dst)
+        {
+            g_dst[dst].ptr = g_src[src].ptr->copy();
+        }
+        const graph_type &g_src;
+        graph_type &g_dst;
+    };
+    struct ec
+    {
+        ec(const graph_type &g_src, graph_type &g_dst)
+            : g_src(g_src), g_dst(g_dst)
+        {}
+        void operator()(connection_type src, connection_type &dst)
+        {
+            g_dst[dst].ptr = g_src[src].ptr->copy();
+            g_dst[dst].producer_port = g_src[src].producer_port;
+            g_dst[dst].consumer_port = g_src[src].consumer_port;
+        }
+        const graph_type &g_src;
+        graph_type &g_dst;
+    };
+public:
+    network() {}
+    network(const network &n)
+    {
+        copy_graph(n.g, g, vertex_copy(vc(n.g, g)).edge_copy(ec(n.g, g)));
+    }
+    
     template<typename Component>
     component_type add_component()
     {
@@ -66,8 +100,8 @@
         return (
             (typeid(*get_port(p, p_port)->connector().get())
                 == typeid(*get_port(c, c_port)->connector().get()))
-            && (get_port(p, p_port)->category_uuid() == 0)
-            && (get_port(c, c_port)->category_uuid() == 1));
+            && (get_port(p, p_port)->traits().category().uuid() == 0)
+            && (get_port(c, c_port)->traits().category().uuid() == 1));
     }
     void connect()
     {
@@ -89,6 +123,7 @@
     {
         return g;
     }
+    
 private:
     void add_connection_(component_type p, int p_port, component_type c, int c_port,
         boost::shared_ptr<connection>)
Modified: sandbox/SOC/2007/signals/boost/dataflow/blueprint/port.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/blueprint/port.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/blueprint/port.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -7,24 +7,53 @@
 #define BOOST_DATAFLOW_BLUEPRINT_PORT_HPP
 
 #include <boost/shared_ptr.hpp>
+#include <string>
 
 namespace boost { namespace dataflow { namespace blueprint {
 
 class connection;
 
+class port_category
+{
+public:
+    port_category(const std::string &name, int uuid)
+        : name_(name), uuid_(uuid)
+    {}
+
+    const char *name() const
+    {   return name_.c_str(); }
+    int uuid() const
+    {   return uuid_; }
+private:    
+    std::string name_;
+    int uuid_;
+};
+
 class port_traits
 {
 public:
-    virtual const char *category() const=0;
-    virtual int category_uuid() const=0;
-    virtual shared_ptr<connection> connector()=0;
-    virtual ~port_traits() {};
+    port_traits(const port_category &category) : category_(category)
+    {}
+    const port_category &category() const
+    {   return category_;
+    }
+private:
+    port_category category_;
 };
 
-class port : public port_traits
+class port
 {
 public:
+    port(const port_category &category) : traits_(category)
+    {}
+    const port_traits &traits() const
+    {   return traits_; }
+    
     virtual void *get()=0;
+    virtual shared_ptr<connection> connector()=0;
+    virtual ~port() {};
+private:
+    port_traits traits_;
 };
 
 } } } // namespace boost::dataflow::blueprint
Modified: sandbox/SOC/2007/signals/boost/dataflow/blueprint/port_t.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/blueprint/port_t.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/blueprint/port_t.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -59,16 +59,14 @@
 {
     typedef typename PortTraits::mechanism::template runtime_connection<PortTraits>::type connection_type;
 public:
-    port_t(Port p) : p(p), c(new connection_type()){}
+    port_t(Port p)
+        : port(port_category(
+            runtime::property<typename PortTraits::category, const char *>()(),
+            runtime::property<typename PortTraits::category, int>()()))
+        , p(p)
+        , c(new connection_type())
+    {}
     
-    const char * category() const
-    {
-        return runtime::property<typename PortTraits::category, const char *>()();
-    }
-    int category_uuid() const
-    {
-        return runtime::property<typename PortTraits::category, int>()();
-    }
     void *get()
     {
         return &p;
Modified: sandbox/SOC/2007/signals/boost/dataflow/signals/component/filter.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/signals/component/filter.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/signals/component/filter.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -94,6 +94,8 @@
     typedef filter<Signature, unfused, Combiner, Group, GroupCompare> base_type;
 public:
     filter() : fused_out(base_type::out) {}
+	filter(const filter &) : fused_out(base_type::out){}
+    const filter &operator = (const filter &) {return *this;}
 
     typedef typename base_type::signature_type signature_type;
     typedef typename base_type::signal_type signal_type;
Added: sandbox/SOC/2007/signals/boost/switch.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/signals/boost/switch.hpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -0,0 +1,129 @@
+// switch.hpp
+//
+// Copyright (c) 2006-2007
+// Steven Watanabe
+//
+// Distriuted 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_SWITCH_HPP_INCLUDED
+#define BOOST_SWITCH_HPP_INCLUDED
+
+#include <stdexcept>
+#include <string>
+#include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/preprocessor/config/limits.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/at.hpp>
+
+#ifndef BOOST_SWITCH_LIMIT
+    #define BOOST_SWITCH_LIMIT 50
+#endif
+
+#if BOOST_SWITCH_LIMIT > BOOST_PP_LIMIT_REPEAT
+    #error BOOST_SWITCH_LIMIT exceeds Boost.Preprocessor limit
+#endif
+#if BOOST_SWITCH_LIMIT > BOOST_PP_LIMIT_ITERATION
+    #error BOOST_SWITCH_LIMIT exceeds Boost.Preprocessor limit
+#endif
+
+namespace boost {
+
+class bad_switch : public std::runtime_error {
+public:
+    template<class Int>
+    explicit bad_switch(Int v) :
+        std::runtime_error(
+            "boost::switch_ default case called -- none provided. value is: " +
+            boost::lexical_cast<std::string>(v)) {}
+};
+
+namespace switch_detail {
+
+// Avoid the need to create all the specializations of switch_impl
+// twice. Just pass this to switch_impl<N>::apply(...) when no
+// default is supplied.
+
+template<class R>
+R forced_return(R* r = 0) {
+    return(*r);
+}
+
+// Thanks to Stjepan Rajko for catching this.
+template<>
+void forced_return<void>(void*) {}
+
+template<class R>
+struct throw_exception {
+    template<class Int>
+    R operator()(Int i) const {
+        boost::throw_exception(bad_switch(i));
+        return(switch_detail::forced_return<R>());
+    }
+};
+
+// N is the number of cases not including the default
+template<int N>
+struct switch_impl;
+
+// specialize for 0 separately to avoid warnings
+template<>
+struct switch_impl<0> {
+    template<class V, class Int, class F, class Default>
+    static typename F::result_type
+    apply(Int i, F, Default d BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(V)) {
+        return(d(i));
+    }
+};
+
+#define BOOST_SWITCH_CASE(z, n, data)                   \
+    case boost::mpl::at_c<data, n>::type::value: {      \
+        typename boost::mpl::at_c<data, n>::type arg;   \
+        return(f(arg));                                 \
+    }
+
+#define BOOST_SWITCH_IMPL(z, n, data)                                   \
+    template<>                                                          \
+    struct switch_impl<n> {                                             \
+        template<class V, class I, class F, class D>                    \
+        static typename F::result_type                                  \
+        apply(I i, F f, D d BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(V)) {   \
+            switch(i) {                                                 \
+                BOOST_PP_REPEAT_##z(n, BOOST_SWITCH_CASE, V)            \
+                default: return(d(i));                                  \
+            }                                                           \
+        }                                                               \
+    };
+
+#define BOOST_PP_LOCAL_LIMITS (1, BOOST_SWITCH_LIMIT)
+#define BOOST_PP_LOCAL_MACRO(n) BOOST_SWITCH_IMPL(1, n, ~)
+#include BOOST_PP_LOCAL_ITERATE()
+
+#undef BOOST_SWITCH_IMPL
+#undef BOOST_SWITCH_CASE
+
+}
+
+template<class V, class N, class F>
+inline typename F::result_type
+switch_(N n, F f BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(V)) {
+    typedef switch_detail::switch_impl<boost::mpl::size<V>::value> impl;
+    switch_detail::throw_exception<typename F::result_type> default_;
+    return(impl::template apply<V>(n, f, default_));
+}
+
+template<class V, class N, class F, class D>
+inline typename F::result_type
+switch_(N n, F f, D d BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(V)) {
+    typedef switch_detail::switch_impl<boost::mpl::size<V>::value> impl;
+    return(impl::template apply<V>(n, f, d));
+}
+
+}
+
+#endif
Modified: sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/signal_network.xcodeproj/project.pbxproj
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/signal_network.xcodeproj/project.pbxproj	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/signal_network.xcodeproj/project.pbxproj	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -482,10 +482,10 @@
                                 08F265450CEAC26F00DA01C9 /* component.hpp */,
                                 08BD9AFB0CEB9D330069AFE2 /* get_port.hpp */,
                                 08BD9B090CEB9E3D0069AFE2 /* port.hpp */,
+				08EF045E0CEBF1AD002ABBBC /* port_t.hpp */,
                                 08256FE60CEBDFEC003EC1B4 /* network.hpp */,
                                 08EF04520CEBF0EE002ABBBC /* connection.hpp */,
                                 08EF04590CEBF153002ABBBC /* connection_t.hpp */,
-				08EF045E0CEBF1AD002ABBBC /* port_t.hpp */,
                         );
                         path = blueprint;
                         sourceTree = "<group>";
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/blueprint/blueprint.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/blueprint/blueprint.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/blueprint/blueprint.qbk	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -12,8 +12,9 @@
 embedded in a BGL graph. A dataflow network blueprint uses such a graph
 to hold the blueprint components and the connectivity information.
 In addition, blueprint components provide run-time port reflection.
-In the future, the bluprint layer will be expanded to support serialization,
-copying, and other features.
+In the future, the bluprint layer will be expanded to support serialization
+and other features.  More details are in the [link dataflow.future.blueprint
+future work section].
 
 The [DataflowBlueprint] layer is built on top of the Dataflow library 
 [concepts].  Hence, it can be used with any mechanism for which a Dataflow
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/concepts.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/concepts.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/concepts.qbk	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -85,7 +85,7 @@
 
 Operations between two ports such as /connect/, /connect_only/, /disconnect/,
 and /extract/ are captured by the [BinaryOperable] concept.  Operations
-on a single port such as /disconnect_all/ are covered by the [UnaryOperable]
+on a single port such as /disconnect_all/ are covered by the [UnaryOperableConcept]
 concept.
 
 [/
@@ -292,6 +292,10 @@
 
 A ['[ReflectiveComponentTraitsConcept]] specifies the traits of a [ReflectiveComponentConcept].
 
+[heading Refinement of]
+
+* [ComponentTraitsConcept]
+
 [heading Notation]
 [variablelist
     [[CT] [A ReflectiveComponentTraits type.]]
@@ -303,16 +307,19 @@
     [[Name] [Expression] [Result Type] [Semantics]]
     [
         [Mechanism]
-        [`PC::mechanism`]
-        [any type]
-        [[MechanismConcept] type tag.]
+        [`PC::ports`]
+        [MPL Sequence of [PortTraitsConcept] types]
+        [
+            An enumeration of the [PortTraitsConcept] of the exposed
+            [PortConcept]s.
+        ]
     ]
 ]
 
 [heading Header]
 
 ```
-    #include <boost/dataflow/support/component.hpp> // or
+    #include <boost/dataflow/support/reflective_component.hpp> // or
     #include <boost/dataflow/support.hpp>
 ```
 
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/dataflow.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/dataflow.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/dataflow.qbk	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -25,7 +25,7 @@
 
 [template ComponentTraitsConcept[] [link dataflow.concepts.componenttraits [^ComponentTraits]]]
 [template ComponentConcept[] [link dataflow.concepts.component [^Component]]]
-[template ReflectiveComponentTraitsConcept[] [link dataflow.concepts.reflecivecomponenttraits [^ReflectiveComponentTraits]]]
+[template ReflectiveComponentTraitsConcept[] [link dataflow.concepts.reflectivecomponenttraits [^ReflectiveComponentTraits]]]
 [template ReflectiveComponentConcept[] [link dataflow.concepts.reflectivecomponent [^ReflectiveComponent]]]
 
 [template BinaryOperableConcept[] [link dataflow.concepts.binaryoperable [^BinaryOperable]]]
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/future.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/future.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/future.qbk	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -2,6 +2,19 @@
 
 [section:blueprint Expanding the blueprint layer]
 
+The [DataflowBlueprint] layer now offers some limited dataflow network modeling
+via a BGL graph, and some basic runtime reflections for classes that model
+the [ReflectiveComponentConcept] concept.
+
+The following features are planned for the future:
+
+* *Serialization* - It should be possible to serialize and deserialize a
+  network blueprint. This could be used to store datafow programs, or to send
+  them over the network.
+  
+* *Component banks* - Banks of components which can be accessed at runtime.
+
+* *Documentation* - non-existant at this point...
 
 [endsect]
 
@@ -16,7 +29,7 @@
 based on the [@http://vcreatelogic.com/oss/gcf/index.html Generic
 Component Framework] and is released under the GNU GPL license.
 
-Once the [blueprint] layer is built, it might be possible to integrate
+Once the [DataflowBlueprint] layer is completed, it might be possible to integrate
 it with the Generic Component Framework to get a visual programming
 environment for the Dataflow library.
 
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/introduction.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/introduction.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/introduction.qbk	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -1,5 +1,11 @@
 [section:introduction Introduction]
 
+[warning Dataflow is not a part of the Boost libraries.  It was developed
+as a part of the Google Summer of Code program.  The original proposal (for
+the Signal Network library, which became the Dataflow library)
+as well as some GSoC status updates can be found on the
+[@http://svn.boost.org/trac/boost/wiki/soc/2007/SignalNetwork GSoC page].]
+
 Dataflow is a generic library for [WikiDataflow] programming using various data
 transport mechanisms.  It also has layers of support for
 two data transport mechanisms - one is based on
@@ -11,13 +17,8 @@
 The two data transport mechanisms are implemented in the [DataflowSignals]
 and [DataflowPhoenix] layers.  The idea behind providing a generic dataflow
 library is that other data transport mechanisms can be easily adapted for
-use with the library.
-
-[warning Dataflow is not a part of the Boost libraries.  It is being developed
-as a part of the Google Summer of Code program.  The original proposal (for
-the Signal Network library, which became the Dataflow library)
-as well as some status updates can be found on the
-[@http://svn.boost.org/trac/boost/wiki/soc/2007/SignalNetwork GSoC page].]
+use with the library, and benefit from layers built on top of it
+(such as the recently started [DataflowBlueprint] layer).
 
 * If you would like some more information about why one would want to connect
   objects into a dataflow network, read about
@@ -25,7 +26,6 @@
 * If you'd like to try out the library
     * keep in mind that the interface is subject to change
     * Read [how_to_use how to use this library and the documentation].
-    
 
 [section:dataflow Dataflow programming in C++ - motivation and advantages]
 
@@ -206,7 +206,8 @@
 Currently, the most useful functionality gained by developing a Dataflow
 support layer is the ability to connect components in a clean, readable
 manner. As more generic code is developed on top of
-the generic dataflow layer, providing a Dataflow support layer for your
+the generic dataflow layer (such as the recently started [DataflowBlueprint]),
+providing a Dataflow support layer for your
 favorite data transport mechanism will be more beneficial.
 
 See the [link dataflow.future future directions] of the Dataflow library
@@ -368,9 +369,9 @@
 
 Version 0.8.1 (under construction)
 
-* started the [DataflowBlueprint] layer.
-* expanding the [ComponentConcept] concept.
-* making VTK example Jamfile work for more than Darwin and X11.
+* started the [DataflowBlueprint] layer (simple runtime reflection and network modeling).
+* expanding the [ComponentConcept] concept (compile-time reflection of ports).
+* VTK example Jamfile now works work with Windows (not just Darwin+X11 VTK).
 * provided an example using Boost.GIL.
 
 Version 0.8.0 -
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/blueprint_example.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/blueprint_example.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/blueprint_example.qbk	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -2,31 +2,81 @@
 
 The (recently started) [DataflowBlueprint] layer offers run-time reflection
 of components and modeling of
-a dataflow network through a BGL graph.  The following example briefly
-illustrates some of the capabilities:
+a dataflow network through a BGL graph.  Here is the output of a small example
+which briefly illustrates some of the capabilities:
 
-[blueprint_example]
-
-The output is:
 
 [pre
-source has 2 ports. 
-  port 0 is a producer
-  port 1 is a consumer
+Printing runtime info about all of the components:
+
+	source has 2 ports. 
+		port 0 is a producer
+		port 1 is a consumer
+
+	sink has 2 ports. 
+		port 0 is a producer
+		port 1 is a consumer
+
+	source_float has 2 ports. 
+		port 0 is a producer
+		port 1 is a consumer
+
+	sink_float has 2 ports. 
+		port 0 is a producer
+		port 1 is a consumer
 
 source port 0 is connectable to sink port 1
 source port 1 is not connectable to sink port 0
 source port 0 is not connectable to sink port 0
 source port 0 is not connectable to sink_float port 1
 
-Blueprint connecting source to sink, source_float to sink_float...
+Making blueprint connections: source to sink, source_float to sink_float...
 
 Using BGL to analyze the network... There are 2 independent parts of the network.
 
-Making the connections...
-Invoking the sources...
-sink now has:100
-sink_float now has:100.1
+Making a copy of the blueprint.
+
+Testing the original network...
+
+	Values at components:
+		value at source:100
+		value at sink:0
+		value at source_float:100.1
+		value at sink_float:0
+
+	Connecting the underlying components in the network...
+	Invoking the sources...
+
+	Values at components:
+		value at source:100
+		value at sink:100
+		value at source_float:100.1
+		value at sink_float:100.1
+
+Testing the network copy...
+
+	Values at components:
+		value at source:100
+		value at sink:0
+		value at source_float:100.1
+		value at sink_float:0
+
+	Connecting the underlying components in the network...
+	Invoking the sources...
+
+	Values at components:
+		value at source:100
+		value at sink:100
+		value at source_float:100.1
+		value at sink_float:100.1
+
+
+blueprint_example release has exited with status 0.
 ]
 
+The source is:
+
+[blueprint_example]
+
+
 [endsect]
\ No newline at end of file
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/phoenix.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/phoenix.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/phoenix.qbk	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -1,6 +1,6 @@
 [section:phoenix Dataflow.Phoenix]
 
-[include phoenix/concepts.qbk]
+[/[include phoenix/concepts.qbk]]
 
 The [DataflowPhoenix] module uses ordinary object pointers to establish
 a flow of data.  It has been named after the Phoenix library because
Modified: sandbox/SOC/2007/signals/libs/dataflow/example/blueprint/blueprint_example.cpp
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/example/blueprint/blueprint_example.cpp	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/example/blueprint/blueprint_example.cpp	2007-11-17 22:15:39 EST (Sat, 17 Nov 2007)
@@ -9,7 +9,6 @@
 #include <boost/dataflow/signals/component/storage.hpp>
 #include <boost/dataflow/signals/runtime_support.hpp>
 
-#include <boost/graph/copy.hpp>
 #include <boost/graph/connected_components.hpp>
 
 #include <iostream>
@@ -19,80 +18,131 @@
 
 using namespace boost;
 
-int main()
+class blueprint_example
 {
     typedef blueprint::network<df::signals::mechanism> network_type;
-    
-    // Start with the network.
+
+    // The network.
     network_type network;
 
-    // Add the components.
-    network_type::component_type
+    // The components (graph indices).
+    network_type::component_type source, sink, source_float, sink_float;
+
+public:
+    blueprint_example()
+    {
+        // Add the components to the network.
         source = network.add_component<signals::storage<void(int)> >(100),
         sink = network.add_component<signals::storage<void(int)> >(0),
         source_float = network.add_component<signals::storage<void(float)> >(100.1f),
         sink_float = network.add_component<signals::storage<void(float)> >(0.0f);
-    
-    // Print some runtime info
-    std::cout << "source has " << network[source].num_ports() << " ports. " << std::endl;
-    for (int i=0; i<network[source].num_ports(); i++)
-        std::cout << "  port " << i << " is a "
-            << (network.get_port(source, i)->category()) << std::endl;
-    std::cout << std::endl;
-
-    std::cout
-        << "source port 0 is "
-        << (network.are_connectable(source, 0, sink, 1) ? "" : "not ")
-        << "connectable to sink port 1" << std::endl;
-
-    std::cout
-        << "source port 1 is "
-        << (network.are_connectable(source, 1, sink, 0) ? "" : "not ")
-        << "connectable to sink port 0" << std::endl;
-    
-    std::cout
-        << "source port 0 is "
-        << (network.are_connectable(source, 0, sink, 0) ? "" : "not ")
-        << "connectable to sink port 0" << std::endl;
-
-    std::cout
-        << "source port 0 is "
-        << (network.are_connectable(source, 0, sink_float, 1) ? "" : "not ")
-        << "connectable to sink_float port 1" << std::endl;
-
-    // Make some connections
-    std::cout << std::endl << "Blueprint connecting source to sink, source_float to sink_float..." << std::endl;
-    network.add_connection(source, 0, sink, 1);
-    network.add_connection(source_float, 0, sink_float, 1);
-    
-    // Do some analysis on the connectivity graph
-    typedef boost::adjacency_list<
-        boost::vecS, boost::vecS, boost::undirectedS> ugraph_type;
-        
-    ugraph_type g;
-    copy_graph(network.graph(), g);
-    std::vector<int> component(num_vertices(g));
-    std::cout << std::endl << "Using BGL to analyze the network... There are "
-        << connected_components(g, &component[0])
-        << " independent parts of the network." << std::endl << std::endl;
-    
-    // Connect the underlying components
-    std::cout << "Making the connections..." << std::endl;    
-    network.connect();
-    
-    // Invoke the sources
-    std::cout << "Invoking the sources..." << std::endl;
-    network[source].invoke();
-    network[source_float].invoke();
-
-    // Output the values at the sinks:
-    std::cout << "sink now has:"
-        << ((blueprint::component_t<df::signals::mechanism, signals::storage<void(int)> > &)
-            network[sink]).get().at<0>() << std::endl;
-    std::cout << "sink_float now has:"
-        << ((blueprint::component_t<df::signals::mechanism, signals::storage<void(float)> > &)
-        network[sink_float]).get().at<0>() << std::endl;
+    }
+    void run()
+    {
+        // Print some runtime port info
+        std::cout << "Printing runtime info about all of the components:" << std::endl  << std::endl;
+        print_port_info("source", source);
+        print_port_info("sink", sink);
+        print_port_info("source_float", source_float);
+        print_port_info("sink_float", sink_float);
+        
+        // Print some runtime connectability info
+        print_connectability_info("source", source, 0, "sink", sink, 1);
+        print_connectability_info("source", source, 1, "sink", sink, 0);
+        print_connectability_info("source", source, 0, "sink", sink, 0);
+        print_connectability_info("source", source, 0, "sink_float", sink_float, 1);
+        std::cout << std::endl;
+        
+        // Make some connections
+        std::cout << "Making blueprint connections: source to sink, source_float to sink_float..." << std::endl;
+        network.add_connection(source, 0, sink, 1);
+        network.add_connection(source_float, 0, sink_float, 1);
+    
+        // Do some analysis on the connectivity graph
+        typedef boost::adjacency_list<
+            boost::vecS, boost::vecS, boost::undirectedS> ugraph_type;
+            
+        ugraph_type g;
+        copy_graph(network.graph(), g);
+        std::vector<int> component(num_vertices(g));
+        std::cout << std::endl << "Using BGL to analyze the network... There are "
+            << connected_components(g, &component[0])
+            << " independent parts of the network." << std::endl << std::endl;
+        
+        // Copy the network
+        std::cout << "Making a copy of the blueprint." << std::endl << std::endl;
+        network_type network_copy(network);
+        
+        std::cout << "Testing the original network..." << std::endl << std::endl;
+        test_network(network);
+        std::cout << "Testing the network copy..." << std::endl << std::endl;
+        test_network(network_copy);
+    }
+    void print_port_info(const char *c_name, network_type::component_type c)
+    {
+        std::cout << "\t" << c_name << " has " << network[c].num_ports() << " ports. " << std::endl;
+        for (int i=0; i<network[c].num_ports(); i++)
+            std::cout << "\t\tport " << i << " is a "
+                << (network.get_port(c, i)->traits().category().name()) << std::endl;
+        std::cout << std::endl;
+    }
+    void print_connectability_info(
+        const char *src_name, network_type::component_type src, size_t src_port,
+        const char *dst_name, network_type::component_type dst, size_t dst_port)
+    {
+        std::cout
+            << src_name << " port " << src_port << " is "
+            << (network.are_connectable(src, src_port, dst, dst_port) ? "" : "not ")
+            << "connectable to " << dst_name << " port " << dst_port << std::endl;
+    }
+
+    template<typename T>
+    void output_component_value(
+        network_type &network, const char *c_name, typename network_type::component_type c)
+    {
+        typedef blueprint::component_t<df::signals::mechanism, signals::storage<void(T)> > & c_type;
+        
+        std::cout << "\t\tvalue at " << c_name << ":"
+            << static_cast<c_type>(network[c]).get()
+            .template at<0>()
+            << std::endl;
+    }
+    void output_component_values(network_type &network)
+    {
+        std::cout << "\tValues at components:" << std::endl;    
+        output_component_value<int>(network, "source", source);
+        output_component_value<int>(network, "sink", sink);
+        output_component_value<float>(network, "source_float", source_float);
+        output_component_value<float>(network, "sink_float", sink_float);
+        std::cout << std::endl;
+    }
+
+    void test_network(network_type &network)
+    {
+        // Output the values at the components:
+        output_component_values(network);
+
+        // Connect the underlying components
+        std::cout << "\tConnecting the underlying components in the network..." << std::endl;    
+        network.connect();
+        
+        // Invoke the sources
+        std::cout << "\tInvoking the sources..." << std::endl;
+        network[source].invoke();
+        network[source_float].invoke();
+        std::cout << std::endl;
+        
+        // Output the values at the sinks:
+        output_component_values(network);
+    }
+};
 
+int main()
+{
+    blueprint_example example;
+    example.run();
+    
+    return 0;
 }
 
 //]
\ No newline at end of file