Boost logo

Boost-Commit :

From: ramey_at_[hidden]
Date: 2008-06-10 00:27:35


Author: ramey
Date: 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
New Revision: 46285
URL: http://svn.boost.org/trac/boost/changeset/46285

Log:
added To Do section
Added:
   trunk/libs/serialization/doc/new_case_studies.html (contents, props changed)
   trunk/libs/serialization/doc/performance_status.html (contents, props changed)
   trunk/libs/serialization/doc/profile1.txt (contents, props changed)
   trunk/libs/serialization/doc/profile2.txt (contents, props changed)
   trunk/libs/serialization/doc/profile3.txt (contents, props changed)
   trunk/libs/serialization/doc/singleton.html (contents, props changed)
   trunk/libs/serialization/doc/todo.html (contents, props changed)
Text files modified:
   trunk/libs/serialization/doc/contents.html | 19 ++++++++++++++++++-
   trunk/libs/serialization/doc/release.html | 10 +++++-----
   2 files changed, 23 insertions(+), 6 deletions(-)

Modified: trunk/libs/serialization/doc/contents.html
==============================================================================
--- trunk/libs/serialization/doc/contents.html (original)
+++ trunk/libs/serialization/doc/contents.html 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -1,4 +1,4 @@
-<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <!--
 (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -301,6 +301,23 @@
       <dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#typeid"><code style="white-space: normal">typeid</code> information is not included in archives</a></dt>
       <dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#trap">Compile time trap when saving a non-const value</a></dt>
     </dl></div></dd>
+
+ <dt><img style="display:none" src="plus.gif" id="todo"><a target="detail" href="todo.html">To Do</a></dt>
+ <dd><div id="todo_detail"><dl class="page-index">
+ <dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#portablebinaryarchive">Portable Binary Archive</a></dt>
+ <dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#performancetesting">Performance Testing and Profiling</a></dt>
+ <dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#backversioning">Back Versioning</a></dt>
+ <dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#nortti">Environments without RTTI</a></dt>
+
+ <dt><img style="display:none" src="plus.gif" id="newcasestudies"><a target="detail" href="new_case_studies.html">Proposed Case Studies</a></dt>
+ <dd><div id="newcasestudies_detail"><dl class="page-index">
+ <dt><img style="display:none" src="dot.gif"><a target="detail" href="new_case_studies.html#functionobject">Serializing a Function Object</a></dt>
+ <dt><img style="display:none" src="dot.gif"><a target="detail" href="new_case_studies.html#archiveadaptor">Archive Adaptors</a></dt>
+ <dt><img style="display:none" src="dot.gif"><a target="detail" href="new_case_studies.html#archivehelper">Archive Helpers</a></dt>
+ </dl></div></dd>
+
+ </dl></div></dd>
+
     <dt><img style="display:none" src="dot.gif"><a target="detail" href="history.html">History</a>
     <!--
     <dt><img style="display:none" src="dot.gif"><a target="detail" href="definitions.html">Definitions</a></dt>

Added: trunk/libs/serialization/doc/new_case_studies.html
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/doc/new_case_studies.html 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!--
+(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
+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)
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<link rel="stylesheet" type="text/css" href="../../../boost.css">
+<link rel="stylesheet" type="text/css" href="style.css">
+<title>Serialization - Proposed Case Studies</title>
+</head>
+<body link="#0000ff" vlink="#800080">
+<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
+ <tr>
+ <td valign="top" width="300">
+ <h3>C++ Boost</h3>
+ </td>
+ <td valign="top">
+ <h1 align="center">Serialization</h1>
+ <h2 align="center">Proposed Case Studies</h2>
+ </td>
+ </tr>
+</table>
+<hr>
+<dl class="index">
+ <dt>Serializing a Function Object</dt>
+ <dt>Archive Adaptors</dt>
+ <dt>Archive Helpers</dt>
+</dl>
+
+These are not part of the library itself, but rather
+techiques on how to use the library to address specific situations.
+
+<h2><a name="functionobject"></a>Serializing a Function Object</h2>
+An example on how to serialize a function object. I believe this
+could be done by serializing pointer to the object in question. Since
+the Serialization library resurrects pointer of the correct type
+this should be easily implementable.
+<p>
+If a group of function objects were all derived from the
+same polymorphic base class - perhaps via multiple inheritance,
+the the function object effectively becomes a "variable" which
+encapsulates code.
+<p>
+This case study would show how to do this.
+
+<h2><a name="archiveadaptor"></a>Archive Adaptors</h2>
+
+Often users want to add their own special functionality to an
+existing archive. Examples of this are performance enhancements
+for specific types, Adjustment of output syntax for xml archives,
+and logging/debug output as archives are written and/or read.
+If this functionalty is implemented as an "adaptor" template
+which takes the base class as a template argument, such functionality
+appended to any archive for which that funtionality makes sense.
+For example, an adaptor for generating an xml schema could be
+appended to both wide narrow character versions of xml archives.
+<p>
+This case study would show how to make a useful archive adaptor.
+
+<h2><a name="archivehelper"></a>Archive Helpers</h2>
+Some types are not serializable as they stand. That is - they
+do not fullfill the requirements of the "Serializable Concept".
+The iconic example of this is boost::shared_ptr. Sometimes
+these types could be made serializable by adding code inside
+the library. Of course, doing that would create a lifetime
+of unpaid employment for the library author. Rather than
+adding a bunch of special code to the library itself, this
+code can packaged as a "helper" or "mix-in" class. Then
+a new archive is derived from both the "base" archive class
+AND the "helper" class. This is how boost::shared_ptr
+has been implemented.
+<p>
+It would also be possible to make a "generic runtime helper"
+which would effectively extend the API of the library. Previously
+the library included such a helper class. It was removed
+in favor of the current implementation. But this functionality
+should be added back in with another adaptor which would
+become part of the library.
+
+<hr>
+<p>Revised 1 November, 2008
+<p><i>&copy; Copyright Robert Ramey 2002-2008.
+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)
+</i></p>
+</body>
+</html>

Added: trunk/libs/serialization/doc/performance_status.html
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/doc/performance_status.html 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -0,0 +1,30 @@
+<html>
+<head>
+<title>Boost Library Status Automatic Test</title>
+</head>
+<body bgcolor="#ffffff" text="#000000">
+<table border="0">
+<tr>
+<td><img border="0" src="C:/BoostTrunk/boost.png" width="277" height="86"></td>
+<td>
+<h1>Library Status: serialization</h1>
+<b>Run Date:</b> 02:42:48 UTC, Tuesday 10 June 2008
+</td>
+</table>
+<br>
+<table border="1" cellspacing="0" cellpadding="5">
+<tr>
+<td rowspan="2">Test Name</td>
+<td align="center" >gcc-3.4.4</td>
+</tr><tr>
+<td align="center" >profile</td>
+</tr><tr><td>peformance_array_binary_archive</a></td><td align="right">Pass Profile</td></tr>
+<tr><td>peformance_array_text_archive</a></td><td align="right">Pass Profile</td></tr>
+<tr><td>peformance_array_text_warchive</a></td><td align="right"><i>Missing</i></td></tr>
+<tr><td>peformance_array_xml_archive</a></td><td align="right">Pass Profile</td></tr>
+<tr><td>peformance_array_xml_warchive</a></td><td align="right"><i>Missing</i></td></tr>
+<tr><td>performance_iterators</a></td><td align="right">Pass Profile</td></tr>
+<tr><td>performance_iterators_base64</a></td><td align="right">Pass Profile</td></tr>
+</table>
+</body>
+</html>

Added: trunk/libs/serialization/doc/profile1.txt
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/doc/profile1.txt 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -0,0 +1,149 @@
+Flat profile:
+
+Each sample counts as 0.01 seconds.
+ no time accumulated
+
+ % cumulative self self total
+ time seconds seconds calls Ts/call Ts/call name
+ 0.00 0.00 0.00 200 0.00 0.00 void accumulate<unsigned long>(unsigned int&, unsigned long const&)
+ 0.00 0.00 0.00 150 0.00 0.00 _pei386_runtime_relocator
+ 0.00 0.00 0.00 1 0.00 0.00 std::ostream::operator<<(void const*)
+ 0.00 0.00 0.00 1 0.00 0.00 __divdi3
+
+ % the percentage of the total running time of the
+time program used by this function.
+
+cumulative a running sum of the number of seconds accounted
+ seconds for by this function and those listed above it.
+
+ self the number of seconds accounted for by this
+seconds function alone. This is the major sort for this
+ listing.
+
+calls the number of times this function was invoked, if
+ this function is profiled, else blank.
+
+ self the average number of milliseconds spent in this
+ms/call function per call, if this function is profiled,
+ else blank.
+
+ total the average number of milliseconds spent in this
+ms/call function and its descendents per call, if this
+ function is profiled, else blank.
+
+name the name of the function. This is the minor sort
+ for this listing. The index shows the location of
+ the function in the gprof listing. If the index is
+ in parenthesis it shows where it would appear in
+ the gprof listing if it were to be printed.
+
+ Call graph (explanation follows)
+
+
+granularity: each sample hit covers 4 byte(s) no time propagated
+
+index % time self children called name
+ 0.00 0.00 200/200 setvbuf [1286]
+[4] 0.0 0.00 0.00 200 void accumulate<unsigned long>(unsigned int&, unsigned long const&) [4]
+-----------------------------------------------
+ 0.00 0.00 150/150 _cygwin_crt0_common_at_8 [1230]
+[5] 0.0 0.00 0.00 150 _pei386_runtime_relocator [5]
+-----------------------------------------------
+ 0.00 0.00 1/1 _lseek64 [1234]
+[6] 0.0 0.00 0.00 1 std::ostream::operator<<(void const*) [6]
+-----------------------------------------------
+ 0.00 0.00 1/1 __tcf_1 [1221]
+[7] 0.0 0.00 0.00 1 __divdi3 [7]
+-----------------------------------------------
+ 2 main [1263]
+[1263] 0.0 0.00 0.00 0+2 main [1263]
+ 2 main [1263]
+-----------------------------------------------
+
+ This table describes the call tree of the program, and was sorted by
+ the total amount of time spent in each function and its children.
+
+ Each entry in this table consists of several lines. The line with the
+ index number at the left hand margin lists the current function.
+ The lines above it list the functions that called this function,
+ and the lines below it list the functions this one called.
+ This line lists:
+ index A unique number given to each element of the table.
+ Index numbers are sorted numerically.
+ The index number is printed next to every function name so
+ it is easier to look up where the function in the table.
+
+ % time This is the percentage of the `total' time that was spent
+ in this function and its children. Note that due to
+ different viewpoints, functions excluded by options, etc,
+ these numbers will NOT add up to 100%.
+
+ self This is the total amount of time spent in this function.
+
+ children This is the total amount of time propagated into this
+ function by its children.
+
+ called This is the number of times the function was called.
+ If the function called itself recursively, the number
+ only includes non-recursive calls, and is followed by
+ a `+' and the number of recursive calls.
+
+ name The name of the current function. The index number is
+ printed after it. If the function is a member of a
+ cycle, the cycle number is printed between the
+ function's name and the index number.
+
+
+ For the function's parents, the fields have the following meanings:
+
+ self This is the amount of time that was propagated directly
+ from the function into this parent.
+
+ children This is the amount of time that was propagated from
+ the function's children into this parent.
+
+ called This is the number of times this parent called the
+ function `/' the total number of times the function
+ was called. Recursive calls to the function are not
+ included in the number after the `/'.
+
+ name This is the name of the parent. The parent's index
+ number is printed after it. If the parent is a
+ member of a cycle, the cycle number is printed between
+ the name and the index number.
+
+ If the parents of the function cannot be determined, the word
+ `<spontaneous>' is printed in the `name' field, and all the other
+ fields are blank.
+
+ For the function's children, the fields have the following meanings:
+
+ self This is the amount of time that was propagated directly
+ from the child into the function.
+
+ children This is the amount of time that was propagated from the
+ child's children to the function.
+
+ called This is the number of times the function called
+ this child `/' the total number of times the child
+ was called. Recursive calls by the child are not
+ listed in the number after the `/'.
+
+ name This is the name of the child. The child's index
+ number is printed after it. If the child is a
+ member of a cycle, the cycle number is printed
+ between the name and the index number.
+
+ If there are any cycles (circles) in the call graph, there is an
+ entry for the cycle-as-a-whole. This entry shows who called the
+ cycle (as parents) and the members of the cycle (as children.)
+ The `+' recursive calls entry shows the number of function calls that
+ were internal to the cycle, and the calls entry for each member shows,
+ for that member, how many times it was called from other members of
+ the cycle.
+
+
+Index by function name
+
+ [4] void accumulate<unsigned long>(unsigned int&, unsigned long const&) [7] __divdi3
+ [6] std::ostream::operator<<(void const*) [5] _pei386_runtime_relocator

Added: trunk/libs/serialization/doc/profile2.txt
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/doc/profile2.txt 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -0,0 +1,203 @@
+Flat profile:
+
+Each sample counts as 0.01 seconds.
+ % cumulative self self total
+ time seconds seconds calls Ts/call Ts/call name
+100.00 0.01 0.01 __gnu_cxx::__atomic_add(int volatile*, int)
+ 0.00 0.01 0.00 51 0.00 0.00 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()
+ 0.00 0.01 0.00 36 0.00 0.00 boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill()
+ 0.00 0.01 0.00 30 0.00 0.00 std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&)
+ 0.00 0.01 0.00 11 0.00 0.00 boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&)
+ 0.00 0.01 0.00 9 0.00 0.00 void test_transform_width<6, 8>(unsigned int)
+ 0.00 0.01 0.00 9 0.00 0.00 boost::archive::iterators::xml_unescape<char const*>::drain()
+ 0.00 0.01 0.00 5 0.00 0.00 boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*)
+ 0.00 0.01 0.00 2 0.00 0.00 __static_initialization_and_destruction_0(int, int)
+ 0.00 0.01 0.00 1 0.00 0.00 void test_xml_escape<char const>(char const*, char const*, unsigned int)
+ 0.00 0.01 0.00 1 0.00 0.00 void test_xml_unescape<char const>(char const*, char const*, unsigned int)
+ 0.00 0.01 0.00 1 0.00 0.00 void test_stream_iterators<char>(char const*, unsigned int)
+ 0.00 0.01 0.00 1 0.00 0.00 test_main(int, char**)
+ 0.00 0.01 0.00 1 0.00 0.00 char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)
+ 0.00 0.01 0.00 1 0.00 0.00 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&)
+
+ % the percentage of the total running time of the
+time program used by this function.
+
+cumulative a running sum of the number of seconds accounted
+ seconds for by this function and those listed above it.
+
+ self the number of seconds accounted for by this
+seconds function alone. This is the major sort for this
+ listing.
+
+calls the number of times this function was invoked, if
+ this function is profiled, else blank.
+
+ self the average number of milliseconds spent in this
+ms/call function per call, if this function is profiled,
+ else blank.
+
+ total the average number of milliseconds spent in this
+ms/call function and its descendents per call, if this
+ function is profiled, else blank.
+
+name the name of the function. This is the minor sort
+ for this listing. The index shows the location of
+ the function in the gprof listing. If the index is
+ in parenthesis it shows where it would appear in
+ the gprof listing if it were to be printed.
+
+ Call graph (explanation follows)
+
+
+granularity: each sample hit covers 4 byte(s) for 100.00% of 0.01 seconds
+
+index % time self children called name
+ <spontaneous>
+[1] 100.0 0.01 0.00 __gnu_cxx::__atomic_add(int volatile*, int) [1]
+-----------------------------------------------
+ 0.00 0.00 51/51 void test_transform_width<6, 8>(unsigned int) [9]
+[5] 0.0 0.00 0.00 51 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [5]
+-----------------------------------------------
+ 0.00 0.00 36/36 void test_transform_width<6, 8>(unsigned int) [9]
+[6] 0.0 0.00 0.00 36 boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [6]
+-----------------------------------------------
+ 0.00 0.00 30/30 void test_transform_width<6, 8>(unsigned int) [9]
+[7] 0.0 0.00 0.00 30 std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&) [7]
+-----------------------------------------------
+ 0.00 0.00 11/11 void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]
+[8] 0.0 0.00 0.00 11 boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [8]
+-----------------------------------------------
+ 0.00 0.00 9/9 test_main(int, char**) [16]
+[9] 0.0 0.00 0.00 9 void test_transform_width<6, 8>(unsigned int) [9]
+ 0.00 0.00 51/51 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [5]
+ 0.00 0.00 36/36 boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [6]
+ 0.00 0.00 30/30 std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&) [7]
+-----------------------------------------------
+ 0.00 0.00 9/9 void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]
+[10] 0.0 0.00 0.00 9 boost::archive::iterators::xml_unescape<char const*>::drain() [10]
+ 0.00 0.00 5/5 boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [11]
+-----------------------------------------------
+ 0.00 0.00 5/5 boost::archive::iterators::xml_unescape<char const*>::drain() [10]
+[11] 0.0 0.00 0.00 5 boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [11]
+-----------------------------------------------
+ 0.00 0.00 1/2 global constructors keyed to main [38]
+ 0.00 0.00 1/2 global destructors keyed to main [35]
+[12] 0.0 0.00 0.00 2 __static_initialization_and_destruction_0(int, int) [12]
+-----------------------------------------------
+ 0.00 0.00 1/1 test_main(int, char**) [16]
+[13] 0.0 0.00 0.00 1 void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]
+ 0.00 0.00 11/11 boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [8]
+-----------------------------------------------
+ 0.00 0.00 1/1 test_main(int, char**) [16]
+[14] 0.0 0.00 0.00 1 void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]
+ 0.00 0.00 9/9 boost::archive::iterators::xml_unescape<char const*>::drain() [10]
+-----------------------------------------------
+ 0.00 0.00 1/1 test_main(int, char**) [16]
+[15] 0.0 0.00 0.00 1 void test_stream_iterators<char>(char const*, unsigned int) [15]
+ 0.00 0.00 1/1 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]
+-----------------------------------------------
+ 0.00 0.00 1/1 main [1211]
+[16] 0.0 0.00 0.00 1 test_main(int, char**) [16]
+ 0.00 0.00 9/9 void test_transform_width<6, 8>(unsigned int) [9]
+ 0.00 0.00 1/1 void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]
+ 0.00 0.00 1/1 void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]
+ 0.00 0.00 1/1 void test_stream_iterators<char>(char const*, unsigned int) [15]
+-----------------------------------------------
+ 0.00 0.00 1/1 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]
+[17] 0.0 0.00 0.00 1 char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag) [17]
+-----------------------------------------------
+ 0.00 0.00 1/1 void test_stream_iterators<char>(char const*, unsigned int) [15]
+[18] 0.0 0.00 0.00 1 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]
+ 0.00 0.00 1/1 char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag) [17]
+-----------------------------------------------
+
+ This table describes the call tree of the program, and was sorted by
+ the total amount of time spent in each function and its children.
+
+ Each entry in this table consists of several lines. The line with the
+ index number at the left hand margin lists the current function.
+ The lines above it list the functions that called this function,
+ and the lines below it list the functions this one called.
+ This line lists:
+ index A unique number given to each element of the table.
+ Index numbers are sorted numerically.
+ The index number is printed next to every function name so
+ it is easier to look up where the function in the table.
+
+ % time This is the percentage of the `total' time that was spent
+ in this function and its children. Note that due to
+ different viewpoints, functions excluded by options, etc,
+ these numbers will NOT add up to 100%.
+
+ self This is the total amount of time spent in this function.
+
+ children This is the total amount of time propagated into this
+ function by its children.
+
+ called This is the number of times the function was called.
+ If the function called itself recursively, the number
+ only includes non-recursive calls, and is followed by
+ a `+' and the number of recursive calls.
+
+ name The name of the current function. The index number is
+ printed after it. If the function is a member of a
+ cycle, the cycle number is printed between the
+ function's name and the index number.
+
+
+ For the function's parents, the fields have the following meanings:
+
+ self This is the amount of time that was propagated directly
+ from the function into this parent.
+
+ children This is the amount of time that was propagated from
+ the function's children into this parent.
+
+ called This is the number of times this parent called the
+ function `/' the total number of times the function
+ was called. Recursive calls to the function are not
+ included in the number after the `/'.
+
+ name This is the name of the parent. The parent's index
+ number is printed after it. If the parent is a
+ member of a cycle, the cycle number is printed between
+ the name and the index number.
+
+ If the parents of the function cannot be determined, the word
+ `<spontaneous>' is printed in the `name' field, and all the other
+ fields are blank.
+
+ For the function's children, the fields have the following meanings:
+
+ self This is the amount of time that was propagated directly
+ from the child into the function.
+
+ children This is the amount of time that was propagated from the
+ child's children to the function.
+
+ called This is the number of times the function called
+ this child `/' the total number of times the child
+ was called. Recursive calls by the child are not
+ listed in the number after the `/'.
+
+ name This is the name of the child. The child's index
+ number is printed after it. If the child is a
+ member of a cycle, the cycle number is printed
+ between the name and the index number.
+
+ If there are any cycles (circles) in the call graph, there is an
+ entry for the cycle-as-a-whole. This entry shows who called the
+ cycle (as parents) and the members of the cycle (as children.)
+ The `+' recursive calls entry shows the number of function calls that
+ were internal to the cycle, and the calls entry for each member shows,
+ for that member, how many times it was called from other members of
+ the cycle.
+
+
+Index by function name
+
+ [13] void test_xml_escape<char const>(char const*, char const*, unsigned int) [16] test_main(int, char**) [5] boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()
+ [14] void test_xml_unescape<char const>(char const*, char const*, unsigned int) [8] boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [1] __gnu_cxx::__atomic_add(int volatile*, int)
+ [9] void test_transform_width<6, 8>(unsigned int) [11] boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [17] char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)
+ [15] void test_stream_iterators<char>(char const*, unsigned int) [10] boost::archive::iterators::xml_unescape<char const*>::drain() [18] std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&)
+ [12] __static_initialization_and_destruction_0(int, int) (performance_iterators.cpp) [6] boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [7] std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&)

Added: trunk/libs/serialization/doc/profile3.txt
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/doc/profile3.txt 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -0,0 +1,153 @@
+Flat profile:
+
+Each sample counts as 0.01 seconds.
+ no time accumulated
+
+ % cumulative self self total
+ time seconds seconds calls Ts/call Ts/call name
+ 0.00 0.00 0.00 200 0.00 0.00 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()
+ 0.00 0.00 0.00 150 0.00 0.00 boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill()
+ 0.00 0.00 0.00 2 0.00 0.00 __static_initialization_and_destruction_0(int, int)
+ 0.00 0.00 0.00 1 0.00 0.00 void test_base64<char>()
+ 0.00 0.00 0.00 1 0.00 0.00 std::_List_base<char, std::allocator<char> >::_M_clear()
+
+ % the percentage of the total running time of the
+time program used by this function.
+
+cumulative a running sum of the number of seconds accounted
+ seconds for by this function and those listed above it.
+
+ self the number of seconds accounted for by this
+seconds function alone. This is the major sort for this
+ listing.
+
+calls the number of times this function was invoked, if
+ this function is profiled, else blank.
+
+ self the average number of milliseconds spent in this
+ms/call function per call, if this function is profiled,
+ else blank.
+
+ total the average number of milliseconds spent in this
+ms/call function and its descendents per call, if this
+ function is profiled, else blank.
+
+name the name of the function. This is the minor sort
+ for this listing. The index shows the location of
+ the function in the gprof listing. If the index is
+ in parenthesis it shows where it would appear in
+ the gprof listing if it were to be printed.
+
+ Call graph (explanation follows)
+
+
+granularity: each sample hit covers 4 byte(s) no time propagated
+
+index % time self children called name
+ 0.00 0.00 200/200 void test_base64<char>() [7]
+[4] 0.0 0.00 0.00 200 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [4]
+-----------------------------------------------
+ 0.00 0.00 150/150 void test_base64<char>() [7]
+[5] 0.0 0.00 0.00 150 boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [5]
+-----------------------------------------------
+ 0.00 0.00 1/2 global constructors keyed to main [27]
+ 0.00 0.00 1/2 global destructors keyed to main [24]
+[6] 0.0 0.00 0.00 2 __static_initialization_and_destruction_0(int, int) [6]
+-----------------------------------------------
+ 0.00 0.00 1/1 main [1156]
+[7] 0.0 0.00 0.00 1 void test_base64<char>() [7]
+ 0.00 0.00 200/200 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [4]
+ 0.00 0.00 150/150 boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [5]
+ 0.00 0.00 1/1 std::_List_base<char, std::allocator<char> >::_M_clear() [8]
+-----------------------------------------------
+ 0.00 0.00 1/1 void test_base64<char>() [7]
+[8] 0.0 0.00 0.00 1 std::_List_base<char, std::allocator<char> >::_M_clear() [8]
+-----------------------------------------------
+
+ This table describes the call tree of the program, and was sorted by
+ the total amount of time spent in each function and its children.
+
+ Each entry in this table consists of several lines. The line with the
+ index number at the left hand margin lists the current function.
+ The lines above it list the functions that called this function,
+ and the lines below it list the functions this one called.
+ This line lists:
+ index A unique number given to each element of the table.
+ Index numbers are sorted numerically.
+ The index number is printed next to every function name so
+ it is easier to look up where the function in the table.
+
+ % time This is the percentage of the `total' time that was spent
+ in this function and its children. Note that due to
+ different viewpoints, functions excluded by options, etc,
+ these numbers will NOT add up to 100%.
+
+ self This is the total amount of time spent in this function.
+
+ children This is the total amount of time propagated into this
+ function by its children.
+
+ called This is the number of times the function was called.
+ If the function called itself recursively, the number
+ only includes non-recursive calls, and is followed by
+ a `+' and the number of recursive calls.
+
+ name The name of the current function. The index number is
+ printed after it. If the function is a member of a
+ cycle, the cycle number is printed between the
+ function's name and the index number.
+
+
+ For the function's parents, the fields have the following meanings:
+
+ self This is the amount of time that was propagated directly
+ from the function into this parent.
+
+ children This is the amount of time that was propagated from
+ the function's children into this parent.
+
+ called This is the number of times this parent called the
+ function `/' the total number of times the function
+ was called. Recursive calls to the function are not
+ included in the number after the `/'.
+
+ name This is the name of the parent. The parent's index
+ number is printed after it. If the parent is a
+ member of a cycle, the cycle number is printed between
+ the name and the index number.
+
+ If the parents of the function cannot be determined, the word
+ `<spontaneous>' is printed in the `name' field, and all the other
+ fields are blank.
+
+ For the function's children, the fields have the following meanings:
+
+ self This is the amount of time that was propagated directly
+ from the child into the function.
+
+ children This is the amount of time that was propagated from the
+ child's children to the function.
+
+ called This is the number of times the function called
+ this child `/' the total number of times the child
+ was called. Recursive calls by the child are not
+ listed in the number after the `/'.
+
+ name This is the name of the child. The child's index
+ number is printed after it. If the child is a
+ member of a cycle, the cycle number is printed
+ between the name and the index number.
+
+ If there are any cycles (circles) in the call graph, there is an
+ entry for the cycle-as-a-whole. This entry shows who called the
+ cycle (as parents) and the members of the cycle (as children.)
+ The `+' recursive calls entry shows the number of function calls that
+ were internal to the cycle, and the calls entry for each member shows,
+ for that member, how many times it was called from other members of
+ the cycle.
+
+
+Index by function name
+
+ [7] void test_base64<char>() [5] boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [8] std::_List_base<char, std::allocator<char> >::_M_clear()
+ [6] __static_initialization_and_destruction_0(int, int) (performance_iterators_base64.cpp) [4] boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()

Modified: trunk/libs/serialization/doc/release.html
==============================================================================
--- trunk/libs/serialization/doc/release.html (original)
+++ trunk/libs/serialization/doc/release.html 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -1,4 +1,4 @@
-<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <!--
 (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -120,18 +120,18 @@
 
 <h2><a name="todo"></a>Pending issues</h2>
 <ul>
- <li>Compile, and test on more platforms
     <li>currently can't serialize through a pointer an object a of class
     that implements its own <code style="white-space: normal">new/delete</code> operators.
     <li>Its possible that <code style="white-space: normal">std::string</code>
     and <code style="white-space: normal">std::wstring</code> contain characters such as
- '\0' which cannot be rendered in XML without an escape mechanism. Currently there is
- no such escape mechanism implemented.
+ '\0' and -1 (EOF) which cannot be rendered in text and XML archives without an escape mechanism.
+ Currently there is no such escape mechanism implemented.
     <li>A subtle error in the implementation of serializaton of <code style="white-space: normal">std::map</code>
     is fixed in this version. Unfortunately, the fix breaks serialization of
     <code style="white-space: normal">std::map</code> for those compilers which do not support
     partial template specialization.
-</ul>
+ <li>Without taking special precautions, racking fails for types placed in a <code style="white-space: normal">std::map</code>.
+ </ul>
 <p>
 Aside from the above, there are a number of issues related to specific platforms.
 These are listed in Specific Compiler/Library Issues.

Added: trunk/libs/serialization/doc/singleton.html
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/doc/singleton.html 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -0,0 +1,241 @@
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!--
+(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
+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)
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<link rel="stylesheet" type="text/css" href="../../../boost.css">
+<link rel="stylesheet" type="text/css" href="style.css">
+<title>Serialization - singleton</title>
+</head>
+<body link="#0000ff" vlink="#800080">
+<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
+ <tr>
+ <td valign="top" width="300">
+ <h3>C++ Boost</h3>
+ </td>
+ <td valign="top">
+ <h1 align="center">Serialization</h1>
+ <h2 align="center"><code style="white-space: normal">singleton</code></h2>
+ </td>
+ </tr>
+</table>
+<hr>
+<dl class="page-index">
+ <dt>Motivation
+ <dt>Features
+ <dt>Class Interface
+ <dt>Requirements
+ <dt>Examples
+ <dt>Multi-Threading
+</dl>
+
+<h3><a name="motivation">Motivation</a></h3>
+The serialization library relies on the existence of a number
+of static variables and tables to store information related
+to runtime types. Examples are tables which relate exported
+names to types and tables which relate base classes to derived
+classes. Construction, destruction and usage of these variables
+requires consideration of the following issues:
+<ul>
+ <li>Some static data variables and constants entries refer to others.
+ The sequence of initialization cannot be arbitrary but must be in proper
+ sequence.</li>
+ <li>A number of static variables aren't referred explicitly and, without
+ special precautions, will be stripped by most code optimizers</li>
+ <li>Many of these variables are created by templates and special care must
+ be taken to be sure that they are instantiated</li>
+ <li>In a multi-threading system, its possible that these static variables
+ will be accessed concurrently by separate threads. This would create a
+ race condition with unpredictabe behavior</li>
+</ul>
+This singleton class addresses all of the above issues.
+
+<h3><a name="features">Features</a></h3>
+This singleton implementation has the following features:
+<ul>
+ <li>
+ Any instance will be constructed before any attempt is made to access it.</li>
+ <li>
+ Any instance created with a template is guarenteed to be instantiated.
+ <li>
+ Regardless of whether or not an instance has been explicitly
+ referred to, it will not be stripped by the optimizer when the
+ executable is built in release mode.
+ <li>
+ All instances are constructed before
+ <code style="white-space: normal">main</code> is called
+ regardless of where they might be referenced within the program.
+ In a multi-tasking system, this guarentees that there will be no
+ race conditions during the construction of any instance. No
+ thread locking is required to guarentee this.
+ <li>
+ The above implies that any <code style="white-space: normal">const</code>
+ instances are thread-safe during the whole program. Again, no
+ thread locking is required.
+ <li>
+ If a mutable instance is created, and such an instance is modified
+ after main is called in a mult-threading system, there exists
+ the possibility that a race condition will occur. The serialization
+ library takes care that in the few places where a mutable
+ singleton is required, it is not altered after
+ <code style="white-space: normal">main</code> is called.
+ For a more general purpose usage, thread locking on this
+ singleton could easily be implemented. But as the serialization
+ library didn't require it, it wasn't implemented.
+</ul>
+
+<h3><a name="classinterface">Class Interface</a></h3>
+<pre><code>
+namespace boost {
+namespace serialization {
+
+template <class T>
+class singleton : public boost::noncopyable
+{
+public:
+ static const T & get_const_instance();
+ static T & get_mutable_instance();
+};
+
+} // namespace serialization
+} // namespace boost
+</code></pre>
+
+<dl>
+
+<dt><h4><pre><code>
+static const T & get_const_instance();</code></pre></h4></dt>
+<dd>
+Retrieve a constant reference to the singleton for this type.
+</dd>
+
+<dt><h4><pre><code>
+static T & get_mutable_instance();</code></pre></h4></dt>
+<dd>
+Retrieve a mutable reference to the singleton for this type.
+</dd>
+
+</dl>
+
+<h3><a name="requirements">Requirements</a></h3>
+In order to be used as
+<a target="singleton.hpp" href = "../../../boost/serialization/singleton.hpp">
+<code style="white-space: normal">
+singleton&lt;T&gt;
+</code>
+</a>
+, the type T must be default constructable.
+It doesn't require static variables - though it may have them.
+Since the library guarentees that only one instance of
+<a target="singleton.hpp" href = "../../../boost/serialization/singleton.hpp">
+<code style="white-space: normal">
+singleton&lt;T&gt;
+</code>
+</a>
+and all accesss is through the above static interface
+functions, common member functions of T become
+the functional equivalent of
+<code style="white-space: normal">static</code> functions.
+
+<h3><a name="example">Examples</a></h3>
+There are at least two different ways to use this class template.
+Both are used in the serialization library.
+<p>
+The first way is illustrated by and excerpt from the file
+<code style="white-space: normal"><a target="extended_type_info" href="../src/extended_type_info.cpp">extended_type_info.cpp</a></code>.
+which contains the following code:
+
+<pre><code>
+typedef std::set<const extended_type_info *, key_compare> ktmap;
+...
+void
+extended_type_info::key_register(const char *key) {
+ ...
+ result = singleton<ktmap>::get_mutable_instance().insert(this);
+ ...
+}
+</code></pre>
+Just by referring to the singleton instance anywhere in the program
+will guarentee that one and only one instance for the specified
+type (<code style="white-space: normal">ktmap</code> in this example)
+will exist throughout the program. There is no need for anyother
+declaration or definition.
+<p>
+A second way is to use
+<a target="singleton.hpp" href = "../../../boost/serialization/singleton.hpp">
+<code style="white-space: normal">
+singleton&lt;T&gt;
+</code>
+</a>
+as one of the base classes of the type. This is illustrated by a simplified
+excerpt from
+<a target="extended_type_info_typeid.hpp" href = "../../../boost/serialization/extended_type_info_typeid.hpp">
+<code style="white-space: normal">
+extended_type_info_typeid.hpp
+</code>
+</a>
+
+<pre><code>
+template&lt;class T&gt;
+class extended_type_info_typeid :
+ public detail::extended_type_info_typeid_0,
+ public singleton&lt;extended_type_info_typeid&lt;const T&gt; &gt;
+{
+ friend class singleton&lt;extended_type_info_typeid&lt;const T&gt; &gt;;
+private:
+ // private constructor to inhibit any existence other than the
+ // static one. Note: not all compilers support this !!!
+ extended_type_info_typeid() :
+ detail::extended_type_info_typeid_0()
+ {
+ type_register(typeid(T));
+ }
+ ~extended_type_info_typeid(){}
+ ...
+};
+</code></pre>
+
+This usage will permit a more natural syntax to be used:
+<pre><code>
+extended_type_info_typeid&lt;T&gt;::get_const_instance()
+</code></pre>
+
+Again, including one or more of the above statements anywhere
+in the program will guarentee that one and only one instance
+is created and referred to.
+
+<h3><a name="multithreading">Multi-Threading</a></h3>
+This singleton CAN be safely used in multi-threading applications if one
+is careful follow a simple rule:
+<p>
+<b>Do not call get_mutable_instance when more than one thread is running!</b>
+<p>
+All singletons used in the serialization library follow this rule.
+In order to help detect accidental violations of this rule there
+exists an singleton lock/unlock functions.
+<pre><code>
+boost::serialization::global_lock::get_mutable_instance().lock();
+boost::serialization::global_lock::get_mutable_instance().unlock();
+</code></pre>
+In a program compiled for debug, any invocation of
+<code style="white-space: normal">get_mutable_instance()</code>
+while the library is in a "locked" state will trap in an assertion.
+The global_lock state is initialized as "unlocked" to permit
+alteration of static variables before
+<code style="white-space: normal">main</code> is called. All
+serialization tests invoke <code style="white-space: normal">lock()</code>
+at the start of the progam. For programs compiled in release
+mode these functions have no effect.
+
+<hr>
+<p><i>&copy; Copyright Robert Ramey 2007.
+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)
+</i></p>
+</body>
+</html>

Added: trunk/libs/serialization/doc/todo.html
==============================================================================
--- (empty file)
+++ trunk/libs/serialization/doc/todo.html 2008-06-10 00:27:33 EDT (Tue, 10 Jun 2008)
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!--
+(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
+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)
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<link rel="stylesheet" type="text/css" href="../../../boost.css">
+<link rel="stylesheet" type="text/css" href="style.css">
+<title>Serialization - To Do</title>
+</head>
+<body link="#0000ff" vlink="#800080">
+<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
+ <tr>
+ <td valign="top" width="300">
+ <h3>C++ Boost</h3>
+ </td>
+ <td valign="top">
+ <h1 align="center">Serialization</h1>
+ <h2 align="center">To Do</h2>
+ </td>
+ </tr>
+</table>
+<hr>
+<dl class="index">
+ <dt>Portable Binary Archives</dt>
+ <dt>Performance Testing and Profiling</dt>
+ <dt>Back Versioning</dt>
+ <dt>Testing for Environments with No RTTI</dt>
+ <dt>Additional Case Studies</dt>
+</dl>
+
+These are enhancements that the serialization library needs but have not been done.
+Some of these projects, though tricky, are not huge and would be suitable
+for someone who has a limited time to spend on them. In particular, they
+might be of interest as student projects such as the Google Summer of Code.
+
+<h2><a name="portablebinaryarchives"></a>Portable Binary Archives</h2>
+Currently there is a portable binary archive in the examples directory.
+It is not regularly submitted to the exhaustive boost testing regimen
+but it is tested occasionally and has been used in production code.
+<p>
+Its missing the following:
+<ul>
+ <li>Addition of portable floating point types. This is not trivial. In addition to
+ handling floating point types of varying sizes, It requires
+ handling invalid floating point numbers (NaNs) in a portable manner.
+ <li>Some way to test archive portability within the Boost testing regimen.
+ <li>Integration into the Boost testing similar to the other archive classes.
+</ul>
+
+<h2><a name="performancetesting"></a>Performance Testing and Profiling</h2>
+
+I've managed to setup performance profiling using the following:
+<ul>
+ <li>current (as I write this) Boost.Build tools.
+ <li>the gcc compiler.
+ <li>and a shell script - profile.sh
+ <li>library_status program from the tools/regression/src directory
+</ul>
+Invoking profile script produces a
+<a href=performance_status.html">table</a>
+which shows the results of each test and links to the actual
+profile.
+<p>
+The first thing I did was include some of the serialization library tests.
+It became immediatly apparent that these tests were totally unsuitable
+for performance testing and that new tests needed to be written for this
+purpose. These tests would highlight the location of any performance
+bottlenecks in the serialization library. Whenever I've subjected my
+code in the past to this type of analysis, I've always been suprised
+to find bottlenecks in totally unanticipated places and fixing those
+has always lead to large improvements in performance. I expect that
+this project would have a huge impact on the utility of the serialization
+library.
+
+<h2><a name="backversioning"></a>Back Versioning</h2>
+
+It has been suggested that a useful feature of the library would be
+the ability to create "older versions" of archives. Currently,
+the library permits one make programs that are guarenteed
+the ability to load archives with classes of a previous version.
+But there is not way to save classes in accordance with a
+previous version. At first I dismissed this a a huge project
+with small demand. A cursory examination of the code revealed
+that this would not be very difficult. It would require some
+small changes in code and some additional tests. Also it
+would require special treatment in the documentation - perhaps
+a case study.
+
+
+<h2><a name="nortti"></a>Environments without RTTI</h2>
+
+I note that some have commented that this library requires RTTI.
+This is not strictly true. The examples and almost all the
+tests presume the existence of RTTI. But it should be possible
+to use the library without it. The example used for testing is an
+<code style="white-space: normal">extended_typeinfo</code>
+implemenation which presumes that all classes names have been exported.
+So, to make this library compatible for platforms without RTTI,
+a set of tests, examples and new manual section would have to be created
+
+<hr>
+<p>Revised 1 November, 2008
+<p><i>&copy; Copyright Robert Ramey 2002-2008.
+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)
+</i></p>
+</body>
+</html>


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