$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r74697 - in trunk: boost/timer libs/timer libs/timer/build libs/timer/doc libs/timer/example libs/timer/src libs/timer/test
From: bdawes_at_[hidden]
Date: 2011-10-04 11:06:53
Author: bemandawes
Date: 2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
New Revision: 74697
URL: http://svn.boost.org/trac/boost/changeset/74697
Log:
Hand merge Version 2 from https://github.com/Beman/timer
Added:
   trunk/boost/timer/   (props changed)
   trunk/boost/timer/config.hpp   (contents, props changed)
   trunk/boost/timer/timer.hpp   (contents, props changed)
   trunk/libs/timer/build/   (props changed)
   trunk/libs/timer/build/Jamfile.v2   (contents, props changed)
   trunk/libs/timer/doc/   (props changed)
   trunk/libs/timer/doc/cpu_timers.html   (contents, props changed)
   trunk/libs/timer/doc/index.html   (contents, props changed)
   trunk/libs/timer/doc/original_timer.html   (contents, props changed)
   trunk/libs/timer/example/   (props changed)
   trunk/libs/timer/example/auto_cpu_timer_example.cpp   (contents, props changed)
   trunk/libs/timer/example/timex.cpp   (contents, props changed)
   trunk/libs/timer/src/   (props changed)
   trunk/libs/timer/src/auto_timers.cpp   (contents, props changed)
   trunk/libs/timer/src/auto_timers_construction.cpp   (contents, props changed)
   trunk/libs/timer/src/cpu_timer.cpp   (contents, props changed)
   trunk/libs/timer/test/cpu_timer_info.cpp   (contents, props changed)
   trunk/libs/timer/test/cpu_timer_test.cpp   (contents, props changed)
   trunk/libs/timer/test/original_timer_test.cpp   (contents, props changed)
Removed:
   trunk/libs/timer/test/timer_test.cpp
   trunk/libs/timer/timer.htm
Text files modified: 
   trunk/libs/timer/index.html      |    49 ++++++--------------------------------- 
   trunk/libs/timer/test/Jamfile.v2 |    42 +++++++++++++++++++++++++++++----       
   2 files changed, 44 insertions(+), 47 deletions(-)
Added: trunk/boost/timer/config.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/timer/config.hpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,53 @@
+//  boost/timer/config.hpp  -----------------------------------------------------------//
+
+//  Copyright Beman Dawes 2003, 2006, 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  See http://www.boost.org/libs/timer for documentation.
+
+#ifndef BOOST_TIMER_CONFIG_HPP
+#define BOOST_TIMER_CONFIG_HPP
+
+#include <boost/config.hpp>
+
+#include <boost/system/api_config.hpp> 
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+//  enable dynamic or static linking as requested --------------------------------------//
+
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_TIMER_DYN_LINK)
+# if defined(BOOST_TIMER_SOURCE)
+#   define BOOST_TIMER_DECL BOOST_SYMBOL_EXPORT
+# else
+#   define BOOST_TIMER_DECL BOOST_SYMBOL_IMPORT
+# endif
+#else
+# define BOOST_TIMER_DECL
+#endif
+
+//  enable automatic library variant selection  ----------------------------------------//
+
+#if !defined(BOOST_TIMER_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_TIMER_NO_LIB)
+//
+// Set the name of our library, this will get undef'ed by auto_link.hpp
+// once it's done with it:
+//
+#define BOOST_LIB_NAME boost_timer
+//
+// If we're importing code from a dll, then tell auto_link.hpp about it:
+//
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_TIMER_DYN_LINK)
+#  define BOOST_DYN_LINK
+#endif
+//
+// And include the header that does the work:
+//
+#include <boost/config/auto_link.hpp>
+#endif  // auto-linking disabled
+
+#endif // BOOST_TIMER_CONFIG_HPP
+
Added: trunk/boost/timer/timer.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/timer/timer.hpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,130 @@
+//  boost/timer/timer.hpp  -------------------------------------------------------------//
+
+//  Copyright Beman Dawes 1994-2007, 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_TIMER_TIMER_HPP                  
+#define BOOST_TIMER_TIMER_HPP
+
+#include <boost/config/warning_disable.hpp>
+
+#include <boost/timer/config.hpp>
+#include <boost/chrono/chrono.hpp>
+#include <boost/cstdint.hpp>
+#include <string>
+#include <cstring>
+#include <ostream>
+
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+
+#   if defined(_MSC_VER)
+#     pragma warning(push)           // Save warning settings
+#     pragma warning(disable : 4251) // disable warning: class 'std::basic_string<_Elem,_Traits,_Ax>'
+#   endif                            // needs to have dll-interface...
+
+//--------------------------------------------------------------------------------------//
+
+//  TODO:
+//  
+//  * Add BOOST_NOEXCEPT where applicable
+
+//--------------------------------------------------------------------------------------//
+
+namespace boost
+{
+namespace timer
+{
+  class cpu_timer;
+  class auto_cpu_timer;
+
+  typedef boost::int_least64_t nanosecond_type;
+
+  struct cpu_times
+  {
+    nanosecond_type wall;
+    nanosecond_type user;
+    nanosecond_type system;
+
+    void clear() { wall = user = system = 0LL; }
+  };
+      
+  const short         default_places = 6;
+
+  BOOST_TIMER_DECL
+  const std::string&  default_format();
+
+  BOOST_TIMER_DECL
+  std::string format(const cpu_times& times,
+                     short places = default_places,
+                     const std::string& fmt = default_format()); 
+
+//  cpu_timer  ---------------------------------------------------------------------//
+
+  class BOOST_TIMER_DECL cpu_timer
+  {
+  public:
+
+    //  constructors, destructor
+    cpu_timer()                                    { start(); }
+   ~cpu_timer()                                    {}
+
+    //  observers
+    bool              is_stopped() const           { return m_is_stopped; }
+    cpu_times         elapsed() const;  // does not stop()
+    std::string       format(int places = default_places,
+                             const std::string& format = default_format()) const
+                                 { return timer::format(elapsed(), places, format); }
+    //  actions
+    void              start();
+    const cpu_times&  stop();
+    void              resume(); 
+
+  private:
+    cpu_times         m_times;
+    bool              m_is_stopped;
+  };
+
+//  auto_cpu_timer  --------------------------------------------------------------------//
+
+  class BOOST_TIMER_DECL auto_cpu_timer : public cpu_timer
+  {
+  public:
+
+    //  Explicit defaults to std::cout are not supplied since such defaults would
+    //  require including <iostream>, with its high costs, even when the standard
+    //  streams are not actually used.
+
+    explicit auto_cpu_timer(short places = default_places,
+                            const std::string& format = default_format());
+    explicit auto_cpu_timer(const std::string& format);
+    explicit auto_cpu_timer(std::ostream& os,
+                            short places = default_places,
+                            const std::string& format = default_format())
+                                   : m_places(places), m_os(os), m_format(format)
+                                   { start(); }
+    auto_cpu_timer(std::ostream& os, const std::string& format)
+                                   : m_places(default_places), m_os(os), m_format(format)
+                                   { start(); }
+
+   ~auto_cpu_timer();
+
+    void   report(); 
+
+  private:
+    int             m_places;
+    std::ostream&   m_os;
+    std::string     m_format;  
+  };
+   
+} // namespace timer
+} // namespace boost
+
+#   if defined(_MSC_VER)
+#     pragma warning(pop) // restore warning settings.
+#   endif 
+
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+
+#endif  // BOOST_TIMER_TIMER_HPP
Added: trunk/libs/timer/build/Jamfile.v2
==============================================================================
--- (empty file)
+++ trunk/libs/timer/build/Jamfile.v2	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,25 @@
+# Boost Timer Library Build Jamfile
+
+# (C) Copyright Beman Dawes 2002, 2006, 2011
+
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+# See library home page at http://www.boost.org/libs/timer
+
+project boost/timer
+    : source-location ../src
+    : usage-requirements  # pass these requirement to dependents (i.e. users)
+      <link>shared:<define>BOOST_TIMER_DYN_LINK=1
+      <link>static:<define>BOOST_TIMER_STATIC_LINK=1
+    ;
+
+SOURCES = auto_timers auto_timers_construction cpu_timer ;
+
+lib boost_timer
+   : $(SOURCES).cpp  ../../chrono/build//boost_chrono
+   : <link>shared:<define>BOOST_TIMER_DYN_LINK=1
+     <link>static:<define>BOOST_TIMER_STATIC_LINK=1
+   ;
+
+boost-install boost_timer ;
Added: trunk/libs/timer/doc/cpu_timers.html
==============================================================================
--- (empty file)
+++ trunk/libs/timer/doc/cpu_timers.html	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,693 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>CPU Timers</title>
+<style type="text/css">
+ ins {background-color:#A0FFA0}
+ del {background-color:#FFA0A0}
+ body
+ { 
+   font-family: sans-serif;
+   max-width : 8.5in;
+   margin: 1em;
+ }
+</style>
+</head>
+
+<body>
+
+<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="750">
+  <tr>
+    <td width="300">
+<a href="../../../index.htm">
+<img src="../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+    <td align="middle" width="430">
+    <font size="7">Timer Library<br>
+    CPU Timers</font></td>
+  </tr>
+</table>
+
+<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+  <tr>
+    <td>Timer Home   
+    CPU timers   
+    Original timers   
+    </td>
+  </tr>
+</table>
+
+<h2><a name="Introduction">Introduction</a></h2>
+<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" align="right">
+  <tr>
+    <td width="100%" bgcolor="#D7EEFF" align="center">
+      <i><b>Contents</b></i></td>
+  </tr>
+  <tr>
+    <td width="100%" bgcolor="#E8F5FF">
+      Introduction<br>
+      Using the timers<br>
+  Using auto_cpu_timer<br>
+  Using cpu_timer<br>
+      Reference<br>
+      <code> <boost/timer/timer.hpp></code><a href="#Synopsis"> 
+      synopsis</a><br>
+        Typedef nanosecond_type<br>
+ 
+      Non-member functions<br>
+      <code>default_format()</code><br>
+      format()<br>
+       
+      Class cpu_timer<br>
+        <code>  cpu_timer</code><a href="#cpu_timer-constructors"> 
+constructors, destructor</a><br>
+        <code>  cpu_timer</code><a href="#cpu_timer-observers"> 
+observers</a><br>
+        <code>  cpu_timer</code><a href="#cpu_timer-actions"> 
+actions</a><br>
+        Class auto_cpu_timer<br>
+         <code> auto_cpu_timer</code> constructors<br>
+         <code> auto_cpu_timer</code> destructor<br>
+         <code> auto_cpu_timer</code> actions<br>
+      Timer accuracy<br>
+  Resolution<br>
+  Other concerns<br>
+  Recommendations<br>
+      History<br>
+      Acknowledgements<br>
+  </tr>
+</table>
+
+<p>Knowing how long a program takes to execute is useful in both test and 
+production environments. It may also be helpful if such timing information is broken down 
+into wall-clock time, CPU time spent by the user, and CPU time spent by the 
+operating system servicing user requests.</p>
+
+<p>Class <code>cpu_timer</code> measures 
+wall-clock time, user CPU process time, and system CPU process time.  Class <code>
+auto_cpu_timer</code> is a refinement of
+<code>cpu_timer</code> that automatically reports the elapsed times when an <code>
+auto_cpu_timer</code> object is destroyed.</p>
+
+<h2><a name="Setup">Setup</a></h2>
+
+<p>Boost.Timer is implemented as a separately compiled library, so you must 
+install binaries in a location that can be found by your linker. If you followed 
+the
+<a href="http://www.boost.org/doc/libs/release/more/getting_started/index.html">
+Boost Getting Started</a> instructions, that's already been done.</p>
+
+<h2><a name="Example">Using the timers</a></h2>
+
+<h3>Using <code><a name="using-auto_cpu_timer">auto_cpu_timer</a></code></h3>
+
+<p>The simplest and most common use is to add the two lines high-lighted below 
+to a scope you want to time. See <code>
+auto_cpu_timer_example.cpp</code> 
+for the source code. </p>
+<blockquote>
+  <pre><span style="background-color: #D7EEFF">#include <boost/timer/</span><span style="background-color: #D7EEFF">timer.hpp</span><span style="background-color: #D7EEFF">></span>
+#include <cmath>
+
+int main()
+{
+  <span style="background-color: #D7EEFF">boost::timer::auto_cpu_timer</span><span style="background-color: #D7EEFF"> t;</span>
+
+  for (long i = 0; i < 100000000; ++i)
+    std::sqrt(123.456L); // burn some time
+
+  return 0;
+}</pre>
+</blockquote>
+<p>When the <code>auto_cpu_timer</code> object is created, it starts timing. When 
+it is destroyed at the end of the scope, its destructor stops the timer and 
+displays timing information on the default output stream, <code>std::cout</code>.</p>
+<p>The output of this program, run with a debug build on a circa 2006 desktop processor:</p>
+<p><code>    5.713010s wall, 5.709637s user + 0.000000s system = 
+5.709637s CPU (99.9%)</code></p>
+<p>In other words, this program ran in  <code>5.713010</code> seconds as would be measured by a 
+clock on the wall, the operating system charged it for  <code>5.709637</code> seconds of user CPU 
+time and 0 seconds of system CPU time, the total of these two was  <code>5.709637</code>, and that 
+represented  <code>99.9</code> percent of the wall clock time.</p>
+
+<p>The output stream, number of decimal places reported, and reporting format 
+can be controlled by <code>auto_cpu_timer</code> constructor arguments. Here is 
+what the output from the above program would look like for several different 
+sets of constructor arguments:</p>
+
+<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+  <tr>
+    <td><i><b>Constructor</b></i></td>
+    <td><i><b>Resulting Output</b></i></td>
+  </tr>
+  <tr>
+    <td><code><font size="1">t</font></code></td>
+    <td><code><font size="1">5.713010s wall, 5.709637s user + 0.000000s system = 5.709637s 
+    CPU (99.9%)</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font size="1">t(std::cerr</font><font size="1">, 2)</font></code></td>
+    <td><code><font size="1">5.71s wall, 5.70s user + 0.00s system = 5.70s CPU (99.9%)</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font size="1">t(1)</font></code></td>
+    <td><code><font size="1">5.7s wall, 5.7s user + 0.0s system = 5.7s CPU (99.9%)</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font size="1">t(3, "%w seconds\n")</font></code></td>
+    <td><code><font size="1">5.713 seconds<br>
+ </font></code></td>
+  </tr>
+  <tr>
+    <td><code><font size="1">t("%t</font><font size="1"> sec CPU, %w sec real")
+    </font> </code></td>
+    <td><code><font size="1">5.709637 sec CPU, 5.713010 sec real</font></code></td>
+  </tr>
+</table>
+<p> The processing of the format string is described here.</p>
+<h3> Using <code><a name="using-cpu_timer">cpu_timer</a></code></h3>
+<p> The following code creates a checkpoint every 20 seconds of user CPU time:</p>
+<blockquote>
+  <pre>using boost::timer::cpu_timer;
+...
+nanosecond_type last_checkpoint_time = 0;
+cpu_timer checkpoint_timer;  // start the timer
+
+while (more_transactions)
+{
+  process_a_transaction();
+  if (checkpoint_timer.elapsed().user - last_checkpoint_time > 20*1000000000LL)
+  {
+    ... create a checkpoint ...
+    last_checkpoint_time = checkpoint_timer.elapsed().user;  
+  }
+}</pre>
+</blockquote>
+<h2> <a name="Reference">Reference</a></h2>
+<p> Specifications are given in the style of the C++ standard library (C++11, 
+17.5.1.4 [structure.specifications]). An additional <i>Overview</i> element may 
+be provided to aid understanding. <i>Overview</i> elements are only informative 
+- actual semantics are given by the other detailed specification elements.</p>
+<p dir="ltr"> Functions not specified as <code>noexcept</code> will throw <code>
+std::bad_alloc</code> exceptions if a memory allocation error occurs. Other 
+errors are reported by time values of -1. [<i>Note:</i> Modern hardware and 
+operating systems have robust clock subsystems, so such errors are unusual if 
+even possible at all. <i>-- end note</i>]</p>
+<p dir="ltr"> The Timer library meets the same data race avoidance requirements 
+as the C++11 standard library (17.6.5.9 [res.on.data.races]). Shared objects of 
+Timer library types risk undefined behavior unless the user supplies a locking 
+mechanism. See C++11, 17.6.4.10 [res.on.objects], <i>Shared objects and the 
+library</i>. </p>
+<h3>
+<code><boost/timer/timer.hpp></code>
+<a name="Synopsis">Synopsis</a></h3>
+<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
+  <tr>
+    <td bgcolor="#D7EEFF">
+    <blockquote>
+      <pre>namespace boost
+{
+  namespace timer
+  {
+    class cpu_timer;       // wall-clock, user, and system timer
+    class auto_cpu_timer;  // automatic report() on destruction 
+
+    typedef boost::int_least64_t nanosecond_type;
+
+    struct cpu_times
+    {
+      nanosecond_type wall;
+      nanosecond_type user;
+      nanosecond_type system;
+
+      void clear() { wall = user = system = 0LL; }
+    };
+      
+    const int           <a name="default_places">default_places</a> = 6;
+
+    const std::string&  default_format();
+
+    std::string format(const cpu_times& times,
+                       short places = default_places,
+                       const std::string& format = default_format()); 
+  } // namespace timer
+} // namespace boost</pre>
+    </blockquote>
+    </td>
+  </tr>
+</table>
+
+<h3>Typedef <a name="nanosecond_type"><code>nanosecond_type</code></a></h3>
+
+<p>The typedef <code>nanosecond_type</code> provides an implementation defined type capable 
+of representing nanoseconds. For POSIX and Windows systems, <code>
+nanoseconds_type</code> is <code>boost::int_least64_</code>t.</p>
+
+<p>The underlying type is not based on the Boost Date-Time or Chrono library to avoid a 
+dependency on a large library. This design choice may change at some future 
+date.</p>
+
+<p>Although <code>nanosecond_type</code> is capable of representing one <b>
+nanosecond</b>, the actual resolution of common operating system timers may be 
+much lower. For wall clock time on desktop systems circa 2010, resolution is 
+often no better than than one <b>microsecond</b>. For user and system time, typical 
+resolution is 15 <b>milliseconds</b> on Windows and 10 <b>milliseconds</b> on 
+POSIX.</p>
+
+<h3><a name="cpu_times">Struct <code>cpu_times</code></a></h3>
+
+<p>Struct <code>cpu_times</code> packages three elapsed times:</p>
+
+<ul>
+  <li>Wall clock elapsed time, equivalent to the time that would be recorded by 
+  a stopwatch.</li>
+  <li>User central processing unit (CPU) time used by the process, as charged by 
+  the operating system.</li>
+  <li>System central processing unit (CPU) time used by the process, as charged 
+  by the operating system.</li>
+</ul>
+
+<h3><a name="Non-member-functions">Non-member functions</a></h3>
+
+<pre><span style="background-color: #D7EEFF">const std::string&  </span><span style="background-color: #D7EEFF"><a name="default_format">default_format</a>();</span></pre>
+<blockquote>
+  <p><i>Returns:</i> <code>std::string(" %ws wall, %us user + %ss system = %ts 
+  CPU (%p%)\n")</code>.</p>
+</blockquote>
+<pre><span style="background-color: #D7EEFF">std::string </span><a name="format"><span style="background-color: #D7EEFF">format</span></a><span style="background-color: #D7EEFF">(const</span><span style="background-color: #D7EEFF"> </span>cpu_times<span style="background-color: #D7EEFF">& times,
+                   short places = </span><span style="background-color: #D7EEFF">default_places,
+                   const std::string& format = default_format()); </span></pre>
+<blockquote>
+
+<p><i>Overview: </i>Converts the <code>times</code> argument's values to strings 
+representing seconds to a given number of decimal <code>places</code>, and 
+inserts them into a return string under control of the <code>format</code> 
+string.</p>
+
+<p><i>Effects:</i> If <code>places</code> is less than 0,  it is set to <code>default_places</code>. If <code>places</code> is 
+more than 9, it is set to 9. if the <code>format</code> 
+argument is <code>empty()</code>, it is set to <code>
+default_format</code>.</p>
+
+<p><i>Returns:</i> A string that is a copy of <code>format</code>, except that any 
+instances of the sequences shown below are replaced by the indicated value. 
+Times are reported in seconds, 
+shown to <code>places</code> decimal places. Percentage is reported to one 
+decimal place. [<i>Note:</i> percentage may exceed 100% due to differences in 
+how operating systems measure various times. <i>--end note</i>]</p>
+
+<p><i><b><a name="Format-replacement-sequences">Format replacement sequences</a></b></i></p>
+
+  <table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="39%">
+    <tr>
+      <td width="25%"><b><i>Sequence</i></b></td>
+      <td width="75%"><b><i>Replacement value</i></b></td>
+    </tr>
+    <tr>
+      <td width="25%" align="center"><code>%w</code></td>
+      <td width="75%"><code>times.wall</code></td>
+    </tr>
+    <tr>
+      <td width="25%" align="center"><code>%u</code></td>
+      <td width="75%"><code>times.user</code></td>
+    </tr>
+    <tr>
+      <td width="25%" align="center"><code>%s</code></td>
+      <td width="75%"><code>times.system</code></td>
+    </tr>
+    <tr>
+      <td width="25%" align="center"><code>%t</code></td>
+      <td width="75%"><code>times.user + times.system</code></td>
+    </tr>
+    <tr>
+      <td width="25%" align="center"><code>%p</code></td>
+      <td width="75%">The percentage of <code>times.wall</code> represented by <code>
+      times.user + times.system</code></td>
+    </tr>
+  </table>
+  </blockquote>
+
+<h3><a name="Class-cpu_timer">Class <code>cpu_timer</code></a></h3>
+
+<p> <code>cpu_timer</code> objects measure wall-clock elapsed time, process elapsed 
+time charged to the user, and process elapsed time charged to the system.</p>
+
+<p><i><b><a name="Current-time-values">Current time values</a></b></i> are 
+obtained as follows: Current wall-clock time is obtained from the Boost.Chrono <code>
+high_resolution_clock</code>. Current user and system time values are obtained 
+from the appropriate operating system API functions such as <code>times()</code> 
+on POSIX or <code>
+GetProcessTimes()</code> on Windows.</p>
+
+<h3> <a name="cpu_timer-synopsis"> <code>cpu_timer</code> synopsis</a></h3>
+
+<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
+  <tr>
+    <td bgcolor="#D7EEFF">
+
+<pre>    
+    class <a name="cpu_timer">cpu_timer</a>
+    {
+    public:
+
+      //  constructor, destructor
+      cpu_timer() noexcept;
+     ~cpu_timer() noexcept {}
+
+      //  compiler generated
+      cpu_timer(const cpu_timer&) = default;
+      cpu_timer& operator=(const cpu_timer&) = default;
+
+      //  observers
+      bool              is_stopped() const noexcept;
+      cpu_times         elapsed() const noexcept;
+      std::string       format(int places = default_places,
+                               const std::string& format = default_format()) const;
+      //  actions
+      void              start() noexcept;
+      const cpu_times&  stop() noexcept;
+      void              resume() noexcept;
+    };</pre>
+    </td>
+  </tr>
+</table>
+<h3><a name="cpu_timer-constructors"><code>cpu_timer</code> constructor</a>, destructor</h3>
+<pre><span style="background-color: #D7EEFF"><a name="cpu_timer-ctor">cpu_timer</a>() noexcept;</span></pre>
+<blockquote>
+  <p><i>Effects:</i> Constructs an object of type <code>
+  cpu_timer</code>. Calls<code> start()</code>.</p>
+</blockquote>
+<pre><span style="background-color: #D7EEFF">~<a name="cpu_timer-dtor">cpu_timer</a>() noexcept {}</span></pre>
+<blockquote>
+  <p><i>Effects:</i> None</p>
+</blockquote>
+<h3><a name="cpu_timer-observers"><code>cpu_timer</code> 
+observers</a></h3>
+<pre><span style="background-color: #D7EEFF">bool</span><span style="background-color: #D7EEFF"> <a name="is_stopped">is_stopped</a>() const noexcept;</span></pre>
+<blockquote>
+  <p><i>Returns:</i> <code>true</code> if the most recent call to an
+  action function was to stop(), 
+  otherwise <code>false</code>.</p>
+</blockquote>
+<pre><span style="background-color: #D7EEFF">cpu_times</span><span style="background-color: #D7EEFF"> <a name="elapsed">elapsed</a>() const noexcept;</span></pre>
+<blockquote>
+  <p><i>Overview:</i> If the timer is running, returns the cumulative elapsed 
+  time. If the timer is stopped, returns the cumulative elapsed time previously 
+  stored by stop().</p>
+
+  <p><i>Returns:</i> If <code>is_stopped()</code>, the stored time values. 
+  Otherwise, the difference between the 
+  current time values and the stored time 
+  values.</p>
+
+</blockquote>
+<pre><span style="background-color: #D7EEFF">std::string <a name="cpu_timer-format">format</a>(int</span><span style="background-color: #D7EEFF"> places = </span><span style="background-color: #D7EEFF">default_places,
+                   const std::string& format = default_format()) const;</span></pre>
+<blockquote>
+  <p><i>Overview:</i> Returns a string for the current elapsed time as formatted 
+  by the format function.</p>
+  <p><i>Returns:</i> <code>timer::format(elapsed(), places, format)</code>.</p>
+</blockquote>
+<h3><a name="cpu_timer-actions"><code>cpu_timer</code> 
+actions</a></h3>
+<pre><span style="background-color: #D7EEFF">void <a name="start">start</a>() noexcept;</span></pre>
+<blockquote>
+
+<p dir="ltr"><i>Effects:</i> Stores the current time values.</p>
+
+<p><i>Postconditions:</i> <code>!is_stopped()</code>.</p>
+
+</blockquote>
+<pre><span style="background-color: #D7EEFF">cpu_times</span><span style="background-color: #D7EEFF"> <a name="stop">stop</a>() noexcept;</span></pre>
+<blockquote>
+
+<p><i>Effects:</i> If <code>!is_stopped()</code>, stores the difference between 
+the current time values and the time values 
+stored by the most recent call to start() or
+resume().</p>
+
+<p><i>Postconditions:</i> <code>is_stopped()</code>.</p>
+
+<p><i>Returns:</i> The stored times.</p>
+
+</blockquote>
+<pre><span style="background-color: #D7EEFF">void <a name="resume">resume</a>() noexcept;</span></pre>
+<blockquote>
+  <p><i>Overview:</i> Restarts the timer, accumulating additional elapsed time.</p>
+  <p><i>Effects:</i> If is_stopped(), store the
+current time values less the previously 
+  stored cumulative elapsed times.  Otherwise, no effect. [<i>Note</i>: 
+  Subtracting the previous elapsed times has the effect of accumulating 
+  additional elapsed time. <i>--end note</i>]</p>
+</blockquote>
+<h3><a name="Class-auto_cpu_timer">Class <code>auto_cpu_timer</code></a></h3>
+
+<p>Class <code>auto_cpu_timer</code> adds a <code>report()</code> 
+function to <code>class cpu_timer</code>, and automatically calls <code>report()</code> 
+on destruction.</p>
+
+<h3> <a name="auto_cpu_timer-synopsis"> <code>auto_cpu_timer</code> synopsis</a></h3>
+
+<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
+  <tr>
+    <td bgcolor="#D7EEFF">
+
+<pre>    
+    class <a name="auto_cpu_timer">auto_cpu_timer</a> : public cpu_timer
+    {
+    public:
+      explicit auto_cpu_timer(short places = default_places,
+                              const std::string& format = default_format());
+      explicit auto_cpu_timer(const std::string& format);
+      explicit auto_cpu_timer(std::ostream& os,
+                              short places = default_places,
+                              const std::string& format = default_format());
+      auto_cpu_timer(std::ostream& os, const std::string& format);
+
+     ~auto_cpu_timer() noexcept;
+
+      cpu_timer(const cpu_timer&) = default;
+      cpu_timer& operator=(const cpu_timer&) = default;
+
+      void            report();
+
+    private:
+      std::ostream&   m_os;               // <b><i>exposition only</i></b>
+      short           m_places;           // <b><i>exposition only</i></b>
+      std::string     m_format;           // <b><i>exposition only</i></b>
+    };</pre>
+    </td>
+  </tr>
+</table>
+<p dir="ltr">[<i>Note:</i> Constructors without a <code>std::ostream&</code> 
+argument argument imply <code>
+std::cout</code>. An argument default is avoided as it would require including <code><iostream></code>, 
+with its high costs, even when the standard streams are not used. <i>--end note</i>]</p>
+<h3><a name="auto_cpu_timer-constructors"><code>auto_cpu_timer</code> constructors</a></h3>
+<pre><span style="background-color: #D7EEFF">explicit <a name="auto_cpu_timer-1">auto_cpu_timer</a>(short places = </span>default_places<span style="background-color: #D7EEFF">,
+                        const std::string& format = default_format());</span></pre>
+<blockquote>
+  <p><i>Effects:</i> Constructs an object of type <code>
+  auto_cpu_timer</code>.</p>
+  <p><i>Postconditions:
+  </i>As if<i><br>
+  </i><code>  m_os == std::cout</code>,<code><br>
+    m_places == places</code>,<code><br>
+  m_format ==  format</code></p>
+</blockquote>
+<pre><span style="background-color: #D7EEFF">explicit <a name="auto_cpu_timer-2">auto_cpu_timer</a>(const</span><span style="background-color: #D7EEFF"> std::string& format);</span></pre>
+<blockquote>
+  <p><i>Effects:</i> Constructs an object of type <code>
+  auto_cpu_timer</code>.</p>
+  <p><i>Postconditions:
+  </i>As if<i><br>
+  </i><code>  m_os == std::cout</code>,<code><br>
+    m_places == default_places</code>,<code><br>
+  m_format == format</code></p>
+</blockquote>
+<pre><span style="background-color: #D7EEFF">explicit <a name="auto_cpu_timer-3">auto_cpu_timer</a>(std::ostream</span><span style="background-color: #D7EEFF">& </span><span style="background-color: #D7EEFF">os</span><span style="background-color: #D7EEFF">,
+                        short places = </span>default_places<span style="background-color: #D7EEFF">,
+                        const std::string& format = </span><span style="background-color: #D7EEFF">default_format());</span></pre>
+<blockquote>
+  <p><i>Effects:</i> Constructs an object of type <code>
+  auto_cpu_timer</code>.</p>
+  <p><i>Postconditions:
+  </i>As if<i><br>
+  </i><code>  m_os == os</code>,<code><br>
+    m_places == places</code>,<code><br>
+  m_format == format</code></p>
+</blockquote>
+<pre><span style="background-color: #D7EEFF"><a name="auto_cpu_timer-4">auto_cpu_timer</a>(std::ostream</span><span style="background-color: #D7EEFF">& </span><span style="background-color: #D7EEFF">os</span><span style="background-color: #D7EEFF">, const std::string& format);</span></pre>
+<blockquote>
+  <p><i>Effects:</i> Constructs an object of type <code>
+  auto_cpu_timer</code>.</p>
+  <p><i>Postconditions:
+  </i>As if<i><br>
+  </i><code>  m_os == os</code>,<code><br>
+    m_places ==  </code>default_places,<code><br>
+  m_format == format</code></p>
+</blockquote>
+<h3><a name="auto_cpu_timer-destructor"><code>auto_cpu_timer</code> destructor</a></h3>
+<pre><span style="background-color: #D7EEFF">~</span><span style="background-color: #D7EEFF">auto_cpu_timer</span><span style="background-color: #D7EEFF">() noexcept;</span></pre>
+<blockquote>
+<p dir="ltr"><i>Effects: </i>If <code>!is_stopped()</code>, <a href="#report">
+report()</a>. Otherwise, no effects.</p>
+<p dir="ltr">[<i>Note:</i> Because the function is <code>noexcept</code>, 
+implementation requires a try/catch or equivalent to ensure no exception 
+escapes. <i>--end note</i>]</p>
+</blockquote>
+<h3><a name="auto_cpu_timer-actions"><code>auto_cpu_timer</code> actions</a></h3>
+<pre><span style="background-color: #D7EEFF">void <a name="report">report</a>();</span></pre>
+<blockquote>
+  <p><i>Effects: </i>As if:</p>
+  <blockquote>
+    <pre>m_os << timer::format(stop(), m_places, m_format);
+resume();</pre>
+  </blockquote>
+
+  <p>[<i>Note:</i> <code>stop()</code> is called because doing I/O while the 
+  timer is running might produce misleading results. <i>--end note</i>]</p>
+
+</blockquote>
+
+  <h2><a name="Timer-accuracy">Timer accuracy</a></h2>
+
+  <p>How accurate are these timers? </p>
+
+  <h3><a name="Resolution">Resolution</a></h3>
+
+  <p dir="ltr">The resolution of a clock, and thus timers built on that clock, 
+  is the minimum period time that can be measured. The program <code>
+  cpu_timer_info.cpp</code> measures 
+  the resolution of <code>cpu_timer</code>.</p>
+
+  <table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+    <tr>
+      <td rowspan="2">O/S</td>
+      <td rowspan="2">Processor</td>
+      <td colspan="2" align="center">Wall-clock</td>
+      <td colspan="2" align="center">CPU</td>
+    </tr>
+    <tr>
+      <td>Resolution</td>
+      <td>Comments</td>
+      <td align="center">User<br>
+      Resolution</td>
+      <td align="center">System<br>
+      Resolution</td>
+    </tr>
+    <tr>
+      <td>Windows 7</td>
+      <td>Intel Core i7 860 @ 2.9 GHz</td>
+      <td align="right">366ns</td>
+      <td>Some variation, usually in multiples of 366ns</td>
+      <td>15600100ns</td>
+      <td>15600100ns</td>
+    </tr>
+    <tr>
+      <td>Windows 7</td>
+      <td>Intel Mobile T7200 @ 2.0 GHz</td>
+      <td align="right">2050ns</td>
+      <td>Much variation. Resolution degrades when processor slows, probably due 
+      to known chipset errata. </td>
+      <td>15600100ns</td>
+      <td>15600100ns</td>
+    </tr>
+    <tr>
+      <td>Windows XP</td>
+      <td>Intel Atom N2800 @ 1.0 GHz</td>
+      <td align="right">1437ns</td>
+      <td>Some variation.</td>
+      <td>15625000ns</td>
+      <td>15625000ns</td>
+    </tr>
+    <tr>
+      <td>Mac OS X Lion</td>
+      <td>Intel circa 2007</td>
+      <td align="right">2100ns<br>
+      2200ns</td>
+      <td>Some variation within a range.</td>
+      <td>10000000ns</td>
+      <td>10000000ns</td>
+    </tr>
+    <tr>
+      <td>Ubuntu Linux 11.4</td>
+      <td>Intel circa 2005</td>
+      <td align="right">516ns</td>
+      <td>Very little variation, typically less than 5ns </td>
+      <td>10000000ns</td>
+      <td>10000000ns</td>
+    </tr>
+</table>
+
+  <h3><a name="Other-concerns">Other concerns</a></h3>
+
+  <p>Wall-clock timings are subject to many outside influences, such as the impact 
+  of other processes.</p>
+
+  <blockquote>
+
+  <p><code>cpu_timer</code> and <code>auto_cpu_timer</code> obtain Wall-clock 
+  timings from Boost.Chrono's <code>high_resolution_clock</code>. On Intel 
+  compatible CPU's running Windows, Linux, and Mac OS X, this is a "steady 
+  clock", but may not be steady on other platforms. <code>
+  cpu_timer_info.cpp</code> reports 
+  whether or not the <code>high_resolution_clock</code> is steady on a 
+  particular platform.</p>
+
+  <p><i><b><a name="Steady-clocks">Steady clocks</a></b></i> are defined by the 
+  C++11 standard as clocks for which values never decrease as physical time 
+  advances and for which values advance at a steady rate relative to real time. 
+  That is, the clock may not be adjusted. Clocks that are steady never run 
+  backwards, even when the operating system's clock is reset backwards such as 
+  during a daylight saving time transition.</p>
+
+  </blockquote>
+
+  <p>Timings of debug builds are often several times slower 
+  than release builds, because  compiler optimization is turned off and 
+  because libraries often supply very expensive error checks on debug builds.</p>
+
+  <p>Synthetic benchmark code may be optimized way by release builds. It may be 
+  necessary to inspect generated code to verify this isn't happening.</p>
+
+  <h3 dir="ltr"><a name="Recommendations">Recommendations</a></h3>
+
+  <p dir="ltr">Think about what is important to your application. For a 
+  production process, the wall-clock time may be what is most important. For 
+  studying the efficiency of code, total CPU time (user + system) is often a much better measure.</p>
+
+  <p dir="ltr">A useful recommendation is to never trust timings unless they are 
+  (1) at least 100 times longer than the CPU time resolution, (2) run multiple 
+  times, and (3) run on release builds. And results that are too good to be true 
+  need to be further investigate.</p>
+
+  <p>Shared libraries (DLL's) may incur extra time delays, including expensive 
+  disk accesses, the first time a timer or other function is called. If that 
+  would be misleading, static linking should be considered.</p>
+
+  <h2><a name="History">History</a></h2>
+
+  <p>Beman Dawes and Rob Stewart developed version 2 of the library.</p>
+
+  <p>Beman did the initial development. Rob  contributed many corrections, comments, and suggestions. In 
+  particular, he suggested the <code>resume()</code> and <code>format()</code> 
+  functions, resulting in improved ease-of-use for several use cases.</p>
+
+  <h2><a name="Acknowledgements">Acknowledgements</a></h2>
+  <p>Comments and suggestions came from Greg Rubino, Dave Abrahams, Vicente 
+  Botet, and John Maddock.</p>
+
+<hr>
+<p><font size="2">Revised:
+<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B %Y" startspan -->04 October 2011<!--webbot bot="Timestamp" endspan i-checksum="32185" --></font></p>
+<p><font size="2">© Copyright Beman Dawes, 2006<br>
+© Copyright Beman Dawes and Robert Stewart, 2011</font></p>
+<p><font size="2">Distributed under the Boost Software License, Version 1.0.  See www.boost.org/ LICENSE_1_0.txt</font></p>
+
+</body>
+
+</html>
\ No newline at end of file
Added: trunk/libs/timer/doc/index.html
==============================================================================
--- (empty file)
+++ trunk/libs/timer/doc/index.html	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,87 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<title>Boost Timer Library</title>
+<style type="text/css">
+ ins {background-color:#A0FFA0}
+ del {background-color:#FFA0A0}
+ body
+ { 
+   font-family: sans-serif;
+   max-width : 8.5in;
+   margin: 1em;
+ }
+</style>
+</head>
+
+<body>
+<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="750">
+  <tr>
+    <td width="300">
+<a href="../../../index.htm">
+<img src="../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+    <td align="middle" width="430">
+    <font size="7">Timer Library<br>
+    Version 2</font>
+    </td>
+  </tr>
+</table>
+
+<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+  <tr>
+    <td>Timer Home   
+    CPU timers   
+    Original timers   
+    </td>
+  </tr>
+</table>
+
+<p>"How long does my C++ code take to run?"<p>The Boost Timer library 
+answers that question - portably, and with as little as one #include and one 
+additional line of code.<p>The Boost Timer library has two distinct sets of 
+components.<ul>
+  <li>If you are new to the library, please go directly to the version 2
+    CPU timers page.<br>
+ </li>
+  <li>If you are interested in 
+the original library, now deprecated, read on below.</li>
+  </ul>
+  <h2>
+    CPU timers</h2>
+<p>These version 2 components conform to current Boost practice:</p>
+<ul>
+  <li>The interfaces and their semantics are the same across all platforms.</li>
+  <li>The internal implementation uses operating system specific APIs to achieve 
+  higher precision and supply functionality not otherwise available.  </li>
+  <li>The headers live in a sub-directory, <code><boost/timer/...></code>.</li>
+  <li>The content is in a sub-namespace, <code>boost::timer</code>.</li>
+</ul>
+<h2 dir="ltr">
+    Original timers</h2>
+<p>These version 1 components are deprecated. They date from the earliest days 
+of Boost and do not conform to current Boost practice:</p>
+<ul>
+  <li>The interfaces are the same across all platforms, but the semantics differ 
+  according to platform. Wall-clock time is measured on Windows, while CPU time 
+  is measured on POSIX-like systems.</li>
+  <li>The internal implementation uses only C/C++ standard library functions, so 
+  cannot supply desirable precision and functionality.</li>
+  <li>The headers live in the main Boost header directory.</li>
+  <li>The content are in namespace <code>boost</code>.</li>
+</ul>
+<hr>
+<p><font size="2">Revised:
+<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B %Y" startspan -->04 October 2011<!--webbot bot="Timestamp" endspan i-checksum="32185" --></font></p>
+
+<p><font size="2">© Copyright Beman Dawes  2001, 2011</font></p>
+
+<p><font size="2">Distributed under the Boost Software License, Version 1.0. See
+</font>
+www.boost.org/LICENSE_1_0.txt</p>
+
+
+</body>
+</html>
\ No newline at end of file
Added: trunk/libs/timer/doc/original_timer.html
==============================================================================
--- (empty file)
+++ trunk/libs/timer/doc/original_timer.html	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,267 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<title>Original Timers</title>
+<style type="text/css">
+ ins {background-color:#A0FFA0}
+ del {background-color:#FFA0A0}
+ body
+ { 
+   font-family: sans-serif;
+   max-width : 8.5in;
+   margin: 1em;
+ }
+</style>
+</head>
+
+<body bgcolor="#FFFFFF" text="#000000">
+
+<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="750">
+  <tr>
+    <td width="300">
+<a href="../../../index.htm">
+<img src="../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+    <td align="middle" width="430">
+    <font size="7">Timer Library<br>
+    Original Timers and Progress Display</font></td>
+  </tr>
+</table>
+
+<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+  <tr>
+    <td>Timer Home   
+    CPU timers   
+    Original timers   
+    </td>
+  </tr>
+</table>
+
+<p></p>
+
+<center>
+  <table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="80%">
+    <tr>
+      <td width="100%" bgcolor="#FFFF66">
+<p><i><b>These timers are deprecated.</b></i> They date from the earliest days 
+of Boost and do not conform 
+to current Boost practice.</p>
+<ul>
+  <li>The interfaces are the same across all platforms, but the semantics differ 
+  according to platform. Wall-clock time is measured on Windows, while CPU time 
+  is measured on POSIX-like systems.</li>
+  <li>The internal implementation uses only C/C++ standard library functions, so 
+  cannot supply desirable precision and functionality.</li>
+  <li>The headers live in the main Boost header directory.</li>
+  <li>The content are in namespace <code>boost</code>.</li>
+</ul>
+      Please see the Version 2
+    CPU timers for replacements that conform to 
+      current Boost practice.</td>
+    </tr>
+  </table>
+</center>
+  
+<p>The timer library provides two headers and three classes: </p>
+
+<blockquote>
+  <table border="1" cellpadding="5">
+    <tr>
+      <td><b>Header</b></td>
+      <td><b>Class</b></td>
+      <td><b>Functionality</b></td>
+    </tr>
+    <tr>
+      <td>timer.hpp</td>
+      <td>timer</td>
+      <td>Measure elapsed time.</td>
+    </tr>
+    <tr>
+      <td>progress.hpp</td>
+      <td>progress_timer</td>
+      <td>Measure elapsed time (using timer), display on destruction.</td>
+    </tr>
+    <tr>
+      <td>progress.hpp</td>
+      <td>progress_display</td>
+      <td>Display an indication of progress toward a known goal.</td>
+    </tr>
+  </table>
+</blockquote>
+<p>The objective in designing these classes was fairly limited - they are
+intended for simple uses like timing and reporting progress for programmer's
+tests or batch job streams. The specifications of the progress classes are
+worded in very general terms to permit alternate implementations such as for
+graphical user interfaces.</p>
+<h2><a name="Class timer">Class timer</a></h2>
+<p>Class timer measures elapsed time.  It is generally useful for minor
+timing tasks.  Its supplied implementation offers moderate portability at
+the cost of depending on the unknown accuracy and precision of the C Standard
+Library clock() function.  The maximum measurable elapsed time may be as
+low as 596.5 hours (or even less) for the supplied implementation. Because of
+these limitations, this timer cannot be depended upon to
+be robust, and should not be used if that is of any concern.</p>
+<h3>Synopsis</h3>
+<pre>#include <boost/timer.hpp>
+namespace boost {
+class timer {
+ public:
+         timer();                        // postcondition: elapsed()==0
+  // compiler generated copy constructor, copy assignment, and dtor apply
+  void   restart();                      // post: elapsed()==0
+  double elapsed() const;                // return elapsed time in seconds
+
+  double elapsed_max() const;  // return estimated maximum value for elapsed()
+  // Portability warning: elapsed_max() may return too high a value on systems
+  // where std::clock_t overflows or resets at surprising values.
+
+  double elapsed_min() const;            // return minimum value for elapsed()
+  }; // timer
+} // namespace boost</pre>
+<h3>Exception safety</h3>
+<p>The constructors may throw <code>std::bad_alloc</code>.  No other member
+functions throw exceptions.</p>
+<h3>Future directions</h3>
+<p>There was a very reasonable request from Ed Brey for a method of determining
+the maximum value which may be returned by elapsed(), but there isn't a way to do so
+portably.  The issue has been raised with the group working on extended time functionality for the C language.  A solution
+may be years in the future. In the meantime, elapsed_max() provides an
+approximation.</p>
+<h2><a name="Class progress_timer">Class progress_timer</a></h2>
+<p>Class progress_timer automatically measures elapsed time, and then on
+destruction displays an elapsed time message at an appropriate place in an appropriate form. 
+The supplied implementation defaults to a character display on std::cout.</p>
+<p>Class progress_timer is often used to time program execution.  Its use is as simple as:</p>
+<blockquote>
+  <pre>#include <boost/progress.hpp>
+int main()
+{
+   progress_timer t;  // start timing
+   // do something ...
+   return 0;
+}</pre>
+</blockquote>
+<p>Which will produce some appropriate output, for example:</p>
+<blockquote>
+  <pre>1.23 s</pre>
+</blockquote>
+<p>Note that "s" is the official System International d'Unités
+abbreviation for seconds.</p>
+<h3>Synopsis</h3>
+<pre>#include <boost/progress.hpp>
+namespace boost {
+class progress_timer : public timer, noncopyable  {
+ public:
+   progress_timer();
+   progress_timer( std::ostream& os ); // os is hint; implementation may ignore
+   ~progress_timer();
+   }; // progress_display
+} // namespace boost</pre>
+<h3>Exception safety</h3>
+<p>The constructors may throw <code>std::bad_alloc</code>.  No other member
+functions throw exceptions.</p>
+<h2><a name="Class progress_display">Class progress_display</a></h2>
+<p>Class progress_display displays an appropriate indication of progress toward
+a predefined goal at an appropriate place in an appropriate form.  This
+meets a human need to know if a program is progressing.</p>
+<p>For example, if a lengthy computation must be done on a std::map<>
+named big_map, the follow code would display an indication of progress:</p>
+<pre>  progress_display show_progress( big_map.size() );
+  for ( big_map_t::iterator itr = big_map:begin();
+        itr != big_map.end(); ++itr )
+  {
+     // do the computation
+     ...
+     ++show_progress;
+  }</pre>
+<p>After 70% of the elements have been processed, the display might look
+something like this:</p>
+<blockquote>
+  <pre>0%   10   20   30   40   50   60   70   80   90   100%
+|----|----|----|----|----|----|----|----|----|----|
+************************************</pre>
+</blockquote>
+
+<h2>Synopsis</h2>
+<pre>#include <boost/progress.hpp>
+namespace boost {
+class progress_display : noncopyable {
+ public:
+   progress_display( unsigned long expected_count );
+   // Effects: restart(expected_count)
+
+   progress_display( unsigned long expected_count,
+                     std::ostream& os,  // os is hint; implementation may ignore
+                     const std::string & s1 = "\n", //leading strings
+                     const std::string & s2 = "",
+                     const std::string & s3 = "" )
+   // Effects: save copy of leading strings, restart(expected_count)
+
+   void           restart( unsigned long expected_count );
+   //  Effects: display appropriate scale on three lines,
+   //  prefaced by stored copy of s1, s2, s3, respectively, from constructor
+   //  Postconditions: count()==0, expected_count()==expected_count
+
+   unsigned long  operator+=( unsigned long increment )
+   //  Effects: Display appropriate progress tic if needed.
+   //  Postconditions: count()== original count() + increment
+   //  Returns: count().
+
+   unsigned long  operator++()
+   //  Returns: operator+=( 1 ).
+
+   unsigned long  count() const
+   //  Returns: The internal count.
+
+   unsigned long  expected_count() const
+   //  Returns: The expected_count from the constructor.
+
+   }; // progress_display
+} // namespace boost</pre>
+<h3>Exception safety</h3>
+<p>All member functions except count() and expected_count() do output, and so in
+theory may throw exceptions.  In practice it seems an exception being
+thrown is pretty unlikely, and probably implies such serious problems that an
+exception is warranted.  Note that there is no explicit destructor, so the
+destructor throwing is not an issue.</p>
+<h2>History</h2>
+<p>These classes are descended from older C++ and C functionality found useful
+by programmers for many years. Via the Boost mailing list, Reid Sweatman
+suggested separating the more widely useful timer class from the more targeted
+progress classes. Sean Corfield suggested allowing output to any ostream. 
+Dave Abrahams, Valentin Bonnard, Ed Brey, Andy Glew, and Dietmar Kühl also
+provided useful comments.  Ed Brey suggested timer::elapsed_max(). John
+Maddock suggested timer::elapsed_min(). Toon Knapen suggested the optional 
+leading strings, to allow for labeling the progress display</p>
+<h2>Rationale</h2>
+<p>The early versions of the timer classes had separate implementation
+files.  This caused problems for users not wishing to build libraries,
+caused difficulties building DLL's (because of cascaded use of other libraries
+which in turn brought illuminated compiler deficiencies), and caused the classes
+not to be used even when clearly applicable.  Thus the implementation was
+changed to all inline code.</p>
+<p>There have been several requests for platform specific implementations to use
+supposedly high-performance timers from the operating system API.  John
+Maddock submitted an implementation using the Win32 API.  Tests showed that
+while the precision of these timers was high, the latency was sometimes very
+much higher than for the std::clock() function, and that is very bad. 
+Furthermore, results using the Win32 API were very dependent on both the
+compiler (Microsoft and Borland were tested) and the operating system version
+(Windows NT, Windows 95, etc.)  Thus the std::clock() function was much
+more reliable, and so was retained even on this platform with its own timer API.</p>
+<hr>
+<p><font size="2">Revised:
+<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B %Y" startspan -->04 October 2011<!--webbot bot="Timestamp" endspan i-checksum="32185" --></font></p>
+
+<p><font size="2">© Copyright Beman Dawes 1999.</font></p>
+
+<p><font size="2">Distributed under the Boost Software License, Version 1.0. See
+</font>
+www.boost.org/LICENSE_1_0.txt</p>
+
+</body>
+
+</html>
\ No newline at end of file
Added: trunk/libs/timer/example/auto_cpu_timer_example.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/example/auto_cpu_timer_example.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,19 @@
+//  auto_cpu_timer_example.cpp  ------------------------------------------------------//
+
+//  Copyright Beman Dawes 2006
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/timer/timer.hpp>
+#include <cmath>
+
+int main()
+{
+  boost::timer::auto_cpu_timer t;
+
+  for ( long i = 0; i < 100000000; ++i )
+    std::sqrt( 123.456L );  // burn some time
+
+  return 0;
+}
Added: trunk/libs/timer/example/timex.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/example/timex.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,47 @@
+//  timex: timed execution program  ------------------------------------------//
+
+//  Copyright Beman Dawes 2007
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  See http://www.boost.org/libs/timer for documentation.
+
+#include <boost/timer/timer.hpp>
+#include <cstdlib>
+#include <string>
+#include <iostream>
+
+int main( int argc, char * argv[] )
+{
+  if ( argc == 1 )
+  {
+    std::cout << "invoke: timex [-v] command [args...]\n"
+      "  command will be executed and timings displayed\n"
+      "  -v option causes command and args to be displayed\n";
+    return 1;
+  }
+
+  std::string s;
+
+  bool verbose = false;
+  if ( argc > 1 && *argv[1] == '-' && *(argv[1]+1) == 'v' )
+  {
+    verbose = true;
+    ++argv;
+    --argc;
+  }
+
+  for ( int i = 1; i < argc; ++i )
+  {
+    if ( i > 1 ) s += ' ';
+    s += argv[i];
+  }
+
+  if ( verbose )
+    { std::cout << "command: \"" << s.c_str() << "\"\n"; }
+
+  boost::timer::auto_cpu_timer t(" %ws elapsed wall-clock time\n");
+
+  return std::system( s.c_str() );
+}
Modified: trunk/libs/timer/index.html
==============================================================================
--- trunk/libs/timer/index.html	(original)
+++ trunk/libs/timer/index.html	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -1,47 +1,14 @@
 <html>
-
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<title>Boost Timer Library</title>
+<meta http-equiv="refresh" content="0; URL=v3/doc/index.htm">
 </head>
-
-<body bgcolor="#FFFFFF" text="#000000">
-
-<table border="1" bgcolor="#007F7F" cellpadding="2">
-  <tr>
-    <td bgcolor="#FFFFFF"><img src="../../boost.png" alt="boost.png (6897 bytes)" width="277" height="86"></td>
-    <td>Home </td>
-    <td>Libraries </td>
-    <td>People </td>
-    <td>FAQ </td>
-    <td>More </td>
-  </tr>
-</table>
-
-<h1>Timer library</h1>
-
-<p>The timer library supplies a timer class for measuring elapsed time, a
-progress_timer class for reporting elapsed time, and a progress_display class
-for displaying an indication of progress toward a goal.
-
-<ul>
-  <li>Documentation (HTML).</li>
-  <li>Headers timer.hpp and progress.hpp</li>
-  <li>Test program timer_test.cpp</li>
-  <li>Submitted by Beman Dawes.</li>
-</ul>
-
-<p> </p>
+<body>
+Automatic redirection failed, please go to doc/index.html.
 <hr>
-<p>© Copyright Beman Dawes, 2001<br>
-Distributed under the Boost Software License, Version 1.0. See
-www.boost.org/LICENSE_1_0.txt</p>
-
-<p><!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->07 November, 2007<!--webbot bot="Timestamp" endspan i-checksum="39369" -->
-</p>
-
+<p>© Copyright Beman Dawes, 2003, 2011</p>
+<p> Distributed under the Boost Software 
+License, Version 1.0.</p>
+<p> See <a href="http://www.boost.org/LICENSE_1_0.txt">
+www.boost.org/LICENSE_1_0.txt</a></p>
 </body>
-
 </html>
\ No newline at end of file
Added: trunk/libs/timer/src/auto_timers.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/src/auto_timers.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,130 @@
+//  boost auto_cpu_timer.cpp  -----------------------------------------------------//
+
+//  Copyright Beman Dawes 1994-2006, 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt)
+
+//----------------------------------------------------------------------------//
+
+// define BOOST_TIMER_SOURCE so that <boost/timer/config.hpp> knows
+// the library is being built (possibly exporting rather than importing code)
+#define BOOST_TIMER_SOURCE 
+
+#include <boost/timer/timer.hpp>
+#include <boost/io/ios_state.hpp>
+#include <string>
+#include <sstream>
+#include <cstring>
+
+using boost::timer::nanosecond_type;
+using boost::timer::cpu_times;
+using boost::system::error_code;
+
+# if defined(BOOST_WINDOWS_API)
+#   include <windows.h>
+# elif defined(BOOST_POSIX_API)
+#   include <sys/times.h>
+# else
+# error unknown API
+# endif
+
+namespace
+{
+  //  cpu_timer helpers  ---------------------------------------------------------------//
+
+  void show_time(const cpu_times& times,
+    std::ostream& os, const std::string& fmt, short places)
+  //  NOTE WELL: Will truncate least-significant digits to LDBL_DIG, which may
+  //  be as low as 10, although will be 15 for many common platforms.
+  {
+    if (places > 9)
+      places = 9;
+    else if (places < 0)
+      places = boost::timer::default_places;
+ 
+    boost::io::ios_flags_saver ifs(os);
+    boost::io::ios_precision_saver ips(os);
+    os.setf(std::ios_base::fixed, std::ios_base::floatfield);
+    os.precision(places);
+
+    const long double sec = 1000000000.0L;
+    nanosecond_type total = times.system + times.user;
+    long double wall_sec = times.wall / sec;
+    long double total_sec = total / sec;
+
+    for (const char* format = fmt.c_str(); *format; ++format)
+    {
+      if (*format != '%' || !*(format+1) || !std::strchr("wustp", *(format+1)))
+        os << *format;  // anything except % followed by a valid format character
+                        // gets sent to the output stream
+      else
+      {
+        ++format;
+        switch (*format)
+        {
+        case 'w':
+          os << times.wall / sec;
+          break;
+        case 'u':
+          os << times.user / sec;
+          break;
+        case 's':
+          os << times.system / sec;
+          break;
+        case 't':
+          os << total / sec;
+          break;
+        case 'p':
+          os.precision(1);
+          if (wall_sec > 0.001L && total_sec > 0.001L)
+            os << (total_sec/wall_sec) * 100.0;
+          else
+            os << "n/a";
+          os.precision(places);
+          break;
+        }
+      }
+    }
+  }
+
+}  // unnamed namespace
+
+namespace boost
+{
+  namespace timer
+  {
+    //  format  ------------------------------------------------------------------------//
+
+    BOOST_TIMER_DECL
+    std::string format(const cpu_times& times, short places, const std::string& fmt)
+    {
+      std::stringstream ss;
+      show_time(times, ss, fmt, places);
+      return ss.str();
+    }
+ 
+    //  auto_cpu_timer  ----------------------------------------------------------------//
+
+    void auto_cpu_timer::report()
+    {
+        show_time(stop(), m_os, m_format, m_places);
+        resume();
+    }
+
+    auto_cpu_timer::~auto_cpu_timer()
+    { 
+      if (!is_stopped())
+      {
+        try
+        {
+          report();
+        }
+        catch (...) // eat any exceptions
+        {
+        }
+      }
+    }
+
+  } // namespace timer
+} // namespace boost
Added: trunk/libs/timer/src/auto_timers_construction.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/src/auto_timers_construction.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,37 @@
+//  boost auto_timers_construction.cpp  ------------------------------------------------//
+
+//  Copyright Beman Dawes 2007, 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/timer for documentation.
+
+//--------------------------------------------------------------------------------------//
+
+//  These constructors are in a separate file so that this translation unit will
+//  not be linked in except when one of the constructors is actually used. This
+//  is important since header <iostream> is required, and it incurs the cost of
+//  the standard stream objects even if they are not used.
+
+//--------------------------------------------------------------------------------------//
+
+// define BOOST_TIMER_SOURCE so that <boost/timer/config.hpp> knows
+// the library is being built (possibly exporting rather than importing code)
+#define BOOST_TIMER_SOURCE 
+
+#include <boost/timer/timer.hpp>
+#include <iostream>
+
+namespace boost
+{
+  namespace timer
+  {
+    auto_cpu_timer::auto_cpu_timer(short places, const std::string& format)
+      : m_places(places), m_os(std::cout), m_format(format) { start(); }
+
+    auto_cpu_timer::auto_cpu_timer(const std::string& format)
+      : m_places(default_places), m_os(std::cout), m_format(format) { start(); }
+
+  } // namespace timer
+} // namespace boost
Added: trunk/libs/timer/src/cpu_timer.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/src/cpu_timer.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,163 @@
+//  boost cpu_timer.cpp  ---------------------------------------------------------------//
+
+//  Copyright Beman Dawes 1994-2006, 2011
+
+//  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)
+
+//  See http://www.boost.org/libs/timer for documentation.
+
+//--------------------------------------------------------------------------------------//
+
+// define BOOST_TIMER_SOURCE so that <boost/timer/config.hpp> knows
+// the library is being built (possibly exporting rather than importing code)
+#define BOOST_TIMER_SOURCE
+
+#include <boost/timer/timer.hpp>
+#include <boost/chrono/chrono.hpp>
+#include <boost/io/ios_state.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/cerrno.hpp>
+#include <cstring>
+#include <cassert>
+
+# if defined(BOOST_WINDOWS_API)
+#   include <windows.h>
+# elif defined(BOOST_POSIX_API)
+#   include <unistd.h>
+#   include <sys/times.h>
+# else
+# error unknown API
+# endif
+
+using boost::system::error_code;
+
+namespace
+{
+
+# if defined(BOOST_POSIX_API)
+  boost::int_least64_t tick_factor() // multiplier to convert ticks
+                                     //  to nanoseconds; -1 if unknown
+  {
+    static boost::int_least64_t tick_factor = 0;
+    if (!tick_factor)
+    {
+      if ((tick_factor = ::sysconf(_SC_CLK_TCK)) <= 0)
+        tick_factor = -1;
+      else
+      {
+        assert(tick_factor <= 1000000000LL); // logic doesn't handle large ticks
+        tick_factor = 1000000000LL / tick_factor;  // compute factor
+        if (!tick_factor)
+          tick_factor = -1;
+      }
+    }
+    return tick_factor;
+  }
+# endif
+
+  void get_cpu_times(boost::timer::cpu_times& current)
+  {
+    boost::chrono::duration<boost::int64_t, boost::nano>
+      x (boost::chrono::high_resolution_clock::now().time_since_epoch());
+    current.wall = x.count();
+
+# if defined(BOOST_WINDOWS_API)
+
+    FILETIME creation, exit;
+    if (::GetProcessTimes(::GetCurrentProcess(), &creation, &exit,
+            (LPFILETIME)¤t.system, (LPFILETIME)¤t.user))
+    {
+      current.user   *= 100;  // Windows uses 100 nanosecond ticks
+      current.system *= 100;
+    }
+    else
+    {
+      current.system = current.user = boost::timer::nanosecond_type(-1);
+    }
+# else
+    tms tm;
+    clock_t c = ::times(&tm);
+    if (c == -1) // error
+    {
+      current.system = current.user = boost::timer::nanosecond_type(-1);
+    }
+    else
+    {
+      current.system = boost::timer::nanosecond_type(tm.tms_stime + tm.tms_cstime);
+      current.user = boost::timer::nanosecond_type(tm.tms_utime + tm.tms_cutime);
+      boost::int_least64_t factor;
+      if ((factor = tick_factor()) != -1)
+      {
+        current.user *= factor;
+        current.system *= factor;
+      }
+      else
+      {
+        current.user = current.system = boost::timer::nanosecond_type(-1);
+      }
+    }
+# endif
+  }
+
+} // unnamed namespace
+
+namespace boost
+{
+  namespace timer
+  {
+
+    BOOST_TIMER_DECL
+    const std::string&  default_format()
+    {
+      static std::string fmt(" %ws wall, %us user + %ss system = %ts CPU (%p%)\n");
+      return fmt;
+    }
+
+    //  cpu_timer  ---------------------------------------------------------------------//
+
+    void cpu_timer::start()
+    {
+      m_is_stopped = false;
+      get_cpu_times(m_times);
+    }
+
+    const cpu_times& cpu_timer::stop()
+    {
+      if (is_stopped())
+        return m_times;
+      m_is_stopped = true;
+      
+      cpu_times current;
+      get_cpu_times(current);
+      m_times.wall = (current.wall - m_times.wall);
+      m_times.user = (current.user - m_times.user);
+      m_times.system = (current.system - m_times.system);
+      return m_times;
+    }
+
+    cpu_times cpu_timer::elapsed() const
+    {
+      if (is_stopped())
+        return m_times;
+      cpu_times current;
+      get_cpu_times(current);
+      current.wall -= m_times.wall;
+      current.user -= m_times.user;
+      current.system -= m_times.system;
+      return current;
+    }
+
+    void cpu_timer::resume()
+    {
+      if (is_stopped())
+      {
+        cpu_times current (m_times);
+        start();
+        m_times.wall   -= current.wall;
+        m_times.user   -= current.user;
+        m_times.system -= current.system;
+      }
+    }
+  } // namespace timer
+} // namespace boost
Modified: trunk/libs/timer/test/Jamfile.v2
==============================================================================
--- trunk/libs/timer/test/Jamfile.v2	(original)
+++ trunk/libs/timer/test/Jamfile.v2	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -1,9 +1,39 @@
-#~ Copyright Rene Rivera 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)
+# Boost Timer Library test Jamfile
 
-import testing ;
+# Copyright Beman Dawes 2003, 2006, 2011
 
-test-suite timer
-    :   [ compile timer_test.cpp ]
+# Distributed under the Boost Software License, Version 1.0.
+# See http://www.boost.org/LICENSE_1_0.txt
+
+# See library home page at http://www.boost.org/libs/timer
+
+project
+    : requirements
+      <library>/boost/timer//boost_timer
+      <toolset>msvc:<asynch-exceptions>on
     ;
+ 
+   test-suite "timer"
+   :
+     [ run ../example/auto_cpu_timer_example.cpp
+       : # command line
+       : # input files
+       : <test-info>always_show_run_output # requirements
+     ]
+     [ run cpu_timer_info.cpp
+       : # command line
+       : # input files
+       : <test-info>always_show_run_output # requirements
+     ]
+     [ run cpu_timer_test.cpp
+       : # command line
+       : # input files
+       : <test-info>always_show_run_output # requirements
+     ]
+     [ run ../example/timex.cpp
+       : echo "Hello, world"
+	     :
+	     : <test-info>always_show_run_output
+     ]
+     [ compile original_timer_test.cpp ]
+   ;
Added: trunk/libs/timer/test/cpu_timer_info.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/test/cpu_timer_info.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,75 @@
+//  boost cpu_timer_info.cpp  ----------------------------------------------------------//
+
+//  Copyright Beman Dawes 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  See http://www.boost.org/libs/timer for documentation.
+
+#include <boost/timer/timer.hpp>
+#include <boost/chrono/chrono.hpp>
+#include <boost/detail/lightweight_main.hpp>
+#include <cstdlib> // for atol()
+#include <iostream>
+#include <locale>
+
+using boost::timer::nanosecond_type;
+using boost::timer::cpu_times;
+using boost::timer::cpu_timer;
+using boost::timer::auto_cpu_timer;
+using std::cout; using std::endl;
+
+int cpp_main( int argc, char * argv[] )
+{
+  cout << '\n';
+  cout << "For cpu_times.wall, the underlying clock "
+       << (boost::chrono::high_resolution_clock::is_steady
+           ? "is steady. "
+           : "is not steady. "
+          )
+       << "Steady clocks are defined by C++11 as clocks for which values "
+          "of time_point never decrease as physical time advances and for "
+          "which values of time_point advance at a steady rate relative to "
+          "real time. That is, the clock may not be adjusted.\n\n";
+  
+  cpu_times start_time;
+  start_time.clear();
+  cpu_times current_time;
+
+  {
+    cpu_timer cpu;
+    cout << "measure boost::timer::cpu_timer resolution for user time..."
+              << endl;
+    for (int i = 0; i < 3; ++i)
+    {
+      cpu.start();
+      start_time = cpu.elapsed();
+      current_time.user = start_time.user;
+      while (current_time.user == start_time.user)
+      {
+        current_time = cpu.elapsed();
+      }
+      cout << current_time.user - start_time.user << "ns\n";
+    }
+  }
+ 
+  {
+    cpu_timer cpu;
+    cout << "measure boost::timer::cpu_timer resolution for wall-clock time..."
+              << endl;
+    for (int i = 0; i < 100; ++i)
+    {
+      cpu.start();
+      start_time.wall = cpu.elapsed().wall;
+      current_time.wall = start_time.wall;
+      while (current_time.wall == start_time.wall)
+      {
+        current_time.wall = cpu.elapsed().wall;
+      }
+      cout << current_time.wall - start_time.wall << "ns ";
+    }
+  }
+ return 0;
+}
+
Added: trunk/libs/timer/test/cpu_timer_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/test/cpu_timer_test.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,133 @@
+//  boost timer_test.cpp  --------------------------------------------------------------//
+
+//  Copyright Beman Dawes 2006, 2011
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See  http://www.boost.org/LICENSE_1_0.txt
+
+//  See http://www.boost.org/libs/timer for documentation.
+
+#include <boost/timer/timer.hpp>
+#include <boost/detail/lightweight_main.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <cstdlib> // for atol()
+#include <iostream>
+#include <string>
+
+namespace old
+{
+#include <boost/timer.hpp>
+}
+
+using std::string;
+using std::cout;
+using std::endl;
+using boost::timer::nanosecond_type;
+using boost::timer::cpu_times;
+using boost::timer::format;
+using boost::timer::cpu_timer;
+using boost::timer::auto_cpu_timer;
+
+namespace
+{
+  void format_test()
+  {
+    cout << "format test..." << endl;
+
+    cpu_times times;
+    times.wall = 5123456789LL;
+    times.user = 2123456789LL;
+    times.system = 1234567890LL;
+
+    cout << "  times.wall is   " << times.wall << '\n';
+    cout << "  times.user is   " << times.user << '\n';
+    cout << "  times.system is " << times.system << '\n';
+    cout << "  user+system is  " << times.user + times.system << '\n';
+    cout << "  format(times, 9) output: " << format(times, 9);
+
+    BOOST_TEST_EQ(format(times, 9),
+      string(" 5.123456789s wall, 2.123456789s user + 1.234567890s system = 3.358024679s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 8),
+      string(" 5.12345679s wall, 2.12345679s user + 1.23456789s system = 3.35802468s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 7),
+      string(" 5.1234568s wall, 2.1234568s user + 1.2345679s system = 3.3580247s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 6),
+      string(" 5.123457s wall, 2.123457s user + 1.234568s system = 3.358025s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 5),
+      string(" 5.12346s wall, 2.12346s user + 1.23457s system = 3.35802s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 4),
+      string(" 5.1235s wall, 2.1235s user + 1.2346s system = 3.3580s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 3),
+      string(" 5.123s wall, 2.123s user + 1.235s system = 3.358s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 2),
+      string(" 5.12s wall, 2.12s user + 1.23s system = 3.36s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 1),
+      string(" 5.1s wall, 2.1s user + 1.2s system = 3.4s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 0),
+      string(" 5s wall, 2s user + 1s system = 3s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, 10),
+      string(" 5.123456789s wall, 2.123456789s user + 1.234567890s system = 3.358024679s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times, -1),
+      string(" 5.123457s wall, 2.123457s user + 1.234568s system = 3.358025s CPU (65.5%)\n"));
+    BOOST_TEST_EQ(format(times),
+      string(" 5.123457s wall, 2.123457s user + 1.234568s system = 3.358025s CPU (65.5%)\n"));
+
+    BOOST_TEST_EQ(format(times, 5, " %w, %u, %s, %t, %%p%"),
+      string(" 5.12346, 2.12346, 1.23457, 3.35802, %65.5%"));
+
+    BOOST_TEST_EQ(format(times, 5, "boo"), string("boo"));
+
+    cout << "  format test complete" << endl; 
+  }
+
+  void std_c_consistency_test()
+  {
+    cout << "C library consistency test..." << endl;
+
+    // This test is designed to account for C timer resolution and for the possibility
+    // that another active process may take up a lot of time.
+
+    cout << "  CLOCKS_PER_SEC is " << CLOCKS_PER_SEC << endl;
+
+    double c_t_elapsed;
+
+    old::boost::timer c_t;
+    cpu_timer t;
+
+    while (t.elapsed().wall < 1000000000) {}
+
+    t.stop();
+    c_t_elapsed = c_t.elapsed();
+
+    cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+    cout.precision(9);
+
+    cout << "  c_t_elapsed is " << c_t_elapsed << endl;
+    cout << "  t.elapsed().wall is " << t.elapsed().wall << endl;
+    cout << "  t.elapsed().wall/1000000000.0L is "
+         << t.elapsed().wall/1000000000.0L << endl;
+    cout << "  c_t_elapsed * 1.05L is "
+         << c_t_elapsed * 1.05L << endl;
+
+    BOOST_TEST(t.elapsed().wall >= 1000000000);
+
+    BOOST_TEST(t.elapsed().wall / 1000000000.0L <= c_t_elapsed * 1.05L); 
+
+    cout << "  C library consistency test complete" << endl; 
+  }
+
+
+}  // unnamed namespace
+
+//--------------------------------------------------------------------------------------//
+
+int cpp_main(int argc, char * argv[])
+{
+  cout << "----------  timer_test  ----------\n";
+
+  format_test();
+  std_c_consistency_test();
+
+  return ::boost::report_errors();
+}
+
Added: trunk/libs/timer/test/original_timer_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/timer/test/original_timer_test.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
@@ -0,0 +1,89 @@
+//  timer, job_timer, and progress_display sample program  -------------------//
+
+//  Copyright Beman Dawes 1998.  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)
+
+//  See http://www.boost.org/libs/timer for documentation.
+
+//  Revision History
+//  12 Jan 01  Cut time to 1.0 secs to speed regression tests (Beman Dawes)
+//  25 Sep 99  added elapsed_min() and elapsed_max() reporting
+//  16 Jul 99  Second beta
+//   6 Jul 99  Initial boost version
+
+#include <boost/progress.hpp>
+#include <iostream>
+#include <climits>
+
+using boost::timer;
+using boost::progress_timer;
+using boost::progress_display;
+using std::cout;
+using std::endl;
+
+int main() {
+
+  timer t0;  // used only for elapsed_max() and elapsed_min()
+
+  cout << "timer::elapsed_min() reports " << t0.elapsed_min() << " seconds\n";
+  cout << "timer::elapsed_max() reports " << t0.elapsed_max()
+       << " seconds, which is " << t0.elapsed_max()/3600.0 << " hours\n";
+
+  cout << "\nverify progress_display(0) doesn't divide by zero" << endl;
+  progress_display zero( 0 );  // verify 0 doesn't divide by zero
+  ++zero;
+
+  long loops;
+  timer loop_timer;
+  const double time = 1.0;
+
+  cout << "\ndetermine " << time << " second iteration count" << endl;
+  for ( loops = 0; loops < LONG_MAX
+     && loop_timer.elapsed() < time; ++loops ) {}
+  cout << loops << " iterations"<< endl;
+    
+  long i;
+  bool time_waster; // defeat [some] optimizers by storing result here
+
+  progress_timer pt;
+  timer t1;
+  timer t4;
+  timer t5;
+
+  cout << "\nburn about " << time << " seconds" << endl;
+  progress_display pd( loops );
+  for ( i = loops; i--; )
+    { time_waster = loop_timer.elapsed() < time; ++pd; }
+
+  timer t2( t1 );
+  timer t3;
+  t4 = t3;
+  t5.restart();
+
+  cout << "\nburn about " << time << " seconds again" << endl;
+  pd.restart( loops );
+  for ( i = loops; i--; )
+    { time_waster = loop_timer.elapsed() < time; ++pd; }
+
+  if ( time_waster ) cout << ' ';  // using time_waster quiets compiler warnings
+  progress_display pd2( 50, cout, "\nLead string 1 ", "Lead string 2 ", "Lead string 3 " );
+  for ( ; pd2.count() < 50; ++pd2 ) {}
+
+  cout << "\nt1 elapsed: " << t1.elapsed() << '\n';
+  cout << "t2 elapsed: " << t2.elapsed() << '\n';
+  cout << "t3 elapsed: " << t3.elapsed() << '\n';
+  cout << "t4 elapsed: " << t4.elapsed() << '\n';
+  cout << "t5 elapsed: " << t5.elapsed() << '\n';
+  cout << "t1 and t2 should report the same times (very approximately "
+       << 2*time << " seconds).\n";
+  cout << "t3, t4 and t5 should report about the same times,\n";
+  cout << "and these should be about half the t1 and t2 times.\n";
+  cout << "The following elapsed time should be slightly greater than t1."
+       << endl; 
+  return 0;
+  } // main
+
+
+
+
Deleted: trunk/libs/timer/test/timer_test.cpp
==============================================================================
--- trunk/libs/timer/test/timer_test.cpp	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
+++ (empty file)
@@ -1,89 +0,0 @@
-//  timer, job_timer, and progress_display sample program  -------------------//
-
-//  Copyright Beman Dawes 1998.  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)
-
-//  See http://www.boost.org/libs/timer for documentation.
-
-//  Revision History
-//  12 Jan 01  Cut time to 1.0 secs to speed regression tests (Beman Dawes)
-//  25 Sep 99  added elapsed_min() and elapsed_max() reporting
-//  16 Jul 99  Second beta
-//   6 Jul 99  Initial boost version
-
-#include <boost/progress.hpp>
-#include <iostream>
-#include <climits>
-
-using boost::timer;
-using boost::progress_timer;
-using boost::progress_display;
-using std::cout;
-using std::endl;
-
-int main() {
-
-  timer t0;  // used only for elapsed_max() and elapsed_min()
-
-  cout << "timer::elapsed_min() reports " << t0.elapsed_min() << " seconds\n";
-  cout << "timer::elapsed_max() reports " << t0.elapsed_max()
-       << " seconds, which is " << t0.elapsed_max()/3600.0 << " hours\n";
-
-  cout << "\nverify progress_display(0) doesn't divide by zero" << endl;
-  progress_display zero( 0 );  // verify 0 doesn't divide by zero
-  ++zero;
-
-  long loops;
-  timer loop_timer;
-  const double time = 1.0;
-
-  cout << "\ndetermine " << time << " second iteration count" << endl;
-  for ( loops = 0; loops < LONG_MAX
-     && loop_timer.elapsed() < time; ++loops ) {}
-  cout << loops << " iterations"<< endl;
-    
-  long i;
-  bool time_waster; // defeat [some] optimizers by storing result here
-
-  progress_timer pt;
-  timer t1;
-  timer t4;
-  timer t5;
-
-  cout << "\nburn about " << time << " seconds" << endl;
-  progress_display pd( loops );
-  for ( i = loops; i--; )
-    { time_waster = loop_timer.elapsed() < time; ++pd; }
-
-  timer t2( t1 );
-  timer t3;
-  t4 = t3;
-  t5.restart();
-
-  cout << "\nburn about " << time << " seconds again" << endl;
-  pd.restart( loops );
-  for ( i = loops; i--; )
-    { time_waster = loop_timer.elapsed() < time; ++pd; }
-
-  if ( time_waster ) cout << ' ';  // using time_waster quiets compiler warnings
-  progress_display pd2( 50, cout, "\nLead string 1 ", "Lead string 2 ", "Lead string 3 " );
-  for ( ; pd2.count() < 50; ++pd2 ) {}
-
-  cout << "\nt1 elapsed: " << t1.elapsed() << '\n';
-  cout << "t2 elapsed: " << t2.elapsed() << '\n';
-  cout << "t3 elapsed: " << t3.elapsed() << '\n';
-  cout << "t4 elapsed: " << t4.elapsed() << '\n';
-  cout << "t5 elapsed: " << t5.elapsed() << '\n';
-  cout << "t1 and t2 should report the same times (very approximately "
-       << 2*time << " seconds).\n";
-  cout << "t3, t4 and t5 should report about the same times,\n";
-  cout << "and these should be about half the t1 and t2 times.\n";
-  cout << "The following elapsed time should be slightly greater than t1."
-       << endl; 
-  return 0;
-  } // main
-
-
-
-
Deleted: trunk/libs/timer/timer.htm
==============================================================================
--- trunk/libs/timer/timer.htm	2011-10-04 11:06:50 EDT (Tue, 04 Oct 2011)
+++ (empty file)
@@ -1,213 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<title>Boost Timer Documentation</title>
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000">
-
-<h1>
-<img src="../../boost.png" alt="boost.png (6897 bytes)" align="center" width="277" height="86">
- Timer Library</h1>
-<p>The timer library provides two headers and three classes: </p>
-
-<blockquote>
-  <table border="1" cellpadding="5">
-    <tr>
-      <td><b>Header</b></td>
-      <td><b>Class</b></td>
-      <td><b>Functionality</b></td>
-    </tr>
-    <tr>
-      <td>timer.hpp</td>
-      <td>timer</td>
-      <td>Measure elapsed time.</td>
-    </tr>
-    <tr>
-      <td>progress.hpp</td>
-      <td>progress_timer</td>
-      <td>Measure elapsed time (using timer), display on destruction.</td>
-    </tr>
-    <tr>
-      <td>progress.hpp</td>
-      <td>progress_display</td>
-      <td>Display an indication of progress toward a known goal.</td>
-    </tr>
-  </table>
-</blockquote>
-<p>The objective in designing these classes was fairly limited - they are
-intended for simple uses like timing and reporting progress for programmer's
-tests or batch job streams. The specifications of the progress classes are
-worded in very general terms to permit alternate implementations such as for
-graphical user interfaces.</p>
-<h2><a name="Class timer">Class timer</a></h2>
-<p>Class timer measures elapsed time.  It is generally useful for minor
-timing tasks.  Its supplied implementation offers moderate portability at
-the cost of depending on the unknown accuracy and precision of the C Standard
-Library clock() function.  The maximum measurable elapsed time may be as
-low as 596.5 hours (or even less) for the supplied implementation. Because of
-these limitations, this timer cannot be depended upon to
-be robust, and should not be used if that is of any concern.</p>
-<h3>Synopsis</h3>
-<pre>#include <boost/timer.hpp>
-namespace boost {
-class timer {
- public:
-         timer();                        // postcondition: elapsed()==0
-  // compiler generated copy constructor, copy assignment, and dtor apply
-  void   restart();                      // post: elapsed()==0
-  double elapsed() const;                // return elapsed time in seconds
-
-  double elapsed_max() const;  // return estimated maximum value for elapsed()
-  // Portability warning: elapsed_max() may return too high a value on systems
-  // where std::clock_t overflows or resets at surprising values.
-
-  double elapsed_min() const;            // return minimum value for elapsed()
-  }; // timer
-} // namespace boost</pre>
-<h3>Exception safety</h3>
-<p>The constructors may throw <code>std::bad_alloc</code>.  No other member
-functions throw exceptions.</p>
-<h3>Future directions</h3>
-<p>There was a very reasonable request from Ed Brey for a method of determining
-the maximum value which may be returned by elapsed(), but there isn't a way to do so
-portably.  The issue has been raised with the group working on extended time functionality for the C language.  A solution
-may be years in the future. In the meantime, elapsed_max() provides an
-approximation.</p>
-<h2><a name="Class progress_timer">Class progress_timer</a></h2>
-<p>Class progress_timer automatically measures elapsed time, and then on
-destruction displays an elapsed time message at an appropriate place in an appropriate form. 
-The supplied implementation defaults to a character display on std::cout.</p>
-<p>Class progress_timer is often used to time program execution.  Its use is as simple as:</p>
-<blockquote>
-  <pre>#include <boost/progress.hpp>
-int main()
-{
-   progress_timer t;  // start timing
-   // do something ...
-   return 0;
-}</pre>
-</blockquote>
-<p>Which will produce some appropriate output, for example:</p>
-<blockquote>
-  <pre>1.23 s</pre>
-</blockquote>
-<p>Note that "s" is the official System International d'Unités
-abbreviation for seconds.</p>
-<h3>Synopsis</h3>
-<pre>#include <boost/progress.hpp>
-namespace boost {
-class progress_timer : public timer, noncopyable  {
- public:
-   progress_timer();
-   progress_timer( std::ostream& os ); // os is hint; implementation may ignore
-   ~progress_timer();
-   }; // progress_display
-} // namespace boost</pre>
-<h3>Exception safety</h3>
-<p>The constructors may throw <code>std::bad_alloc</code>.  No other member
-functions throw exceptions.</p>
-<h2><a name="Class progress_display">Class progress_display</a></h2>
-<p>Class progress_display displays an appropriate indication of progress toward
-a predefined goal at an appropriate place in an appropriate form.  This
-meets a human need to know if a program is progressing.</p>
-<p>For example, if a lengthy computation must be done on a std::map<>
-named big_map, the follow code would display an indication of progress:</p>
-<pre>  progress_display show_progress( big_map.size() );
-  for ( big_map_t::iterator itr = big_map:begin();
-        itr != big_map.end(); ++itr )
-  {
-     // do the computation
-     ...
-     ++show_progress;
-  }</pre>
-<p>After 70% of the elements have been processed, the display might look
-something like this:</p>
-<blockquote>
-  <pre>0%   10   20   30   40   50   60   70   80   90   100%
-|----|----|----|----|----|----|----|----|----|----|
-************************************</pre>
-</blockquote>
-
-<h2>Synopsis</h2>
-<pre>#include <boost/progress.hpp>
-namespace boost {
-class progress_display : noncopyable {
- public:
-   progress_display( unsigned long expected_count );
-   // Effects: restart(expected_count)
-
-   progress_display( unsigned long expected_count,
-                     std::ostream& os,  // os is hint; implementation may ignore
-                     const std::string & s1 = "\n", //leading strings
-                     const std::string & s2 = "",
-                     const std::string & s3 = "" )
-   // Effects: save copy of leading strings, restart(expected_count)
-
-   void           restart( unsigned long expected_count );
-   //  Effects: display appropriate scale on three lines,
-   //  prefaced by stored copy of s1, s2, s3, respectively, from constructor
-   //  Postconditions: count()==0, expected_count()==expected_count
-
-   unsigned long  operator+=( unsigned long increment )
-   //  Effects: Display appropriate progress tic if needed.
-   //  Postconditions: count()== original count() + increment
-   //  Returns: count().
-
-   unsigned long  operator++()
-   //  Returns: operator+=( 1 ).
-
-   unsigned long  count() const
-   //  Returns: The internal count.
-
-   unsigned long  expected_count() const
-   //  Returns: The expected_count from the constructor.
-
-   }; // progress_display
-} // namespace boost</pre>
-<h3>Exception safety</h3>
-<p>All member functions except count() and expected_count() do output, and so in
-theory may throw exceptions.  In practice it seems an exception being
-thrown is pretty unlikely, and probably implies such serious problems that an
-exception is warranted.  Note that there is no explicit destructor, so the
-destructor throwing is not an issue.</p>
-<h2>History</h2>
-<p>These classes are descended from older C++ and C functionality found useful
-by programmers for many years. Via the Boost mailing list, Reid Sweatman
-suggested separating the more widely useful timer class from the more targeted
-progress classes. Sean Corfield suggested allowing output to any ostream. 
-Dave Abrahams, Valentin Bonnard, Ed Brey, Andy Glew, and Dietmar Kühl also
-provided useful comments.  Ed Brey suggested timer::elapsed_max(). John
-Maddock suggested timer::elapsed_min(). Toon Knapen suggested the optional 
-leading strings, to allow for labeling the progress display</p>
-<h2>Rationale</h2>
-<p>The early versions of the timer classes had separate implementation
-files.  This caused problems for users not wishing to build libraries,
-caused difficulties building DLL's (because of cascaded use of other libraries
-which in turn brought illuminated compiler deficiencies), and caused the classes
-not to be used even when clearly applicable.  Thus the implementation was
-changed to all inline code.</p>
-<p>There have been several requests for platform specific implementations to use
-supposedly high-performance timers from the operating system API.  John
-Maddock submitted an implementation using the Win32 API.  Tests showed that
-while the precision of these timers was high, the latency was sometimes very
-much higher than for the std::clock() function, and that is very bad. 
-Furthermore, results using the Win32 API were very dependent on both the
-compiler (Microsoft and Borland were tested) and the operating system version
-(Windows NT, Windows 95, etc.)  Thus the std::clock() function was much
-more reliable, and so was retained even on this platform with its own timer API.</p>
-<hr>
-<p>© Copyright Beman Dawes 1999.<br>
-Distributed under the Boost Software License, Version 1.0. See
-www.boost.org/LICENSE_1_0.txt</p>
-
-<p>Revised <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%B %d, %Y" startspan -->November 07, 2007<!--webbot bot="Timestamp" i-checksum="39599" endspan -->
-</p>
-
-</body>
-
-</html>
\ No newline at end of file