Boost logo

Boost-Commit :

From: srajko_at_[hidden]
Date: 2007-05-19 13:16:52


Author: srajko
Date: 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
New Revision: 4136
URL: http://svn.boost.org/trac/boost/changeset/4136

Log:
fix nested handler_returner class so it works on MSVC again, improve docs for 0.1 release

Added:
   sandbox/rpc/libs/rpc/doc/html/images/
   sandbox/rpc/libs/rpc/doc/html/images/Thumbs.db (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/blank.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/caution.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/draft.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/home.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/important.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/next.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/note.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/prev.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/tip.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/toc-blank.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/toc-minus.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/toc-plus.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/up.png (contents, props changed)
   sandbox/rpc/libs/rpc/doc/html/images/warning.png (contents, props changed)
   sandbox/rpc/libs/rpc/example/interface_example.cpp
   sandbox/rpc/libs/rpc/vc8ide/doc.vcproj
Text files modified:
   sandbox/rpc/boost/rpc/client.hpp | 26 +++++------
   sandbox/rpc/boost/rpc/simple_acceptor.hpp | 2
   sandbox/rpc/libs/rpc/doc/Jamfile.v2 | 2
   sandbox/rpc/libs/rpc/doc/dox/rpc.hpp | 16 +-----
   sandbox/rpc/libs/rpc/doc/rpc.qbk | 45 +++++++++----------
   sandbox/rpc/libs/rpc/example/rpc_example.cpp | 92 +++++++++++++++++++--------------------
   sandbox/rpc/libs/rpc/vc8ide/rpc.sln | 6 ++
   7 files changed, 90 insertions(+), 99 deletions(-)

Modified: sandbox/rpc/boost/rpc/client.hpp
==============================================================================
--- sandbox/rpc/boost/rpc/client.hpp (original)
+++ sandbox/rpc/boost/rpc/client.hpp 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -47,7 +47,7 @@
         stop_service_thread();
     }
 private:
- template<typename ReturnType>
+ template<typename R, typename T>
     class handler_return;
 public:
     /// Prepares and sends a complete rpc call.
@@ -60,8 +60,8 @@
         \li The client will store that in the handler's record and unlock the mutex.
         \li The process_call method can now finish the call.
     */
- template<typename ReturnType>
- handler_return<ReturnType> operator()(async_returning_call<ReturnType> &call)
+ template<typename T>
+ handler_return<Registry, T> operator()(async_returning_call<T> &call)
     {
         mutex_lock.lock();
         if (sending)
@@ -71,7 +71,7 @@
         boost::shared_ptr<handler_base> handler(call.spawn_handler());
         requests[next_request_id] = handler;
 
- handler_return<ReturnType> handler_r(this,next_request_id);
+ handler_return<Registry, T> handler_r(this,next_request_id);
 
         // send the header
         boost::asio::write(socket,
@@ -95,7 +95,7 @@
         boost::bind(&client::read_result_header, this, boost::asio::placeholders::error));
     }
 private:
- requests_type::iterator find_request(id_type id)
+ requests_type::iterator find_request(protocol::request_id_type id)
     {
         requests_type::iterator it = requests.find(id);
         if (it == requests.end())
@@ -105,7 +105,7 @@
         }
         return it;
     }
- void complete_call(id_type id)
+ void complete_call(protocol::request_id_type id)
     {
         boost::mutex::scoped_lock lock(mutex);
 
@@ -122,7 +122,7 @@
     }
 
     template<typename ReturnType>
- shared_ptr<handler_base> handler_accepted_as(id_type id,
+ shared_ptr<handler_base> handler_accepted_as(protocol::request_id_type id,
         call_options::marshal_options marshal_option)
     {
         BOOST_ASSERT(mutex_lock.locked());
@@ -199,15 +199,15 @@
 // template<typename ReturnType>
 // friend class handler_return;
 
- template<typename T>
+ template<typename R, typename T>
     class handler_return
     {
     public:
- typedef client<Registry> client_type;
- handler_return(client_type *client_ptr, typename client_type::id_type id)
+ typedef client<R> client_type;
+ handler_return(client_type *client_ptr, protocol::request_id_type id)
             : client_ptr(client_ptr), id(id), called(false)
         {}
- handler_return(const handler_return<T> &h_r)
+ handler_return(const handler_return<R,T> &h_r)
             : client_ptr(h_r.client_ptr), id(h_r.id), called(h_r.called)
         {
             h_r.called = true;
@@ -249,10 +249,8 @@
         }
     private:
         client_type *client_ptr;
- typename client_type::id_type id;
+ typename protocol::request_id_type id;
         mutable bool called;
-
-// friend class client<Registry>;
     };
 };
 

Modified: sandbox/rpc/boost/rpc/simple_acceptor.hpp
==============================================================================
--- sandbox/rpc/boost/rpc/simple_acceptor.hpp (original)
+++ sandbox/rpc/boost/rpc/simple_acceptor.hpp 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -8,7 +8,7 @@
 namespace rpc {
 
 /// Accepts a connection upon request.
-/** \warning Using this acceptor is unsecure.
+/** \warning Using this acceptor in exposed networks is unsecure.
 */
 class simple_acceptor
 {

Modified: sandbox/rpc/libs/rpc/doc/Jamfile.v2
==============================================================================
--- sandbox/rpc/libs/rpc/doc/Jamfile.v2 (original)
+++ sandbox/rpc/libs/rpc/doc/Jamfile.v2 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -13,7 +13,7 @@
    :
         <doxygen:param>EXAMPLE_PATH=../example
         <doxygen:param>EXTRACT_ALL=NO
- <doxygen:param>HIDE_UNDOC_MEMBERS=YES
+ <doxygen:param>HIDE_UNDOC_MEMBERS=NO
         <doxygen:param>EXTRACT_PRIVATE=NO
         <doxygen:param>DETAILS_AT_TOP=YES
         <doxygen:param>GENERATE_HTML=YES

Modified: sandbox/rpc/libs/rpc/doc/dox/rpc.hpp
==============================================================================
--- sandbox/rpc/libs/rpc/doc/dox/rpc.hpp (original)
+++ sandbox/rpc/libs/rpc/doc/dox/rpc.hpp 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -11,7 +11,6 @@
 - \ref sec_client_side
  - \ref sec_client
  - \ref sec_call
- - \ref sec_making_call
 - \ref sec_example
 
 \section sec_server_side Server-side Components
@@ -51,23 +50,16 @@
 \skip create a client
 \until ;
 
-\subsection sec_call Call
+\subsection sec_call Making a Call and Getting the Results
 
 rpc::call prepares a call by storing the function id and serializing the parameters.
-
-\dontinclude rpc_example.cpp
-\skip // prepare some function calls
-\until 3, i);
-
-\subsection sec_making_call Making a Call and Getting the Results
-
-A call is given to the client by passing the function id and parameters
+A call is then given to the client by passing the function id and parameters
 through the rpc::call class. The call will return a call handler which
 can be used to get the return result or verify that the function has completed.
 
 The behavior is currently specified as follows:
- - if there are no "out" arguments (currently, any non-const references), and the returned
- call handler is not stored, nothing will be marshaled back.
+ - if there are no "out" arguments (currently, "out" arguments are any non-const reference arguments),
+ and the returned call handler is not stored, nothing will be marshaled back.
  - if there are no "out" arguments, and the return handler is stored into an rpc::acknowledgement,
    only an acknowledgement that the call has completed will be marshaled back.
  - if there are no "out" arguments, and the returned call handler is stored into either an

Added: sandbox/rpc/libs/rpc/doc/html/images/Thumbs.db
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/blank.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/caution.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/draft.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/home.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/important.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/next.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/note.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/prev.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/tip.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/toc-blank.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/toc-minus.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/toc-plus.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/up.png
==============================================================================
Binary file. No diff available.

Added: sandbox/rpc/libs/rpc/doc/html/images/warning.png
==============================================================================
Binary file. No diff available.

Modified: sandbox/rpc/libs/rpc/doc/rpc.qbk
==============================================================================
--- sandbox/rpc/libs/rpc/doc/rpc.qbk (original)
+++ sandbox/rpc/libs/rpc/doc/rpc.qbk 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -1,6 +1,6 @@
 [library rpc
     [quickbook 1.3]
- [version 2007-05-16]
+ [version 0.1]
     [authors [Rajko, Stjepan]]
     [copyright 2007 Stjepan Rajko]
     [purpose Remote Procedure Calls]
@@ -13,23 +13,28 @@
 
 [section:overview Overview]
 
-[blurb [*DISCLAIMER:] RPC is not an official Boost library. It is being developed under Boost
+[warning RPC is not an official Boost library. It is being developed under Boost
 guidelines for a possible future submission to boost.]
 
 [section:introduction Introduction]
 
-This is a prototype framework for a Marshal/RPC implementation using Boost libraries,
-specifically Boost.Asio for network communication and Boost.Serialization for marshaling.
+This is a prototype framework for a remote procedure call implementation using Boost libraries,
+specifically Boost.Asio for network communication, Boost.Serialization for marshaling,
+and futures for handling of returned values.
 
 The framework supplies both server-side and client side components that allow
 remote procudure calls to be made, and parameters/results to be marshaled
-between the client and the server.
+between the client and the server. A remote procedure call is executed as follows:
+
+# on the client, the function id and the arguments are serialized and sent over the network
+# the server receives the serialized call, unserializes the id and arguments and executes the call
+# if applicable, the results of the call are serialized and sent back over the network to the client
 
 [endsect]
 
 [section:discussion Discussion]
 
-This code is a relatively basic prototype. Feel free to [link rpc.download download] it and
+The current code is a relatively basic prototype. Feel free to [link rpc.download download] it and
 play with it if you would like. However, it needs to be extended for any serious use. I
 welcome any suggestions for improvements and changes.
 
@@ -40,7 +45,8 @@
 * add exceptions to report network / framework issues.
 * many, many methods need to be removed from classes' public interface.
 * make a nicer user interface to the framework
- - i.e., something better than client(call(id,params))
+ - i.e., something better than client(call(id,params)).
+* fix the many ugly things currently happening in the code.
 
 [endsect]
 
@@ -68,21 +74,10 @@
 
 Below are the different versions of the RPC library:
 
-* prototype from 5/16/2007 \[[@marshal_07_05_16.zip download]\]
- * changed the interface to use futures, making the RPC interface completely
- asynchronous (with futures facilitating synchronous behavior)
- * call options are now deduced from the rpc call, rather than specified explicitly
-
-* prototype from 4/23/2007 evening \[[@marshal_07_04_23b.zip download]\]
- * fixed a bug which would unblock a sync call if an async result was received
- * tested on OS X / Darwin GCC
- * fixed a bug on OS X where async_read would overwrite the buffer before receiving anything
-
-* prototype from 4/23/2007 \[[@marshal_07_04_23.zip download]\]
- * fixed the network protocol so it actually works
- * stuck id in with the parameters in marshal::call
- * fixed heap corruption
- * still some memory leaks in Windows (is this due to Boost.Thread?)
+* version 0.1 5/19/2007 \[[@marshal_07_05_19.zip download]\]
+ * first implementation of the library using futures, making the RPC interface completely
+ asynchronous (with futures facilitating synchronous behavior).
+ * call options are deduced from the rpc call, and how the returned call handler is stored (or ignored).
 
 [endsect]
 
@@ -91,8 +86,10 @@
 Thanks to Hans Larsen and Scott Woods for the
 [@http://lists.boost.org/Archives/boost/2007/04/119854.php discussion] on
 the Boost developers list which inspired this project, Jeff Garland, Peter Dimov, and
-Rene Rivera for a discussion on async vs. sync interfaces, and Braddock Gaskill for
-help with the futures library.
+Rene Rivera for a discussion on
+[@http://lists.boost.org/Archives/boost/2007/04/120255.php async vs. sync interfaces],
+Johan Nilsson for pointing out the [@http://www.codeproject.com/threads/Rcf_Ipc_For_Cpp.asp RCF]
+library, and Braddock Gaskill for help with the futures library.
 
 [endsect]
 

Added: sandbox/rpc/libs/rpc/example/interface_example.cpp
==============================================================================
--- (empty file)
+++ sandbox/rpc/libs/rpc/example/interface_example.cpp 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -0,0 +1,37 @@
+template<typename Registry>
+class remote_interface
+{
+public:
+ remote_interface(rpc::client<Registry> &client) : client(client) {};
+
+ boost::future<void> nothing()
+ {
+ return client(rpc::call<int, void()> (0));
+ }
+ boost::future<int> inc(int i)
+ {
+ return client(rpc::call<int, int(int)> (1, i));
+ }
+ boost::future<int> add2(int i, int j)
+ {
+ return client(rpc::call<int, int(int, int)> (2, i,j));
+ }
+ boost::future<void> inc_inplace(int &i)
+ {
+ return client(rpc::call<int, void(int &)> (3, i));
+ }
+private:
+ rpc::client<Registry> &client;
+};
+
+ // make calls using the interface class...
+ remote_interface<rpc::registry<int> > remote(client);
+
+ remote.nothing();
+
+ BOOST_CHECK_EQUAL(remote.inc(5), 6);
+ BOOST_CHECK_EQUAL(remote.add2(10, 20), 30);
+ int x=20;
+ remote.inc_inplace(x);
+ BOOST_CHECK_EQUAL(x, 21);
+

Modified: sandbox/rpc/libs/rpc/example/rpc_example.cpp
==============================================================================
--- sandbox/rpc/libs/rpc/example/rpc_example.cpp (original)
+++ sandbox/rpc/libs/rpc/example/rpc_example.cpp 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -3,6 +3,7 @@
 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 
+//[ rpc_example
 #include <boost/test/unit_test.hpp>
 using boost::unit_test::test_suite;
 
@@ -37,83 +38,80 @@
 
 void network_rpc_test()
 {
- // make a registry keyed on int id-s and using binary_archive serialization
- rpc::registry<int> reg;
+ // make a registry keyed on string id-s and using binary_archive serialization
+ rpc::registry<std::string> reg;
 
     // register the functions
- reg.set<void ()>(0, nothing);
- reg.set<int (int)>(1, inc);
- reg.set<int (int, int)>(2, add2);
- reg.set<void (int &)>(3, inc_inplace);
+ reg.set<void ()>("nothing", nothing);
+ reg.set<int (int)>("inc", inc);
+ reg.set<int (int, int)>("add2", add2);
+ reg.set<void (int &)>("inc_inplace", inc_inplace);
 
     // create a server for the registry using a simple connection acceptor
- rpc::server<rpc::registry<int>, rpc::simple_acceptor> server(reg, 1097);
+ rpc::server<rpc::registry<std::string>, rpc::simple_acceptor> server(reg, 1097);
 
     // create a client which will connect to the server through the network.
- rpc::connecting_client<rpc::registry<int>, rpc::simple_connector> client(
+ rpc::connecting_client<rpc::registry<std::string>, rpc::simple_connector> client(
         ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 1097));
 
- // prepare some function calls
- int i = 1;
- // embed the function id for a void () call
- rpc::call<int, void ()> call0(0);
- // embed the function id and parameter for an int (int) call
- rpc::call<int, int (int)> call1__1(1, 1);
- // embed the function id and parameter for an int (int, int) call
- rpc::call<int, int (int, int)> call2__5_6(2, 5, 6);
- // embed the function id and parameters for a void (int &) call
- rpc::call<int, void (int &)> call3__i(3, i);
-
- boost::promise<int> prom;
- prom.set(200);
- boost::future<int> inced(prom);
- int j = 100;
- rpc::call<int, void (int &)> call3__j(1, j);
- rpc::call<int, void (int &)> call3__inced(1, inced);
-
-
     // make some function calls
     
- // this call is made asynchrously, nothing will be marshaled back
- client(call0);
-
- // this call will return a handler that we can use check for completion
- rpc::acknowledgement_ptr handler = client(call0);
+ // embed the function id for a void () call
+ rpc::call<std::string, void ()> call_nothing("nothing");
+ // this call is made asynchrously, nothing will be marshaled back because
+ // there are no "out" arguments and the returned handler is not stored.
+ client(call_nothing);
+
+ // here, since the returned call handler is stored in an acknowledgement,
+ // upon completion the server will marshal back only a confirmation of the completion.
+ rpc::acknowledgement_ptr handler = client(call_nothing);
     BOOST_CHECK_NO_THROW(handler->completion().get());
 
- // this call will return a handler that can be used to get the return value
+ // embed the function id and parameter for an int (int) call
+ rpc::call<std::string, int (int)> call_inc__1("inc", 1);
+ // here, the returned call handler is stored in a proper handler, which can be used
+ // to get the return value
     // since the call includes an "out" parameter, everything gets marshalled
     // back no matter what.
- rpc::async_returning_handler<int>::ptr handler_int = client(call1__1);
+ rpc::async_returning_handler<int>::ptr handler_int = client(call_inc__1);
     boost::future<int> future_int(handler_int->return_promise());
     BOOST_CHECK_EQUAL(future_int, 2);
 
- // since the call sends by reference, it will act syncronously
- client(call3__i);
+ int i = 1;
+ // embed the function id and parameters for a void (int &) call
+ rpc::call<std::string, void (int &)> call_inc_inplace__i("inc_inplace", i);
+ // since the call sends by reference, it will act syncronously - i will immediately be assigned
+ // the value of the future int carrying the modified value of the "out" parameter.
+ client(call_inc_inplace__i);
     BOOST_CHECK_EQUAL(i, 2);
 
- // handler returners are imlplicitly convertible to futures
- boost::future<int> result = client(call2__5_6);
+ // embed the function id and parameter for an int (int, int) call
+ rpc::call<std::string, int (int, int)> call_add2__5_6("add2", 5, 6);
+ // handler returners are imlplicitly convertible to futures, which will carry the returned value
+ boost::future<int> result = client(call_add2__5_6);
 
     BOOST_CHECK_EQUAL(result, 11);
 
- // and values, making the call synchronous
- int inced1 = client(call1__1);
+ // handler returners are also convertible to values, which immediately
+ // get assigned the value of the return value future, making the call synchronous
+ int inced1 = client(call_inc__1);
     BOOST_CHECK_EQUAL(inced1, 2);
 
- // this call sends the value through a feature (messy)
- client(call3__inced);
+ // this call sends the "in" value of an "in/out" paramater through a future (messy)
+ boost::promise<int> prom;
+ prom.set(200);
+ boost::future<int> inced(prom);
+ rpc::call<std::string, void (int &)> call_inc_inplace__inced("inc_inplace", inced);
+ client(call_inc_inplace__inced);
     BOOST_CHECK_EQUAL(inced, 201);
 
- // another synchronous call
- client(call3__j);
- BOOST_CHECK_EQUAL(j, 101);
-
 } // end void network_marshal_test
 
 test_suite* init_unit_test_suite(int argc, char* argv[])
 {
- test_suite* test = BOOST_TEST_SUITE( "Utility test suite" );
+ test_suite* test = BOOST_TEST_SUITE( "RPC test suite" );
     test->add(BOOST_TEST_CASE(&network_rpc_test));
     return test;
 }
+
+//]
\ No newline at end of file

Added: sandbox/rpc/libs/rpc/vc8ide/doc.vcproj
==============================================================================
--- (empty file)
+++ sandbox/rpc/libs/rpc/vc8ide/doc.vcproj 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="doc"
+ ProjectGUID="{3D5558B4-0965-4577-A217-A3E4A6EC1349}"
+ RootNamespace="doc"
+ Keyword="MakeFileProj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="release|Win32"
+ OutputDirectory="$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="0"
+ >
+ <Tool
+ Name="VCNMakeTool"
+ BuildCommandLine="cd ../doc&#x0D;&#x0A;bjam"
+ ReBuildCommandLine=""
+ CleanCommandLine=""
+ Output=""
+ PreprocessorDefinitions="WIN32;NDEBUG"
+ IncludeSearchPath=""
+ ForcedIncludes=""
+ AssemblySearchPath=""
+ ForcedUsingAssemblies=""
+ CompileAsManaged=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\doc\dox\rpc.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\doc\rpc.qbk"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>

Modified: sandbox/rpc/libs/rpc/vc8ide/rpc.sln
==============================================================================
--- sandbox/rpc/libs/rpc/vc8ide/rpc.sln (original)
+++ sandbox/rpc/libs/rpc/vc8ide/rpc.sln 2007-05-19 13:16:51 EDT (Sat, 19 May 2007)
@@ -13,6 +13,8 @@
                 {31065083-9F96-4019-A0BC-05464C505A46} = {31065083-9F96-4019-A0BC-05464C505A46}
         EndProjectSection
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc", "doc.vcproj", "{3D5558B4-0965-4577-A217-A3E4A6EC1349}"
+EndProject
 Global
         GlobalSection(SolutionConfigurationPlatforms) = preSolution
                 debug|Win32 = debug|Win32
@@ -31,6 +33,10 @@
                 {27D2C191-D1C2-49B3-870B-010E2D8430A4}.debug|Win32.Build.0 = debug|Win32
                 {27D2C191-D1C2-49B3-870B-010E2D8430A4}.release|Win32.ActiveCfg = release|Win32
                 {27D2C191-D1C2-49B3-870B-010E2D8430A4}.release|Win32.Build.0 = release|Win32
+ {3D5558B4-0965-4577-A217-A3E4A6EC1349}.debug|Win32.ActiveCfg = release|Win32
+ {3D5558B4-0965-4577-A217-A3E4A6EC1349}.debug|Win32.Build.0 = release|Win32
+ {3D5558B4-0965-4577-A217-A3E4A6EC1349}.release|Win32.ActiveCfg = release|Win32
+ {3D5558B4-0965-4577-A217-A3E4A6EC1349}.release|Win32.Build.0 = release|Win32
         EndGlobalSection
         GlobalSection(SolutionProperties) = preSolution
                 HideSolutionNode = FALSE


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