$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: stipe_at_[hidden]
Date: 2008-03-14 01:09:09
Author: srajko
Date: 2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
New Revision: 43598
URL: http://svn.boost.org/trac/boost/changeset/43598
Log:
binary operations propagate return value, added tracking_call_consumer example
Added:
   sandbox/SOC/2007/signals/libs/dataflow/example/signals/tracking_consumer_example.cpp   (contents, props changed)
   sandbox/SOC/2007/signals/libs/dataflow/test/signals/test_connect_result.cpp   (contents, props changed)
Text files modified: 
   sandbox/SOC/2007/signals/boost/dataflow/signals/support.hpp                              |     6 +++---                                  
   sandbox/SOC/2007/signals/boost/dataflow/support/binary_operation.hpp                     |    26 ++++++++++++++++++++++++--              
   sandbox/SOC/2007/signals/boost/dataflow/support/keyed_port.hpp                           |    38 +++++++++++++++++++++++++++++++-------  
   sandbox/SOC/2007/signals/boost/dataflow/templates/binary_operation.hpp                   |    32 ++++++++++++++++++++++++--------        
   sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/dataflow.xcodeproj/project.pbxproj |     4 ++++                                    
   sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/introduction.qbk                 |     8 ++++++++                                
   sandbox/SOC/2007/signals/libs/dataflow/example/signals/Jamfile.v2                        |     3 ++-                                     
   sandbox/SOC/2007/signals/libs/dataflow/test/signals/Jamfile.v2                           |     1 +                                       
   sandbox/SOC/2007/signals/libs/dataflow/test/signals/test_disconnect.cpp                  |    13 +++++++++++--                           
   9 files changed, 108 insertions(+), 23 deletions(-)
Modified: sandbox/SOC/2007/signals/boost/dataflow/signals/support.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/signals/support.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/signals/support.hpp	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -127,12 +127,12 @@
     template<typename T>
     struct binary_operation_impl<signals::producer<T>, signals::consumer<T>, operations::connect>
     {
-        typedef void result_type;
+        typedef boost::signals::connection result_type;
         
         template<typename Producer, typename Consumer>
-        void operator()(Producer &producer, Consumer &consumer)
+        result_type operator()(Producer &producer, Consumer &consumer)
         {
-            producer.connect(consumer);
+            return producer.connect(consumer);
         }
     };
     
Modified: sandbox/SOC/2007/signals/boost/dataflow/support/binary_operation.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/support/binary_operation.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/support/binary_operation.hpp	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -25,11 +25,33 @@
 
 namespace boost { namespace dataflow {
 
+namespace result_of
+{
+    template<typename OutgoingPort, typename IncomingPort, typename Operation, typename Mechanism, typename Tag>
+    struct default_binary_operation
+    {
+        typedef typename result_of::binary_operation<
+            typename boost::remove_reference<typename result_of::get_default_port<OutgoingPort, args::left, Mechanism, Tag>::type>::type,
+            typename boost::remove_reference<typename result_of::get_default_port<IncomingPort, args::right, Mechanism, Tag>::type>::type,
+            Operation,
+            Tag>::type type;
+/*        typedef
+            typename boost::result_of<
+                extension::binary_operation_impl<
+                    typename default_traits_of<OutgoingPort, args::left, Mechanism, Tag>::type,
+                    typename default_traits_of<IncomingPort, args::right, Mechanism, Tag>::type,
+                    Operation>(
+                        typename utility::forwardable<typename result_of::get_default_port<OutgoingPort, args::left, Mechanism, Tag>::type>::type,
+                        typename utility::forwardable<typename result_of::get_default_port<IncomingPort, args::right, Mechanism, Tag>::type>::type)
+            >::type type;*/
+    };
+}
+
 template<typename Operation, typename Mechanism, typename Tag, typename OutgoingPort, typename IncomingPort>
-inline void
+inline typename result_of::default_binary_operation<OutgoingPort, IncomingPort, Operation, Mechanism, Tag>::type
 default_binary_operation(OutgoingPort &left, IncomingPort &right)
 {
-    extension::binary_operation_impl<
+    return extension::binary_operation_impl<
         typename default_traits_of<OutgoingPort, args::left, Mechanism, Tag>::type,
         typename default_traits_of<IncomingPort, args::right, Mechanism, Tag>::type,
         Operation>
Modified: sandbox/SOC/2007/signals/boost/dataflow/support/keyed_port.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/support/keyed_port.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/support/keyed_port.hpp	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -109,12 +109,24 @@
 //            has_keyed_port<port<ProducerTag>, ConsumerTag, typename ProducerTag::tag>
         >::type >
     {
-        typedef void result_type;
+        template<typename FArgs>
+        struct result;
+        
+        template<typename F, typename Producer, typename Consumer>
+        struct result<F(Producer &, Consumer &)>
+        {
+            typedef typename result_of::binary_operation<
+               typename remove_reference<typename result_of::get_keyed_port<Producer, ConsumerTag, typename ProducerTag::tag>::type>::type,
+                Consumer,
+                Operation,
+                typename ConsumerTag::tag
+            >::type type;
+        };
         
         template<typename Producer, typename Consumer>
-        void operator()(Producer &producer, Consumer &consumer)
+        typename result<binary_operation_impl(Producer &, Consumer &)>::type operator()(Producer &producer, Consumer &consumer)
         {
-            binary_operation<Operation, typename ConsumerTag::tag>
+            return binary_operation<Operation, typename ConsumerTag::tag>
                 (get_keyed_port<ConsumerTag, typename ProducerTag::tag>(producer), consumer);
         }
     };
@@ -126,12 +138,24 @@
 //            has_keyed_port<port<ConsumerTag>, ProducerTag, typename ConsumerTag::tag>
         >::type >
     {
-        typedef void result_type;
-
+        template<typename FArgs>
+        struct result;
+        
+        template<typename F, typename Producer, typename Consumer>
+        struct result<F(Producer &, Consumer &)>
+        {
+            typedef typename result_of::binary_operation<
+                Producer,
+                typename remove_reference<typename result_of::get_keyed_port<Consumer, ProducerTag, typename ConsumerTag::tag>::type>::type,
+                Operation,
+                typename ProducerTag::tag
+            >::type type;
+        };
+        
         template<typename Producer, typename Consumer>
-        void operator()(Producer &producer, Consumer &consumer)
+        typename result<binary_operation_impl(Producer &, Consumer &)>::type operator()(Producer &producer, Consumer &consumer)
         {
-            binary_operation<Operation, typename ProducerTag::tag>
+            return binary_operation<Operation, typename ProducerTag::tag>
                 (producer, get_keyed_port<ProducerTag, typename ConsumerTag::tag>(consumer));
         }
     };
Modified: sandbox/SOC/2007/signals/boost/dataflow/templates/binary_operation.hpp
==============================================================================
--- sandbox/SOC/2007/signals/boost/dataflow/templates/binary_operation.hpp	(original)
+++ sandbox/SOC/2007/signals/boost/dataflow/templates/binary_operation.hpp	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -15,25 +15,41 @@
 #endif
 
 template<typename Producer, typename Consumer>
-inline void DATAFLOW_TEMPLATE_BINARY_OPERATION(Producer &producer, Consumer &consumer)
+inline typename boost::dataflow::result_of::default_binary_operation<
+    Producer, Consumer, 
+    boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG
+>::type
+    DATAFLOW_TEMPLATE_BINARY_OPERATION(Producer &producer, Consumer &consumer)
 {
-    boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
+    return boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
 }
 
 template<typename Producer, typename Consumer>
-inline void DATAFLOW_TEMPLATE_BINARY_OPERATION(Producer &producer, const Consumer &consumer)
+inline typename boost::dataflow::result_of::default_binary_operation<
+    Producer, const Consumer, 
+    boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG
+>::type
+     DATAFLOW_TEMPLATE_BINARY_OPERATION(Producer &producer, const Consumer &consumer)
 {
-    boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
+    return boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
 }
 
 template<typename Producer, typename Consumer>
-inline void DATAFLOW_TEMPLATE_BINARY_OPERATION(const Producer &producer, Consumer &consumer)
+inline typename boost::dataflow::result_of::default_binary_operation<
+    const Producer, Consumer, 
+    boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG
+>::type
+     DATAFLOW_TEMPLATE_BINARY_OPERATION(const Producer &producer, Consumer &consumer)
 {
-    boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
+    return boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
 }
 
 template<typename Producer, typename Consumer>
-inline void DATAFLOW_TEMPLATE_BINARY_OPERATION(const Producer &producer, const Consumer &consumer)
+inline typename boost::dataflow::result_of::default_binary_operation<
+    const Producer, const Consumer, 
+    boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG
+>::type
+     DATAFLOW_TEMPLATE_BINARY_OPERATION(const Producer &producer, const Consumer &consumer)
 {
-    boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
+    return boost::dataflow::default_binary_operation< boost::dataflow::operations::DATAFLOW_TEMPLATE_BINARY_OPERATION, DATAFLOW_TEMPLATE_MECHANISM, DATAFLOW_TEMPLATE_TAG >(producer, consumer);
 }
Modified: sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/dataflow.xcodeproj/project.pbxproj
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/dataflow.xcodeproj/project.pbxproj	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/build/xcodeide/dataflow.xcodeproj/project.pbxproj	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -91,6 +91,8 @@
                 0815AEC90D0B814E007ED135 /* test_complemented_port.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_complemented_port.cpp; sourceTree = "<group>"; };
                 08256FE60CEBDFEC003EC1B4 /* network.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = network.hpp; sourceTree = "<group>"; };
                 082761BE0C6037A90030E557 /* invocable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = invocable.hpp; sourceTree = "<group>"; };
+		083F14A50D8A250700D0F8B7 /* test_connect_result.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_connect_result.cpp; sourceTree = "<group>"; };
+		083F151E0D8A356500D0F8B7 /* tracking_consumer_example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tracking_consumer_example.cpp; sourceTree = "<group>"; };
                 083FD3B90C62A4CB00EF3F6B /* concepts.qbk */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = concepts.qbk; sourceTree = "<group>"; };
                 083FD3C10C62A75B00EF3F6B /* concepts.qbk */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = concepts.qbk; sourceTree = "<group>"; };
                 083FD3C60C62A7F600EF3F6B /* phoenix.qbk */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = phoenix.qbk; sourceTree = "<group>"; };
@@ -760,6 +762,7 @@
                                 08F71D500CA3547C0010099E /* test_storage.cpp */,
                                 08FBDA3A0CD272ED00CC3891 /* test_multiplexer.cpp */,
                                 089B93720D5AA99700F6EEAA /* test_filter_base.cpp */,
+				083F14A50D8A250700D0F8B7 /* test_connect_result.cpp */,
                         );
                         path = signals;
                         sourceTree = "<group>";
@@ -774,6 +777,7 @@
                                 08F98B470CD01963009D642B /* intro_example.cpp */,
                                 084D2E6E0CE7DFE900E861FA /* gil_example.cpp */,
                                 08A0E54C0D7A7674009B11DD /* quick_start_examples.cpp */,
+				083F151E0D8A356500D0F8B7 /* tracking_consumer_example.cpp */,
                         );
                         path = signals;
                         sourceTree = "<group>";
Modified: sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/introduction.qbk
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/introduction.qbk	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/doc/introduction/introduction.qbk	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -403,6 +403,14 @@
 The Dataflow library uses the trunk version of Boost - it might not work
 perfectly with release versions of boost.
 
+Version 0.9.1 (under development)
+* Generic Dataflow layer
+ * binary operations now propagate the return value
+
+* [DataflowSignals]
+ * [connect] now returns the `signals::connection` object
+ * added tracking_call_consumer example
+
 Version 0.9.0
  \[[@http://www.boost-consulting.com/vault/index.php?direction=&order=&directory=Dataflow& available in the Boost vault]\]
 
Modified: sandbox/SOC/2007/signals/libs/dataflow/example/signals/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/example/signals/Jamfile.v2	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/example/signals/Jamfile.v2	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -17,4 +17,5 @@
     /boost/thread//boost_thread/<link>static
     /boost/system//boost_system/<link>static ;
 exe gil_example : gil_example.cpp /boost/thread//boost_thread/<link>static ;
-exe quick_start_examples : quick_start_examples.cpp ;
\ No newline at end of file
+exe quick_start_examples : quick_start_examples.cpp ;
+exe tracking_consumer_example : tracking_consumer_example.cpp ;
\ No newline at end of file
Added: sandbox/SOC/2007/signals/libs/dataflow/example/signals/tracking_consumer_example.cpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/signals/libs/dataflow/example/signals/tracking_consumer_example.cpp	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -0,0 +1,113 @@
+// Copyright 2008 Stjepan Rajko.
+// 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/dataflow/signals/component/storage.hpp>
+
+#include <boost/foreach.hpp>
+
+#include <iostream>
+
+namespace boost { namespace dataflow {
+
+namespace signals {
+
+    // we're making a new PortTraits for a operator() consumer that can track
+    struct tracking_call_consumer
+        : public port_traits<ports::consumer, tag>
+    {};
+
+} // namespace signals
+
+namespace extension {
+
+    // here we specialize the connect operation
+    template<typename T>
+    struct binary_operation_impl<signals::producer<T>, signals::tracking_call_consumer, operations::connect>
+    {
+        typedef boost::signals::connection result_type;
+        
+        template<typename Producer, typename Consumer>
+        result_type operator()(Producer &producer, Consumer &consumer)
+        {
+            // object_type is so that a port_adapter can be used on the consumer
+            typedef typename get_object_type<Consumer>::type object_type;
+            typedef typename boost::dataflow::utility::slot_type<T, object_type>::type mem_fn_type;
+            
+            // grab the correct overload of operator()
+            boost::function<T> mem_fn = boost::dataflow::utility::bind_mem_fn<mem_fn_type, object_type>
+                (static_cast<mem_fn_type>(&object_type::operator()), get_object(consumer));
+
+            // make the connection, register it with the consumer
+            result_type connection = producer.connect(mem_fn);
+            get_object(consumer).register_connection(connection);
+            return connection;
+        }
+    };
+    
+} // namespace extension
+
+} } // namespace boost::dataflow
+
+using namespace boost;
+namespace df = boost::dataflow;
+
+// simple consumer that tracks its connections - when it receives a specified
+// number of signals, it will disconnect itself from all producers
+class trackable_consumer
+    : public df::port<df::signals::tracking_call_consumer>
+{
+public:
+    trackable_consumer(unsigned max_count)
+        : m_count(0), m_max_count(max_count)
+    {}
+    
+    void operator()()
+    {
+        m_count++;
+        if (m_count >= m_max_count)
+            disconnect_all();
+    }
+    
+    void register_connection(const signals::connection &connection)
+    {   m_connections.push_back(connection); }
+    
+    unsigned count()
+    {   return m_count; }
+    
+private:
+    void disconnect_all()
+    {
+        BOOST_FOREACH(signals::connection &c, m_connections)
+            c.disconnect();
+        m_connections.clear();
+    }
+        
+    typedef std::vector<signals::connection> connections_type;
+    connections_type m_connections;
+    unsigned m_count, m_max_count;
+};
+
+int main(int, char* [])
+{
+    signals::storage<void()> producer;
+    trackable_consumer c1(1), c3(3), c5(5);
+    
+    connect(producer, c1);
+    connect(producer, c3);
+    connect(producer, c5);
+
+    // send out 5 signals.  c1 should disconnect after 1, c3 after 3, c5 after 5
+    for(int i=0; i<5; i++)
+        producer();
+        
+    std::cout << c1.count() << std::endl; // 1
+    std::cout << c3.count() << std::endl; // 3
+    std::cout << c5.count() << std::endl; // 5
+    
+    // get_port_c<0> will retreive the signal - there are no more consumers connected
+    std::cout << df::get_port_c<0, df::signals::tag>(producer).num_slots() << std::endl; // 0
+
+    return 0;
+}
Modified: sandbox/SOC/2007/signals/libs/dataflow/test/signals/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/test/signals/Jamfile.v2	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/test/signals/Jamfile.v2	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -17,6 +17,7 @@
 
 run test_bind_object.cpp ;
 run test_connect.cpp ;
+run test_connect_result.cpp ;
 
 run test_filter.cpp ;
 run test_storage.cpp ;
Added: sandbox/SOC/2007/signals/libs/dataflow/test/signals/test_connect_result.cpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/signals/libs/dataflow/test/signals/test_connect_result.cpp	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -0,0 +1,34 @@
+// Copyright Stjepan Rajko 2008. Use, modification and
+// distribution is subject to 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/dataflow/signals/support.hpp>
+#include <boost/dataflow/signals/component/storage.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/test/included/test_exec_monitor.hpp>
+
+void func()
+{}
+
+int test_main(int, char* [])
+{
+    namespace df = boost::dataflow;
+    using namespace boost;
+    
+    BOOST_CHECK((boost::is_same<
+        df::result_of::binary_operation<boost::signal<void()>, boost::function<void()>, df::operations::connect, df::signals::tag>::type,
+        signals::connection>::type::value));
+
+    BOOST_CHECK((boost::is_same<
+        df::result_of::default_binary_operation<boost::signal<void()>, boost::function<void()>, df::operations::connect, df::signals::connect_mechanism, df::signals::tag>::type,
+        signals::connection>::type::value));
+            
+    BOOST_CHECK((boost::is_same<
+        df::result_of::default_binary_operation<signals::storage<void ()>, signals::storage<void ()>, df::operations::connect, df::signals::connect_mechanism, df::signals::tag>::type,
+        signals::connection>::type::value));
+
+    return 0;
+}
Modified: sandbox/SOC/2007/signals/libs/dataflow/test/signals/test_disconnect.cpp
==============================================================================
--- sandbox/SOC/2007/signals/libs/dataflow/test/signals/test_disconnect.cpp	(original)
+++ sandbox/SOC/2007/signals/libs/dataflow/test/signals/test_disconnect.cpp	2008-03-14 01:09:08 EDT (Fri, 14 Mar 2008)
@@ -21,11 +21,20 @@
         
         connect(banger, counter);
         banger(); // this signal will pass to counter
+        BOOST_CHECK_EQUAL(counter.count(), 1);
+
         disconnect_all(banger);
         banger(); // this signal will not pass to counter
-        
         BOOST_CHECK_EQUAL(counter.count(), 1);
-        //]
+
+        signals::connection c = connect(banger, counter);
+        banger(); // this signal will pass to counter
+        BOOST_CHECK_EQUAL(counter.count(), 2);
+        
+        c.disconnect();
+        banger(); // this signal will not pass to counter
+        BOOST_CHECK_EQUAL(counter.count(), 2);
+//]
     }
     return 0;
 } // int test_main(int, char* [])