1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>User's Guide</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../chrono.html" title="Chapter 7. Boost.Chrono 2.0.8"> 10<link rel="prev" href="../chrono.html" title="Chapter 7. Boost.Chrono 2.0.8"> 11<link rel="next" href="reference.html" title="Reference"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="../chrono.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../chrono.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="chrono.users_guide"></a><a class="link" href="users_guide.html" title="User's Guide">User's Guide</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="users_guide.html#chrono.users_guide.getting_started">Getting Started</a></span></dt> 32<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial">Tutorial</a></span></dt> 33<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples">Examples</a></span></dt> 34<dt><span class="section"><a href="users_guide.html#chrono.users_guide.ext_references">External Resources</a></span></dt> 35</dl></div> 36<div class="section"> 37<div class="titlepage"><div><div><h3 class="title"> 38<a name="chrono.users_guide.getting_started"></a><a class="link" href="users_guide.html#chrono.users_guide.getting_started" title="Getting Started">Getting Started</a> 39</h3></div></div></div> 40<div class="toc"><dl class="toc"> 41<dt><span class="section"><a href="users_guide.html#chrono.users_guide.getting_started.install">Installing 42 Chrono</a></span></dt> 43<dt><span class="section"><a href="users_guide.html#chrono.users_guide.getting_started.hello_world__">Hello 44 World! </a></span></dt> 45</dl></div> 46<div class="section"> 47<div class="titlepage"><div><div><h4 class="title"> 48<a name="chrono.users_guide.getting_started.install"></a><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install" title="Installing Chrono">Installing 49 Chrono</a> 50</h4></div></div></div> 51<h6> 52<a name="chrono.users_guide.getting_started.install.h0"></a> 53 <span class="phrase"><a name="chrono.users_guide.getting_started.install.getting__emphasis_role__bold__boost_chrono__emphasis__"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.getting__emphasis_role__bold__boost_chrono__emphasis__">Getting 54 <span class="bold"><strong>Boost.Chrono</strong></span> </a> 55 </h6> 56<p> 57 <span class="bold"><strong>Boost.Chrono</strong></span> is in the latest Boost release 58 in the folder <code class="computeroutput"><span class="special">/</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span></code>. 59 Documentation, tests and examples folder are at <code class="computeroutput"><span class="identifier">boost</span><span class="special">/</span><span class="identifier">libs</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span></code>. 60 </p> 61<p> 62 You can also access the latest (unstable?) state from the <a href="https://svn.boost.org/svn/boost-trunk" target="_top">Boost 63 trunk</a> directories boost/chrono and libs/chrono. Just go to <a href="http://svn.boost.org/trac/boost/wiki/BoostSubversion" target="_top">here</a> 64 and follow the instructions there for anonymous SVN access. 65 </p> 66<h6> 67<a name="chrono.users_guide.getting_started.install.h1"></a> 68 <span class="phrase"><a name="chrono.users_guide.getting_started.install.where_to_install_boost_chrono__"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.where_to_install_boost_chrono__">Where 69 to install Boost.Chrono? </a> 70 </h6> 71<p> 72 The simple way is to decompress (or checkout from SVN) the files in your 73 BOOST_ROOT directory. 74 </p> 75<h6> 76<a name="chrono.users_guide.getting_started.install.h2"></a> 77 <span class="phrase"><a name="chrono.users_guide.getting_started.install.building_boost_chrono_"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.building_boost_chrono_">Building 78 Boost.Chrono </a> 79 </h6> 80<p> 81 <span class="bold"><strong>Boost.Chrono</strong></span> can be configured as a header-only 82 library defining <a class="link" href="reference.html#chrono.reference.cpp0x.chrono_chrono_hpp.conf.header_only" title="How to Build Boost.Chrono as a Header Only Library?"><code class="computeroutput"><span class="identifier">BOOST_CHRONO_HEADER_ONLY</span></code></a>. However 83 Boost.Chrono depends on the non header-only library Boost.System, so that 84 you will need to link with boost_system. 85 </p> 86<p> 87 Boost.System has an undocumented feature (use of macro BOOST_ERROR_CODE_HEADER_ONLY) 88 to make it header only. 89 </p> 90<p> 91 If <a class="link" href="reference.html#chrono.reference.cpp0x.chrono_chrono_hpp.conf.header_only" title="How to Build Boost.Chrono as a Header Only Library?"><code class="computeroutput"><span class="identifier">BOOST_CHRONO_HEADER_ONLY</span></code></a> is not 92 defined you need to compile it and build the library before use, for example 93 using: 94 </p> 95<pre class="programlisting"><span class="identifier">bjam</span> <span class="identifier">libs</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">build</span> 96</pre> 97<h6> 98<a name="chrono.users_guide.getting_started.install.h3"></a> 99 <span class="phrase"><a name="chrono.users_guide.getting_started.install.requirements"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.requirements">Requirements</a> 100 </h6> 101<p> 102 In particular, <span class="bold"><strong>Boost.Chrono</strong></span> depends on: 103 </p> 104<div class="variablelist"> 105<p class="title"><b></b></p> 106<dl class="variablelist"> 107<dt><span class="term"><a href="http://www.boost.org/libs/config" target="_top"><span class="bold"><strong>Boost.Config</strong></span></a></span></dt> 108<dd><p> 109 for configuration purposes, ... 110 </p></dd> 111<dt><span class="term"><a href="http://www.boost.org/libs/exception" target="_top"><span class="bold"><strong>Boost.Exception</strong></span></a></span></dt> 112<dd><p> 113 for throw_exception, ... 114 </p></dd> 115<dt><span class="term"><a href="http://www.boost.org/libs/integer" target="_top"><span class="bold"><strong>Boost.Integer</strong></span></a></span></dt> 116<dd><p> 117 for cstdint conformance, ... 118 </p></dd> 119<dt><span class="term"><a href="http://www.boost.org/libs/mpl" target="_top"><span class="bold"><strong>Boost.MPL</strong></span></a></span></dt> 120<dd><p> 121 for MPL Assert and bool, logical ... 122 </p></dd> 123<dt><span class="term"><a href="http://www.boost.org/libs/operators" target="_top"><span class="bold"><strong>Boost.Operators</strong></span></a></span></dt> 124<dd><p> 125 for operators, ... 126 </p></dd> 127<dt><span class="term"><a href="http://www.boost.org/libs/ratio" target="_top"><span class="bold"><strong>Boost.Ratio</strong></span></a></span></dt> 128<dd><p> 129 for ratio, milli, micro, ... 130 </p></dd> 131<dt><span class="term"><a href="http://www.boost.org/libs/system" target="_top"><span class="bold"><strong>Boost.System</strong></span></a></span></dt> 132<dd><p> 133 for error_code, ... 134 </p></dd> 135<dt><span class="term"><a href="http://www.boost.org/libs/type_traits" target="_top"><span class="bold"><strong>Boost.TypeTraits</strong></span></a></span></dt> 136<dd><p> 137 for is_base, is_convertible, common_type, ... 138 </p></dd> 139<dt><span class="term"><a href="http://www.boost.org/libs/utility" target="_top"><span class="bold"><strong>Boost.Utility/EnableIf</strong></span></a></span></dt> 140<dd><p> 141 for enable_if, ... 142 </p></dd> 143</dl> 144</div> 145<h6> 146<a name="chrono.users_guide.getting_started.install.h4"></a> 147 <span class="phrase"><a name="chrono.users_guide.getting_started.install.building_an_executable_that_uses_boost_chrono_"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.building_an_executable_that_uses_boost_chrono_">Building 148 an Executable that Uses Boost.Chrono </a> 149 </h6> 150<p> 151 In addition to link with the <span class="bold"><strong>Boost.Chrono</strong></span> 152 library you need also to link with the <span class="bold"><strong>Boost.System</strong></span> 153 library. If <span class="bold"><strong>Boost.System</strong></span> is configured 154 defining BOOST_ERROR_CODE_HEADER_ONLY you will no need to link with it 155 as the dependent part is header only then. 156 </p> 157<h6> 158<a name="chrono.users_guide.getting_started.install.h5"></a> 159 <span class="phrase"><a name="chrono.users_guide.getting_started.install.exception_safety_"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.exception_safety_">Exception 160 safety </a> 161 </h6> 162<p> 163 All functions in the library are exception-neutral and provide strong guarantee 164 of exception safety as long as the underlying parameters provide it. 165 </p> 166<h6> 167<a name="chrono.users_guide.getting_started.install.h6"></a> 168 <span class="phrase"><a name="chrono.users_guide.getting_started.install.thread_safety_"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.thread_safety_">Thread 169 safety </a> 170 </h6> 171<p> 172 All functions in the library are thread-unsafe except when noted explicitly. 173 </p> 174<p> 175 As Boost.Chrono doesn't use mutable global variables the thread-safety 176 analysis is limited to the access to each instance variable. It is not 177 thread safe to use a function that modifies the access to a user variable 178 if another can be reading or writing it. 179 </p> 180<h6> 181<a name="chrono.users_guide.getting_started.install.h7"></a> 182 <span class="phrase"><a name="chrono.users_guide.getting_started.install.tested_compilers_"></a></span><a class="link" href="users_guide.html#chrono.users_guide.getting_started.install.tested_compilers_">Tested 183 compilers </a> 184 </h6> 185<p> 186 The implementation will eventually work with most C++03 conforming compilers. 187 Currently I use to test with on: 188 </p> 189<p> 190 Windows with 191 </p> 192<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 193 MSVC 10.0 194 </li></ul></div> 195<p> 196 MinGW with 197 </p> 198<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 199<li class="listitem"> 200 GCC 4.5.0 201 </li> 202<li class="listitem"> 203 GCC 4.5.0 -std=c++0x 204 </li> 205<li class="listitem"> 206 GCC 4.5.2 207 </li> 208<li class="listitem"> 209 GCC 4.5.2 -std=c++0x 210 </li> 211<li class="listitem"> 212 GCC 4.6.0 213 </li> 214<li class="listitem"> 215 GCC 4.6.0 -std=c++0x 216 </li> 217<li class="listitem"> 218 GCC 4.8.0 219 </li> 220<li class="listitem"> 221 GCC 4.8.0 -std=c++0x 222 </li> 223</ul></div> 224<p> 225 Ubuntu with * GCC 4.4.6 * GCC 4.4.6 -std=c++0x * GCC 4.5.4 * GCC 4.5.4 226 -std=c++0x * GCC 4.6.1 * GCC 4.6.1 -std=c++0x * Intel 12.1.3 * Intel 12.1.3 227 -std=c++0x 228 </p> 229<p> 230 OsX with 231 </p> 232<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 233<li class="listitem"> 234 GCC 4.1.2 235 </li> 236<li class="listitem"> 237 GCC 4.6.2 238 </li> 239<li class="listitem"> 240 GCC 4.6.2 -std=c++0x 241 </li> 242<li class="listitem"> 243 GCC 4.7.0 244 </li> 245<li class="listitem"> 246 GCC 4.7.0 -std=c++0x 247 </li> 248<li class="listitem"> 249 GCC 4.7.1 250 </li> 251<li class="listitem"> 252 GCC 4.7.1 -std=c++0x 253 </li> 254<li class="listitem"> 255 GCC 4.7.2 256 </li> 257<li class="listitem"> 258 GCC 4.7.2 -std=c++0x 259 </li> 260<li class="listitem"> 261 GCC 4.8.0 262 </li> 263<li class="listitem"> 264 GCC 4.8.0 -std=c++0x 265 </li> 266<li class="listitem"> 267 GCC 4.8.1 268 </li> 269<li class="listitem"> 270 GCC 4.8.1 -std=c++0x 271 </li> 272<li class="listitem"> 273 clang 3.1 274 </li> 275<li class="listitem"> 276 clang 3.1 -std=c++0x -stdlib=libc++ 277 </li> 278<li class="listitem"> 279 clang 3.2 280 </li> 281<li class="listitem"> 282 clang 3.2 -std=c++11 -stdlib=libc++ 283 </li> 284</ul></div> 285<p> 286 The committed code is tested with much more compilers. There are two compilers 287 (VACPP and Borland) that don't provide the needed features. Other as Intel 288 and Sun have some issues with i/o. While everything compiles and link correctly, 289 there are some runtime issues I have not cached yet. See the regression 290 tests for details. 291 </p> 292<div class="note"><table border="0" summary="Note"> 293<tr> 294<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 295<th align="left">Note</th> 296</tr> 297<tr><td align="left" valign="top"><p> 298 Please let us know how this works on other platforms/compilers. 299 </p></td></tr> 300</table></div> 301<div class="note"><table border="0" summary="Note"> 302<tr> 303<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 304<th align="left">Note</th> 305</tr> 306<tr><td align="left" valign="top"><p> 307 Please send any questions, comments and bug reports to boost <at> 308 lists <dot> boost <dot> org. 309 </p></td></tr> 310</table></div> 311</div> 312<div class="section"> 313<div class="titlepage"><div><div><h4 class="title"> 314<a name="chrono.users_guide.getting_started.hello_world__"></a><a class="link" href="users_guide.html#chrono.users_guide.getting_started.hello_world__" title="Hello World!">Hello 315 World! </a> 316</h4></div></div></div> 317<p> 318 [////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 319 If all you want to do is to time a program's execution, here is a complete 320 program: 321 </p> 322<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 323<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cmath</span><span class="special">></span> 324 325<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 326<span class="special">{</span> 327 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">start</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 328 329 <span class="keyword">for</span> <span class="special">(</span> <span class="keyword">long</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="number">10000000</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span> 330 <span class="identifier">std</span><span class="special">::</span><span class="identifier">sqrt</span><span class="special">(</span> <span class="number">123.456L</span> <span class="special">);</span> <span class="comment">// burn some time</span> 331 332 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">sec</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 333 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"took "</span> <span class="special"><<</span> <span class="identifier">sec</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" seconds\n"</span><span class="special">;</span> 334 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 335<span class="special">}</span> 336</pre> 337<p> 338 Output was: 339 </p> 340<pre class="programlisting"><span class="identifier">took</span> <span class="number">0.832</span> <span class="identifier">seconds</span> 341</pre> 342</div> 343</div> 344<div class="section"> 345<div class="titlepage"><div><div><h3 class="title"> 346<a name="chrono.users_guide.tutorial"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial" title="Tutorial">Tutorial</a> 347</h3></div></div></div> 348<div class="toc"><dl class="toc"> 349<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration">Duration</a></span></dt> 350<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.clocks">Clocks</a></span></dt> 351<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.time_point">Time Point</a></span></dt> 352<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.specific_clocks">Specific 353 Clocks</a></span></dt> 354<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.i_o">I/O</a></span></dt> 355</dl></div> 356<div class="section"> 357<div class="titlepage"><div><div><h4 class="title"> 358<a name="chrono.users_guide.tutorial.duration"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration" title="Duration">Duration</a> 359</h4></div></div></div> 360<div class="toc"><dl class="toc"> 361<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.so_what_exactly_is_a__duration__and_how_do_i_use_one_">So 362 What Exactly is a <code class="computeroutput"><span class="identifier">duration</span></code> 363 and How Do I Use One?</a></span></dt> 364<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.what_happens_if_i_assign__m3___us3__to__minutes__instead_of__microseconds__">What 365 Happens if I Assign <code class="computeroutput"><span class="identifier">m3</span> <span class="special">+</span> <span class="identifier">us3</span></code> 366 to <code class="computeroutput"><span class="identifier">minutes</span></code> Instead of 367 <code class="computeroutput"><span class="identifier">microseconds</span></code>?</a></span></dt> 368<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.but_what_if_the_truncation_behavior_is_what_i_want_to_do_">But 369 What if the Truncation Behavior is What I Want to Do?</a></span></dt> 370<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.round">Rounding 371 functions</a></span></dt> 372<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.trafficking_in_floating_point_durations">Trafficking 373 in floating-point Durations</a></span></dt> 374<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.how_expensive_is_all_of_this_">How 375 Expensive is All of this?</a></span></dt> 376<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.how_complicated_is_it_to_build_a_function_taking_a__duration__parameter_">How 377 Complicated is it to Build a Function Taking a <code class="computeroutput"><span class="identifier">duration</span></code> 378 Parameter?</a></span></dt> 379<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.is_it_possible_for_the_user_to_pass_a___duration_to_a_function_with_the_units_being_ambiguous_">Is it possible for the user to pass a <code class="computeroutput"><span class="identifier">duration</span></code> to a function with the 380 units being ambiguous?</a></span></dt> 381<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.duration.can_durations_overflow_">Can 382 Durations Overflow?</a></span></dt> 383</dl></div> 384<p> 385 The <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> is the heart of this 386 library. The interface that the user will see in everyday use is nearly 387 identical to that of <span class="bold"><strong>Boost.DateTime</strong></span> time 388 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s authored by Jeff Garland, 389 both in syntax and in behavior. This has been a very popular boost library 390 for 7 years. There is an enormous positive history with this interface. 391 </p> 392<p> 393 The library consists of six units of time <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>: 394 </p> 395<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 396<li class="listitem"> 397 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">hours</span></code></a> 398 </li> 399<li class="listitem"> 400 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">minutes</span></code></a> 401 </li> 402<li class="listitem"> 403 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">seconds</span></code></a> 404 </li> 405<li class="listitem"> 406 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a> 407 </li> 408<li class="listitem"> 409 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a> 410 </li> 411<li class="listitem"> 412 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a> 413 </li> 414</ul></div> 415<p> 416 These units were chosen as a subset of the boost library because they are 417 the most common units used when sleeping, waiting on a condition variable, 418 or waiting to obtain the lock on a mutex. Each of these units is nothing 419 but a thin wrapper around a signed integral count. That is, when you construct 420 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">minutes</span></code></a><code class="computeroutput"><span class="special">(</span><span class="number">3</span><span class="special">)</span></code>, all that 421 happens is a <code class="computeroutput"><span class="number">3</span></code> is stored inside 422 <code class="computeroutput"><span class="identifier">minutes</span></code>. When you construct 423 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><code class="computeroutput"><span class="special">(</span><span class="number">3</span><span class="special">)</span></code>, all that 424 happens is a <code class="computeroutput"><span class="number">3</span></code> is stored inside 425 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a>. 426 </p> 427<p> 428 The only context in which these different types differ is when being converted 429 to one another. At this time, unit-specific compile-time conversion constants 430 are used to convert the source unit to the target unit. Only conversions 431 from coarser units to finer units are allowed (in Boost). This restriction 432 ensures that all conversions are always exact. That is, <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a> can always represent 433 any value <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">minutes</span></code></a> has. 434 </p> 435<p> 436 In <span class="bold"><strong>Boost.DateTime</strong></span>, these units are united 437 via inheritance. <span class="bold"><strong>Boost.Chrono</strong></span> instead 438 unites these units through the class template <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>. That is, in <span class="bold"><strong>Boost.Chrono</strong></span> all six of the above units are nothing 439 but typedefs to different instantiations of <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>. This change from Boost.DateTime 440 has a far reaching positive impact, while not changing the syntax of the 441 everyday use at all. 442 </p> 443<p> 444 The most immediate positive impact is that the library can immediately 445 generate any unit, with any precision it needs. This is sometimes necessary 446 when doing comparisons or arithmetic between <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s of differing precision, 447 assuming one wants the comparison and arithmetic to be exact. 448 </p> 449<p> 450 A secondary benefit is that by publishing the class template <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> interface, user code 451 can very easily create <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s with any precision they 452 desire. The <code class="computeroutput"><span class="identifier">ratio</span></code> utility 453 is used to specify the precision, so as long as the precision can be expressed 454 by a rational constant with respect to seconds, this framework can exactly 455 represent it (one third of a second is no problem, and neither is one third 456 of a <code class="computeroutput"><span class="identifier">femto</span></code> second). All 457 of this utility and flexibility comes at no cost just by making use of 458 the no-run-time-overhead <code class="computeroutput"><span class="identifier">ratio</span></code> 459 facility. 460 </p> 461<p> 462 In Boost.DateTime, <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">hours</span></code></a> does not have the same representation 463 as <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a>. The former is usually 464 represented with a <code class="computeroutput"><span class="keyword">long</span></code> whereas 465 a <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">long</span></code> 466 is required for the latter. The reason for this is simply range. You don't 467 need many hours to cover an extremely large range of time. But this isn't 468 true of nanoseconds. Being able to reduce the sizeof overhead for some 469 units when possible, can be a significant performance advantage. 470 </p> 471<p> 472 <span class="bold"><strong>Boost.Chrono</strong></span> continues, and generalizes 473 that philosophy. Not only can one specify the precision of a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>, one can also specify 474 its representation. This can be any integral type, or even a floating-point 475 type. Or it can be a user-defined type which emulates an arithmetic type. 476 The six predefined units all use signed integral types as their representation. 477 And they all have a minimum range of ± 292 years. <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a> needs 64 bits to cover 478 that range. <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">hours</span></code></a> needs only 23 bits to cover 479 that range. 480 </p> 481<div class="section"> 482<div class="titlepage"><div><div><h5 class="title"> 483<a name="chrono.users_guide.tutorial.duration.so_what_exactly_is_a__duration__and_how_do_i_use_one_"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.so_what_exactly_is_a__duration__and_how_do_i_use_one_" title="So What Exactly is a duration and How Do I Use One?">So 484 What Exactly is a <code class="computeroutput"><span class="identifier">duration</span></code> 485 and How Do I Use One?</a> 486</h5></div></div></div> 487<p> 488 A <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> has a representation 489 and a tick period (precision). 490 </p> 491<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span> <span class="special">=</span> <code class="computeroutput"><span class="identifier">ratio</span></code><span class="special"><</span><span class="number">1</span><span class="special">></span> <span class="special">></span> <span class="keyword">class</span> <span class="identifier">duration</span><span class="special">;</span> 492</pre> 493<p> 494 The representation is simply any arithmetic type, or an emulation of 495 such a type. The representation stores a count of ticks. This count is 496 the only data member stored in a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>. If the representation 497 is floating-point, it can store fractions of a tick to the precision 498 of the representation. The tick period is represented by a <code class="computeroutput"><span class="identifier">ratio</span></code> and is encoded into the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>'s type, instead of 499 stored. The tick period only has an impact on the behavior of the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> when a conversion between 500 different <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s is attempted. The 501 tick period is completely ignored when simply doing arithmetic among 502 like <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s. 503 </p> 504<p> 505 <span class="bold"><strong>Example:</strong></span> 506 </p> 507<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">60</span><span class="special">></span> <span class="special">></span> <span class="identifier">minutes</span><span class="special">;</span> 508<span class="identifier">minutes</span> <span class="identifier">m1</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> <span class="comment">// m1 stores 3</span> 509<span class="identifier">minutes</span> <span class="identifier">m2</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> <span class="comment">// m2 stores 2</span> 510<span class="identifier">minutes</span> <span class="identifier">m3</span> <span class="special">=</span> <span class="identifier">m1</span> <span class="special">+</span> <span class="identifier">m2</span><span class="special">;</span> <span class="comment">// m3 stores 5</span> 511 512<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">micro</span><span class="special">></span> <span class="identifier">microseconds</span><span class="special">;</span> 513<span class="identifier">microseconds</span> <span class="identifier">us1</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> <span class="comment">// us1 stores 3</span> 514<span class="identifier">microseconds</span> <span class="identifier">us2</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> <span class="comment">// us2 stores 2</span> 515<span class="identifier">microseconds</span> <span class="identifier">us3</span> <span class="special">=</span> <span class="identifier">us1</span> <span class="special">+</span> <span class="identifier">us2</span><span class="special">;</span> <span class="comment">// us3 stores 5</span> 516 517<span class="identifier">microseconds</span> <span class="identifier">us4</span> <span class="special">=</span> <span class="identifier">m3</span> <span class="special">+</span> <span class="identifier">us3</span><span class="special">;</span> <span class="comment">// us4 stores 300000005</span> 518</pre> 519<p> 520 In the final line of code above, there is an implicit conversion from 521 minutes to microseconds, resulting in a relatively large number of microseconds. 522 </p> 523<p> 524 If you need to access the tick count within a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>, there is a member 525 <code class="computeroutput"><span class="identifier">count</span><span class="special">()</span></code> 526 which simply returns the stored tick count. 527 </p> 528<pre class="programlisting"><span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">tc</span> <span class="special">=</span> <span class="identifier">us4</span><span class="special">.</span><span class="identifier">count</span><span class="special">();</span> <span class="comment">// tc is 300000005</span> 529</pre> 530<p> 531 These <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>'s have very simple, 532 very predictable, and very observable behavior. After all, this is really 533 nothing but the time-tested interface of Jeff's boost time <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> library (unified with 534 templates instead of inheritance). 535 </p> 536</div> 537<div class="section"> 538<div class="titlepage"><div><div><h5 class="title"> 539<a name="chrono.users_guide.tutorial.duration.what_happens_if_i_assign__m3___us3__to__minutes__instead_of__microseconds__"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.what_happens_if_i_assign__m3___us3__to__minutes__instead_of__microseconds__" title="What Happens if I Assign m3 + us3 to minutes Instead of microseconds?">What 540 Happens if I Assign <code class="computeroutput"><span class="identifier">m3</span> <span class="special">+</span> <span class="identifier">us3</span></code> 541 to <code class="computeroutput"><span class="identifier">minutes</span></code> Instead of 542 <code class="computeroutput"><span class="identifier">microseconds</span></code>?</a> 543</h5></div></div></div> 544<pre class="programlisting"><span class="identifier">minutes</span> <span class="identifier">m4</span> <span class="special">=</span> <span class="identifier">m3</span> <span class="special">+</span> <span class="identifier">us3</span><span class="special">;</span> 545</pre> 546<p> 547 It won't compile! The rationale is that implicit truncation error should 548 not be allowed to happen. If this were to compile, then <code class="computeroutput"><span class="identifier">m4</span></code> would hold <code class="computeroutput"><span class="number">5</span></code>, 549 the same value as <code class="computeroutput"><span class="identifier">m3</span></code>. 550 The value associated with <code class="computeroutput"><span class="identifier">us3</span></code> 551 has been effectively ignored. This is similar to the problem of assigning 552 a double to an <code class="computeroutput"><span class="keyword">int</span></code>: the 553 fractional part gets silently discarded. 554 </p> 555</div> 556<div class="section"> 557<div class="titlepage"><div><div><h5 class="title"> 558<a name="chrono.users_guide.tutorial.duration.but_what_if_the_truncation_behavior_is_what_i_want_to_do_"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.but_what_if_the_truncation_behavior_is_what_i_want_to_do_" title="But What if the Truncation Behavior is What I Want to Do?">But 559 What if the Truncation Behavior is What I Want to Do?</a> 560</h5></div></div></div> 561<p> 562 There is a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a> facility to explicitly 563 ask for this behavior: 564 </p> 565<pre class="programlisting"><span class="identifier">minutes</span> <span class="identifier">m4</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><span class="identifier">minutes</span><span class="special">>(</span><span class="identifier">m3</span> <span class="special">+</span> <span class="identifier">us3</span><span class="special">);</span> <span class="comment">// m4.count() == 5</span> 566</pre> 567<p> 568 In general, one can perform <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> arithmetic at will. 569 If <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a> isn't used, and 570 it compiles, the arithmetic is exact. If one wants to override this exact 571 arithmetic behavior, <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a> can be used to 572 explicitly specify that desire. The <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a> has the same efficiency 573 as the implicit conversion, and will even be exact as often as it can. 574 </p> 575<p> 576 You can use <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><code class="computeroutput"><span class="special"><></span></code> 577 to convert the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> into whatever units 578 you desire. This facility will round down (truncate) if an exact conversion 579 is not possible. For example: 580 </p> 581<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a> <span class="identifier">start</span><span class="special">;</span> 582<span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a> <span class="identifier">end</span><span class="special">;</span> 583<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a> <span class="identifier">ms</span><span class="special">;</span> 584<span class="identifier">ms</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><span class="identifier">ms</span><span class="special">>(</span><span class="identifier">end</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">);</span> 585 586<span class="comment">// d now holds the number of milliseconds from start to end.</span> 587 588<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ms</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"ms\n"</span><span class="special">;</span> 589</pre> 590<p> 591 We can convert to <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a>, or some integral-based 592 duration which <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a> will always exactly 593 convert to, then <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><code class="computeroutput"><span class="special"><></span></code> 594 is unnecessary: 595 </p> 596<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a> <span class="identifier">ns</span><span class="special">;</span> 597<span class="identifier">ns</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">end</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 598<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ns</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"ns\n"</span><span class="special">;</span> 599</pre> 600<p> 601 If you need seconds with a floating-point representation you can also 602 eliminate the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><code class="computeroutput"><span class="special"><></span></code>: 603 </p> 604<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">sec</span><span class="special">;</span> <span class="comment">// seconds, stored with a double</span> 605<span class="identifier">sec</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">end</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 606<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">sec</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"s\n"</span><span class="special">;</span> 607</pre> 608<p> 609 If you're not sure if you need <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><code class="computeroutput"><span class="special"><></span></code> 610 or not, feel free to try it without. If the conversion is exact, or if 611 the destination has a floating-point representation, it will compile: 612 else it will not compile. 613 </p> 614<p> 615 If you need to use <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><code class="computeroutput"><span class="special"><></span></code>, 616 but want to round up, instead of down when the conversion is inexact, 617 here is a handy little helper function to do so. Writing it is actually 618 a good starter project for understanding <span class="bold"><strong>Boost.Chrono</strong></span>: 619 </p> 620<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">ToDuration</span></code></a><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 621<span class="identifier">ToDuration</span> 622<span class="identifier">round_up</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> 623<span class="special">{</span> 624 <span class="comment">// first round down</span> 625 <span class="identifier">ToDuration</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><span class="identifier">ToDuration</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 626 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special"><</span> <span class="identifier">d</span><span class="special">)</span> <span class="comment">// comparisons are *always* exact</span> 627 <span class="special">++</span><span class="identifier">result</span><span class="special">;</span> <span class="comment">// increment by one tick period</span> 628 <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span> 629<span class="special">}</span> 630 631<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a> <span class="identifier">ms</span><span class="special">;</span> 632<span class="identifier">ms</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">round_up</span><span class="special"><</span><span class="identifier">ms</span><span class="special">>(</span><span class="identifier">end</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">);</span> 633<span class="comment">// d now holds the number of milliseconds from start to end, rounded up.</span> 634<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ms</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"ms\n"</span><span class="special">;</span> 635</pre> 636</div> 637<div class="section"> 638<div class="titlepage"><div><div><h5 class="title"> 639<a name="chrono.users_guide.tutorial.duration.round"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.round" title="Rounding functions">Rounding 640 functions</a> 641</h5></div></div></div> 642<p> 643 <span class="bold"><strong>Boost.Chrono</strong></span> provides few simple rounding 644 utility functions for working with durations. 645 </p> 646<pre class="programlisting"><span class="comment">// round down</span> 647<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">To</span></code></a><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 648<span class="identifier">To</span> 649<span class="identifier">floor</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">)</span> 650<span class="special">{</span> 651 <span class="keyword">return</span> <span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">To</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 652<span class="special">}</span> 653 654<span class="comment">// round to nearest, to even on tie</span> 655<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">To</span></code></a><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 656<span class="identifier">To</span> 657<span class="identifier">round</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">)</span> 658<span class="special">{</span> 659 <span class="identifier">To</span> <span class="identifier">t0</span> <span class="special">=</span> <span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">To</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 660 <span class="identifier">To</span> <span class="identifier">t1</span> <span class="special">=</span> <span class="identifier">t0</span><span class="special">;</span> 661 <span class="special">++</span><span class="identifier">t1</span><span class="special">;</span> 662 <span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">diff0</span><span class="special">,</span> <span class="identifier">d</span> <span class="special">-</span> <span class="identifier">t0</span><span class="special">);</span> 663 <span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">diff1</span><span class="special">,</span> <span class="identifier">t1</span> <span class="special">-</span> <span class="identifier">d</span><span class="special">);</span> 664 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">diff0</span> <span class="special">==</span> <span class="identifier">diff1</span><span class="special">)</span> 665 <span class="special">{</span> 666 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t0</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&</span> <span class="number">1</span><span class="special">)</span> 667 <span class="keyword">return</span> <span class="identifier">t1</span><span class="special">;</span> 668 <span class="keyword">return</span> <span class="identifier">t0</span><span class="special">;</span> 669 <span class="special">}</span> 670 <span class="keyword">else</span> <span class="keyword">if</span> <span class="special">(</span><span class="identifier">diff0</span> <span class="special"><</span> <span class="identifier">diff1</span><span class="special">)</span> 671 <span class="keyword">return</span> <span class="identifier">t0</span><span class="special">;</span> 672 <span class="keyword">return</span> <span class="identifier">t1</span><span class="special">;</span> 673<span class="special">}</span> 674<span class="comment">// round up</span> 675<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">To</span></code></a><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 676<span class="identifier">To</span> 677<span class="identifier">ceil</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">)</span> 678<span class="special">{</span> 679 <span class="identifier">To</span> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">To</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 680 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span> <span class="special"><</span> <span class="identifier">d</span><span class="special">)</span> 681 <span class="special">++</span><span class="identifier">t</span><span class="special">;</span> 682 <span class="keyword">return</span> <span class="identifier">t</span><span class="special">;</span> 683<span class="special">}</span> 684</pre> 685<p> 686 The beauty of the chrono library is the ease and accuracy with which 687 such conversions can be made. For example to convert from <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a> (<code class="computeroutput"><span class="number">1</span><span class="special">/</span><span class="number">1000</span></code> 688 of a second), to <code class="computeroutput"><span class="number">1</span><span class="special">/</span><span class="number">30</span></code> of a second, one must multiply the milliseconds 689 by <code class="computeroutput"><span class="number">0.03</span></code>. It is common knowledge 690 that you can't exactly represent <code class="computeroutput"><span class="number">0.03</span></code> 691 in a computer. Nevertheless round will exactly (with no round off error) 692 detect a tie and round to even when this happens. The differences <code class="computeroutput"><span class="identifier">diff0</span></code> and <code class="computeroutput"><span class="identifier">diff1</span></code> 693 are not approximate, but exact differences, even when <code class="computeroutput"><span class="identifier">d</span></code> 694 has the units of millisecond and <code class="computeroutput"><span class="identifier">To</span></code> 695 is <code class="computeroutput"><span class="number">1</span><span class="special">/</span><span class="number">30</span></code> of a second. The unit of <code class="computeroutput"><span class="identifier">diff0</span></code> and <code class="computeroutput"><span class="identifier">diff1</span></code> 696 is <code class="computeroutput"><span class="number">1</span><span class="special">/</span><span class="number">3000</span></code> of a second which both millisecond 697 and <code class="computeroutput"><span class="number">1</span><span class="special">/</span><span class="number">30</span></code> of a second exactly convert to (with 698 no truncation error). 699 </p> 700<p> 701 Similarly, the comparison <code class="computeroutput"><span class="identifier">t</span> 702 <span class="special"><</span> <span class="identifier">d</span></code> 703 in <a class="link" href="reference.html#chrono.reference.round.ceil_hpp" title="Header <boost/chrono/ceil.hpp>"><code class="computeroutput"><span class="identifier">ceil</span></code></a> 704 is exact, even when there is no exact conversion between <code class="computeroutput"><span class="identifier">t</span></code> and <code class="computeroutput"><span class="identifier">d</span></code>. 705 Example use of rounding functions 706 </p> 707<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 708<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">chrono_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 709<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">floor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 710<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">round</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 711<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">ceil</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 712 713<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 714<span class="special">{</span> 715 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">;</span> 716 <span class="identifier">milliseconds</span> <span class="identifier">ms</span><span class="special">(</span><span class="number">2500</span><span class="special">);</span> 717 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">floor</span><span class="special"><</span><span class="identifier">seconds</span><span class="special">>(</span><span class="identifier">ms</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 718 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">round</span><span class="special"><</span><span class="identifier">seconds</span><span class="special">>(</span><span class="identifier">ms</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 719 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ceil</span><span class="special"><</span><span class="identifier">seconds</span><span class="special">>(</span><span class="identifier">ms</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 720 <span class="identifier">ms</span> <span class="special">=</span> <span class="identifier">milliseconds</span><span class="special">(</span><span class="number">2516</span><span class="special">);</span> 721 <span class="keyword">typedef</span> <span class="identifier">duration</span><span class="special"><</span><span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">1</span><span class="special">,</span> <span class="number">30</span><span class="special">></span> <span class="special">></span> <span class="identifier">frame_rate</span><span class="special">;</span> 722 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">floor</span><span class="special"><</span><span class="identifier">frame_rate</span><span class="special">>(</span><span class="identifier">ms</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 723 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">round</span><span class="special"><</span><span class="identifier">frame_rate</span><span class="special">>(</span><span class="identifier">ms</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 724 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ceil</span><span class="special"><</span><span class="identifier">frame_rate</span><span class="special">>(</span><span class="identifier">ms</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 725 726 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 727<span class="special">}</span> 728</pre> 729<p> 730 The output of this program should be 731 </p> 732<pre class="programlisting"><span class="number">2</span> <span class="identifier">seconds</span> 733<span class="number">2</span> <span class="identifier">seconds</span> 734<span class="number">3</span> <span class="identifier">seconds</span> 735<span class="number">75</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">30</span><span class="special">]</span><span class="identifier">seconds</span> 736<span class="number">75</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">30</span><span class="special">]</span><span class="identifier">seconds</span> 737<span class="number">76</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">30</span><span class="special">]</span><span class="identifier">seconds</span> 738</pre> 739</div> 740<div class="section"> 741<div class="titlepage"><div><div><h5 class="title"> 742<a name="chrono.users_guide.tutorial.duration.trafficking_in_floating_point_durations"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.trafficking_in_floating_point_durations" title="Trafficking in floating-point Durations">Trafficking 743 in floating-point Durations</a> 744</h5></div></div></div> 745<p> 746 I don't want to deal with writing <code class="computeroutput"><span class="identifier">duration_cast</span></code> 747 all over the place. I'm content with the precision of my floating-point 748 representation. 749 </p> 750<p> 751 Not a problem. When the destination of a conversion has floating-point 752 representation, all conversions are allowed to happen implicitly. 753 </p> 754<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <code class="computeroutput"><span class="identifier">ratio</span></code><span class="special"><</span><span class="number">60</span><span class="special">></span> <span class="special">></span> <span class="identifier">dminutes</span><span class="special">;</span> 755<span class="identifier">dminutes</span> <span class="identifier">dm4</span> <span class="special">=</span> <span class="identifier">m3</span> <span class="special">+</span> <span class="identifier">us3</span><span class="special">;</span> <span class="comment">// dm4.count() == 5.000000083333333</span> 756</pre> 757</div> 758<div class="section"> 759<div class="titlepage"><div><div><h5 class="title"> 760<a name="chrono.users_guide.tutorial.duration.how_expensive_is_all_of_this_"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.how_expensive_is_all_of_this_" title="How Expensive is All of this?">How 761 Expensive is All of this?</a> 762</h5></div></div></div> 763<p> 764 If you were writing these conversions by hand, you could not make it 765 more efficient. The use of <code class="computeroutput"><span class="identifier">ratio</span></code> 766 ensures that all conversion constants are simplified as much as possible 767 at compile-time. This usually results in the numerator or denominator 768 of the conversion factor simplifying to <code class="computeroutput"><span class="number">1</span></code>, 769 and being subsequently ignored in converting the run-time values of the 770 tick counts. 771 </p> 772</div> 773<div class="section"> 774<div class="titlepage"><div><div><h5 class="title"> 775<a name="chrono.users_guide.tutorial.duration.how_complicated_is_it_to_build_a_function_taking_a__duration__parameter_"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.how_complicated_is_it_to_build_a_function_taking_a__duration__parameter_" title="How Complicated is it to Build a Function Taking a duration Parameter?">How 776 Complicated is it to Build a Function Taking a <code class="computeroutput"><span class="identifier">duration</span></code> 777 Parameter?</a> 778</h5></div></div></div> 779<p> 780 There are several options open to the user: 781 </p> 782<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 783 If the author of the function wants to accept any <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>, and is willing 784 to work in floating-point <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s, he can simply 785 use any floating-point <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> as the parameter: 786 </li></ul></div> 787<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> <span class="comment">// accept floating-point seconds</span> 788<span class="special">{</span> 789 <span class="comment">// d.count() == 3.e-6 when passed boost::chrono::microseconds(3)</span> 790<span class="special">}</span> 791 792<span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">microseconds</span><span class="special">(</span><span class="number">3</span><span class="special">));</span> 793</pre> 794<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 795 If the author of the function wants to traffic only in integral 796 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s, and is content 797 with handling nothing finer than say nanoseconds (just as an example), 798 he can simply specify nanoseconds as the parameter: 799 </li></ul></div> 800<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span> <span class="identifier">d</span><span class="special">)</span> 801<span class="special">{</span> 802 <span class="comment">// d.count() == 3000 when passed boost::chrono::microseconds(3)</span> 803<span class="special">}</span> 804 805<span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">microseconds</span><span class="special">(</span><span class="number">3</span><span class="special">));</span> 806</pre> 807<p> 808 In this design, if the client wants to pass in a floating-point <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>, or a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> of finer precision 809 than nanoseconds, then the client is responsible for choosing his own 810 rounding mode in the conversion to nanoseconds. 811 </p> 812<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">s</span><span class="special">(</span><span class="number">1.</span><span class="special">/</span><span class="number">3</span><span class="special">);</span> <span class="comment">// 1/3 of a second</span> 813<span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span><span class="special">>(</span><span class="identifier">s</span><span class="special">));</span> <span class="comment">// round towards zero in conversion to nanoseconds</span> 814</pre> 815<p> 816 In the example above, the client of f has chosen "round towards 817 zero" as the desired rounding mode to nanoseconds. If the client 818 has a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> that won't exactly 819 convert to nanoseconds, and fails to choose how the conversion will take 820 place, the compiler will refuse the call: 821 </p> 822<pre class="programlisting"><span class="identifier">f</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span> <span class="comment">// does not compile</span> 823</pre> 824<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 825 If the author of the function wants to accept any <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>, but wants to work 826 with integral representations and wants to control the rounding mode 827 internally, then he can template the function: 828 </li></ul></div> 829<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 830<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> 831<span class="special">{</span> 832 <span class="comment">// convert d to nanoseconds, rounding up if it is not an exact conversion</span> 833 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span> <span class="identifier">ns</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 834 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">ns</span> <span class="special"><</span> <span class="identifier">d</span><span class="special">)</span> 835 <span class="special">++</span><span class="identifier">ns</span><span class="special">;</span> 836 <span class="comment">// ns.count() == 333333334 when passed 1/3 of a floating-point second</span> 837<span class="special">}</span> 838 839 <span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">1.</span><span class="special">/</span><span class="number">3</span><span class="special">));</span> 840</pre> 841<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 842 If the author in the example does not want to accept floating-point 843 based <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s, he can enforce 844 that behavior like so: 845 </li></ul></div> 846<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 847<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> 848<span class="special">{</span> 849 <span class="comment">// convert d to nanoseconds, rounding up if it is not an exact conversion</span> 850 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span> <span class="identifier">ns</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">nanoseconds</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 851 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">ns</span> <span class="special"><</span> <span class="identifier">d</span><span class="special">)</span> 852 <span class="special">++</span><span class="identifier">ns</span><span class="special">;</span> 853 <span class="comment">// ns.count() == 333333334 when passed 333333333333 picoseconds</span> 854<span class="special">}</span> 855<span class="comment">// About 1/3 of a second worth of picoseconds</span> 856<span class="identifier">f</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">pico</span><span class="special">>(</span><span class="number">333333333333</span><span class="special">));</span> 857</pre> 858<p> 859 Clients with floating-point <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s who want to use f 860 will now have to convert to an integral <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> themselves before passing 861 the result to f. 862 </p> 863<p> 864 In summary, the author of f has quite a bit of flexibility and control 865 in the interface he wants to provide his clients with, and easy options 866 for manipulating that <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> internal to his function. 867 </p> 868</div> 869<div class="section"> 870<div class="titlepage"><div><div><h5 class="title"> 871<a name="chrono.users_guide.tutorial.duration.is_it_possible_for_the_user_to_pass_a___duration_to_a_function_with_the_units_being_ambiguous_"></a>Is it possible for the user to pass a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> to a function with the 872 units being ambiguous?</h5></div></div></div> 873<p> 874 No. No matter which option the author of <code class="computeroutput"><span class="identifier">f</span></code> 875 chooses above, the following client code will not compile: 876 </p> 877<pre class="programlisting"><span class="identifier">f</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> <span class="comment">// Will not compile, 3 is not implicitly convertible to any __duration</span> 878</pre> 879</div> 880<div class="section"> 881<div class="titlepage"><div><div><h5 class="title"> 882<a name="chrono.users_guide.tutorial.duration.can_durations_overflow_"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.duration.can_durations_overflow_" title="Can Durations Overflow?">Can 883 Durations Overflow?</a> 884</h5></div></div></div> 885<p> 886 This depend on the representation. The default typedefs uses a representation 887 that don't handle overflows. The user can define his own representation 888 that manage overflow as required by its application. 889 </p> 890</div> 891</div> 892<div class="section"> 893<div class="titlepage"><div><div><h4 class="title"> 894<a name="chrono.users_guide.tutorial.clocks"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.clocks" title="Clocks">Clocks</a> 895</h4></div></div></div> 896<p> 897 While <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s only have precision 898 and representation to concern themselves, clocks and <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s are intimately related 899 and refer to one another. Because clocks are simpler to explain, we will 900 do so first without fully explaining <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s. Once clocks are introduced, 901 it will be easier to then fill in what a <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> is. 902 </p> 903<p> 904 A clock is a concept which bundles 3 things: 905 </p> 906<div class="orderedlist"><ol class="orderedlist" type="1"> 907<li class="listitem"> 908 A concrete <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> type. 909 </li> 910<li class="listitem"> 911 A concrete <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> type. 912 </li> 913<li class="listitem"> 914 A function called now() which returns the concrete <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>. 915 </li> 916</ol></div> 917<p> 918 The standard defines three system-wide clocks that are associated to the 919 computer time. 920 </p> 921<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 922<li class="listitem"> 923 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a> represents system-wide 924 realtime clock that can be synchronized with an external clock. 925 </li> 926<li class="listitem"> 927 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a> can not be changed 928 explicitly and the time since the initial epoch increase in a steady 929 way. 930 </li> 931<li class="listitem"> 932 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock" title="Class high_resolution_clock"><code class="computeroutput"><span class="identifier">high_resolution_clock</span></code></a> intend 933 to use the system-wide clock provided by the platform with the highest 934 resolution. 935 </li> 936</ul></div> 937<p> 938 <span class="bold"><strong>Boost.Chrono</strong></span> provides them when supported 939 by the underlying platform. A given platform may not be able to supply 940 all three of these clocks. 941 </p> 942<p> 943 The library adds some clocks that are specific to a process or a thread, 944 that is there is a clock per process or per thread. 945 </p> 946<p> 947 The user is also able to easily create more clocks. 948 </p> 949<p> 950 Given a clock named Clock, it will have: 951 </p> 952<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">Clock</span> <span class="special">{</span> 953<span class="keyword">public</span><span class="special">:</span> 954 <span class="keyword">typedef</span> <span class="identifier">an</span> <span class="identifier">arithmetic</span><span class="special">-</span><span class="identifier">like</span> <span class="identifier">type</span> <span class="identifier">rep</span><span class="special">;</span> 955 <span class="keyword">typedef</span> <span class="identifier">an</span> <span class="identifier">instantiation</span> <span class="identifier">of</span> <span class="identifier">ratio</span> <span class="identifier">period</span><span class="special">;</span> 956 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">rep</span><span class="special">,</span> <span class="identifier">period</span><span class="special">></span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special">;</span> 957 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">></span> <span class="identifier">time_point</span><span class="special">;</span> 958 <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keyword">bool</span> <span class="identifier">is_steady</span> <span class="special">=</span> <span class="keyword">true</span> <span class="keyword">or</span> <span class="keyword">false</span><span class="special">;</span> 959 960 <span class="keyword">static</span> <span class="identifier">time_point</span> <span class="identifier">now</span><span class="special">();</span> 961<span class="special">};</span> 962</pre> 963<p> 964 One can get the current time from Clock with: 965 </p> 966<pre class="programlisting"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">t1</span> <span class="special">=</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 967</pre> 968<p> 969 And one can get the time <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> between two <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s associated with Clock 970 with: 971 </p> 972<pre class="programlisting"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">t1</span><span class="special">;</span> 973</pre> 974<p> 975 And one can specify a past or future <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> with: 976 </p> 977<pre class="programlisting"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">t2</span> <span class="special">=</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">;</span> 978</pre> 979<p> 980 Note how even if a particular clock becomes obsolete, the next clock in 981 line will have the same API. There is no new learning curve to come up. 982 The only source code changes will be simply changing the type of the clock. 983 The same <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> and <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> framework continues 984 to work as new clocks are introduced. And multiple clocks are safely and 985 easily handled within the same program. 986 </p> 987</div> 988<div class="section"> 989<div class="titlepage"><div><div><h4 class="title"> 990<a name="chrono.users_guide.tutorial.time_point"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.time_point" title="Time Point">Time Point</a> 991</h4></div></div></div> 992<div class="toc"><dl class="toc"><dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.time_point.so_what_exactly_is_a__time_point__and_how_do_i_use_one_">So 993 What Exactly is a <code class="computeroutput"><span class="identifier">time_point</span></code> 994 and How Do I Use One?</a></span></dt></dl></div> 995<p> 996 A <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> represents a point 997 in time, as opposed to a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> of time. Another way 998 of saying the same thing, is that a <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> represents an epoch 999 plus or minus a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>. Examples of <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s include: 1000 </p> 1001<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1002<li class="listitem"> 1003 3 minutes after the computer booted. 1004 </li> 1005<li class="listitem"> 1006 03:14:07 UTC on Tuesday, January 19, 2038 1007 </li> 1008<li class="listitem"> 1009 20 milliseconds after I started that timer. 1010 </li> 1011</ul></div> 1012<p> 1013 In each of the examples above, a different epoch is implied. Sometimes 1014 an epoch has meaning for several millennia. Other times the meaning of 1015 an epoch is lost after a while (such as the start of a timer, or when the 1016 computer booted). However, if two <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s are known to share 1017 the same epoch, they can be subtracted, yielding a valid <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>, even if the definition 1018 of the epoch no longer has meaning. 1019 </p> 1020<p> 1021 In <span class="bold"><strong>Boost.Chrono</strong></span>, an epoch is a purely 1022 abstract and unspecified concept. There is no type representing an epoch. 1023 It is simply an idea that relates (or doesn't) <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s to a clock, and in 1024 the case that they share a clock, <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s to one another. <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s associated with different 1025 clocks are generally not interoperable unless the relationship between 1026 the epochs associated with each clock is known. 1027 </p> 1028<div class="section"> 1029<div class="titlepage"><div><div><h5 class="title"> 1030<a name="chrono.users_guide.tutorial.time_point.so_what_exactly_is_a__time_point__and_how_do_i_use_one_"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.time_point.so_what_exactly_is_a__time_point__and_how_do_i_use_one_" title="So What Exactly is a time_point and How Do I Use One?">So 1031 What Exactly is a <code class="computeroutput"><span class="identifier">time_point</span></code> 1032 and How Do I Use One?</a> 1033</h5></div></div></div> 1034<p> 1035 A <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> has a clock and a 1036 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>. 1037 </p> 1038<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">></span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special">;</span> 1039</pre> 1040<p> 1041 The <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>'s clock is not stored. 1042 It is simply embedded into the <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>'s type and serves 1043 two purposes: 1044 </p> 1045<div class="orderedlist"><ol class="orderedlist" type="1"> 1046<li class="listitem"> 1047 Because <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s originating 1048 from different clocks have different types, the compiler can be instructed 1049 to fail if incompatible <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s are used in 1050 inappropriate ways. 1051 </li> 1052<li class="listitem"> 1053 Given a <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>, one often needs 1054 to compare that <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> to "now". 1055 This is very simple as long as the <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> knows what clock 1056 it is defined with respect to. 1057 </li> 1058</ol></div> 1059<p> 1060 A <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>'s <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> is stored as the only 1061 data member of the <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>. Thus <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s and their corresponding 1062 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> have exactly the same 1063 layout. But they have very different meanings. For example, it is one 1064 thing to say I want to sleep for 3 minutes. It is a completely different 1065 thing to say I want to sleep until 3 minutes past the time I started 1066 that timer (unless you just happened to start that timer now). Both meanings 1067 (and options for sleeping) have great practical value in common use cases 1068 for sleeping, waiting on a condition variable, and waiting for a mutex's 1069 lock. These same concepts and tools are found (for example) in Ada. 1070 </p> 1071<p> 1072 A timer example: 1073 </p> 1074<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> 1075<span class="special">{</span> 1076 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">start</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 1077 <span class="identifier">g</span><span class="special">();</span> 1078 <span class="identifier">h</span><span class="special">();</span> 1079 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">sec</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 1080 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"f() took "</span> <span class="special"><<</span> <span class="identifier">sec</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" seconds\n"</span><span class="special">;</span> 1081<span class="special">}</span> 1082</pre> 1083<p> 1084 Note that if one is using the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> between two clock 1085 <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s in a way where the 1086 precision of the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> matters, it is good 1087 practice to convert the clock's <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> to a known <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>. This insulates the 1088 code from future changes which may be made to the clock's precision in 1089 the future. For example <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a> could easily be 1090 based on the clock speed of the cpu. When you upgrade to a faster machine, 1091 you do not want your code that assumed a certain tick period of this 1092 clock to start experiencing run-time failures because your timing code 1093 has silently changed meaning. 1094 </p> 1095<p> 1096 A delay loop example: 1097 </p> 1098<pre class="programlisting"><span class="comment">// delay for at least 500 nanoseconds:</span> 1099<span class="keyword">auto</span> <span class="identifier">go</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">500</span><span class="special">);</span> 1100<span class="keyword">while</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">go</span><span class="special">)</span> 1101 <span class="special">;</span> 1102</pre> 1103<p> 1104 The above code will delay as close as possible to half a microsecond, 1105 no matter what the precision of <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a> is. The more precise 1106 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a> becomes, the more 1107 accurate will be the delay to 500 nanoseconds. 1108 </p> 1109</div> 1110</div> 1111<div class="section"> 1112<div class="titlepage"><div><div><h4 class="title"> 1113<a name="chrono.users_guide.tutorial.specific_clocks"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.specific_clocks" title="Specific Clocks">Specific 1114 Clocks</a> 1115</h4></div></div></div> 1116<div class="toc"><dl class="toc"> 1117<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.system_clock">system_clock</a></span></dt> 1118<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.steady_clock">steady_clock</a></span></dt> 1119<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.high_resolution_clock">high_resolution_clock</a></span></dt> 1120<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.process_cpu_clock">process_cpu_clock</a></span></dt> 1121<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.thread_clock">thread_clock</a></span></dt> 1122</dl></div> 1123<div class="section"> 1124<div class="titlepage"><div><div><h5 class="title"> 1125<a name="chrono.users_guide.tutorial.specific_clocks.system_clock"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.system_clock" title="system_clock">system_clock</a> 1126</h5></div></div></div> 1127<p> 1128 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a> is useful when 1129 you need to correlate the time with a known epoch so you can convert 1130 it to a calendar time. Note the specific functions in the <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a> class. 1131 </p> 1132</div> 1133<div class="section"> 1134<div class="titlepage"><div><div><h5 class="title"> 1135<a name="chrono.users_guide.tutorial.specific_clocks.steady_clock"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.steady_clock" title="steady_clock">steady_clock</a> 1136</h5></div></div></div> 1137<p> 1138 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a> is useful when 1139 you need to wait for a specific amount of time. <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a> time can not be 1140 reset. As other steady clocks, it is usually based on the processor tick. 1141 </p> 1142<p> 1143 Here is a polling solution, but it will probably be too inefficient: 1144 </p> 1145<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">start</span><span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 1146<span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">delay</span><span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">5</span><span class="special">);</span> 1147<span class="keyword">while</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">start</span> <span class="special"><=</span> <span class="identifier">delay</span><span class="special">)</span> <span class="special">{}</span> 1148</pre> 1149</div> 1150<div class="section"> 1151<div class="titlepage"><div><div><h5 class="title"> 1152<a name="chrono.users_guide.tutorial.specific_clocks.high_resolution_clock"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.high_resolution_clock" title="high_resolution_clock">high_resolution_clock</a> 1153</h5></div></div></div> 1154<p> 1155 When available, <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock" title="Class high_resolution_clock"><code class="computeroutput"><span class="identifier">high_resolution_clock</span></code></a> is usually 1156 more expensive than the other system-wide clocks, so they are used only 1157 when the provided resolution is required to the application. 1158 </p> 1159</div> 1160<div class="section"> 1161<div class="titlepage"><div><div><h5 class="title"> 1162<a name="chrono.users_guide.tutorial.specific_clocks.process_cpu_clock"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.process_cpu_clock" title="process_cpu_clock">process_cpu_clock</a> 1163</h5></div></div></div> 1164<p> 1165 Process and thread clocks are used usually to measure the time spent 1166 by code blocks, as a basic time-spent profiling of different blocks of 1167 code (Boost.Chrono.Stopwatch is a clear example of this use). 1168 </p> 1169</div> 1170<div class="section"> 1171<div class="titlepage"><div><div><h5 class="title"> 1172<a name="chrono.users_guide.tutorial.specific_clocks.thread_clock"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.specific_clocks.thread_clock" title="thread_clock">thread_clock</a> 1173</h5></div></div></div> 1174<p> 1175 You can use <a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a> whenever you want 1176 to measure the time spent by the current thread. For example: 1177 </p> 1178<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">start</span><span class="special">=</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 1179<span class="comment">// ... do something ...</span> 1180 1181<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a> <span class="identifier">ms</span><span class="special">;</span> 1182<span class="identifier">ms</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 1183<span class="comment">// d now holds the number of milliseconds from start to end.</span> 1184<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ms</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"ms\n"</span><span class="special">;</span> 1185</pre> 1186<p> 1187 If you need seconds with a floating-point representation you can do: 1188 </p> 1189<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">sec</span><span class="special">;</span> <span class="comment">// seconds, stored with a double.</span> 1190<span class="identifier">sec</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">end</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 1191<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">sec</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"s\n"</span><span class="special">;</span> 1192</pre> 1193<p> 1194 If you would like to programmatically inspect <code class="computeroutput"><a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">duration</span></code>, you can get the representation 1195 type with <code class="computeroutput"><a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">rep</span></code>, and the tick period with <code class="computeroutput"><a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">period</span></code> (which should be a type <code class="computeroutput"><span class="identifier">ratio</span></code> which has nested values <code class="computeroutput"><code class="computeroutput"><span class="identifier">ratio</span></code><span class="special">::</span><span class="identifier">num</span></code> and <code class="computeroutput"><code class="computeroutput"><span class="identifier">ratio</span></code><span class="special">::</span><span class="identifier">den</span></code>). 1196 The tick period of <a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a> is <code class="computeroutput"><a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">period</span><span class="special">::</span><span class="identifier">num</span> <span class="special">/</span> <a class="link" href="reference.html#chrono.reference.other_clocks.thread_clock_hpp.thread_clock" title="Class thread_clock"><code class="computeroutput"><span class="identifier">thread_clock</span></code></a><span class="special">::</span><span class="identifier">period</span><span class="special">::</span><span class="identifier">den</span></code> seconds: <code class="computeroutput"><span class="number">1</span><span class="special">/</span><span class="number">1000000000</span></code> 1197 in this case (<code class="computeroutput"><span class="number">1</span></code> billionth 1198 of a second), stored in a <code class="computeroutput"><span class="keyword">long</span> 1199 <span class="keyword">long</span></code>. 1200 </p> 1201</div> 1202</div> 1203<div class="section"> 1204<div class="titlepage"><div><div><h4 class="title"> 1205<a name="chrono.users_guide.tutorial.i_o"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.i_o" title="I/O">I/O</a> 1206</h4></div></div></div> 1207<div class="toc"><dl class="toc"> 1208<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.i_o.duration_io">duration</a></span></dt> 1209<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.i_o.system_clock_time_point_io"><code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code></a></span></dt> 1210<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.i_o.other_clocks_time_point_io">Other 1211 clocks time_point</a></span></dt> 1212<dt><span class="section"><a href="users_guide.html#chrono.users_guide.tutorial.i_o.low_level_i_o">Low 1213 level I/O</a></span></dt> 1214</dl></div> 1215<div class="section"> 1216<div class="titlepage"><div><div><h5 class="title"> 1217<a name="chrono.users_guide.tutorial.i_o.duration_io"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.i_o.duration_io" title="duration">duration</a> 1218</h5></div></div></div> 1219<p> 1220 Any <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> can be streamed out 1221 to a <code class="computeroutput"><span class="identifier">basic_ostream</span></code>. The 1222 run-time value of the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> is formatted according 1223 to the rules and current format settings for <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><code class="computeroutput"><span class="special">::</span><span class="identifier">rep</span></code> get_duration_style and the durationpunct 1224 facet. 1225 </p> 1226<p> 1227 the format is either 1228 </p> 1229<pre class="programlisting"><span class="special"><</span><span class="identifier">value</span><span class="special">></span> <span class="special"><</span><span class="identifier">unit</span><span class="special">></span> 1230</pre> 1231<p> 1232 or 1233 </p> 1234<pre class="programlisting"><span class="special"><</span><span class="identifier">unit</span><span class="special">></span> <span class="special"><</span><span class="identifier">value</span><span class="special">></span> 1235</pre> 1236<div class="warning"><table border="0" summary="Warning"> 1237<tr> 1238<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 1239<th align="left">Warning</th> 1240</tr> 1241<tr><td align="left" valign="top"> 1242<p> 1243 Need to be changed This is followed by a single space and then the 1244 compile-time unit name of the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>. This unit name is 1245 built on the string returned from <code class="computeroutput"><span class="identifier">ratio_string</span><span class="special"><></span></code> and the data used to construct 1246 the <a class="link" href="reference.html#chrono.reference.io_v1.chrono_io_hpp.duration_punct" title="Template Class duration_punct<>"><code class="computeroutput"><span class="identifier">duration_punct</span></code></a> which was inserted 1247 into the stream's locale. If a <a class="link" href="reference.html#chrono.reference.io_v1.chrono_io_hpp.duration_punct" title="Template Class duration_punct<>"><code class="computeroutput"><span class="identifier">duration_punct</span></code></a> has not been 1248 inserted into the stream's locale, a default constructed <a class="link" href="reference.html#chrono.reference.io_v1.chrono_io_hpp.duration_punct" title="Template Class duration_punct<>"><code class="computeroutput"><span class="identifier">duration_punct</span></code></a> will be added 1249 to the stream's locale. 1250 </p> 1251<p> 1252 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> unit names come in 1253 two varieties: long(prefix) and short(symbol). The default constructed 1254 <a class="link" href="reference.html#chrono.reference.io_v1.chrono_io_hpp.duration_punct" title="Template Class duration_punct<>"><code class="computeroutput"><span class="identifier">duration_punct</span></code></a> provides names 1255 in the long(prefix) format. These names are English descriptions. Other 1256 languages are supported by constructing a <a class="link" href="reference.html#chrono.reference.io_v1.chrono_io_hpp.duration_punct" title="Template Class duration_punct<>"><code class="computeroutput"><span class="identifier">duration_punct</span></code></a> with the proper 1257 spellings for "hours", "minutes" and "seconds", 1258 and their abbreviations (for the short format). The short or long format 1259 can be easily chosen by streaming a <code class="computeroutput"><span class="identifier">duration_short</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">duration_long</span><span class="special">()</span></code> manipulator respectively or using 1260 the parameterized manipulator <code class="computeroutput"><span class="identifier">duration_fmt</span><span class="special">(</span><span class="identifier">duration_style</span><span class="special">::</span><span class="identifier">prefix</span><span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">duration_fmt</span><span class="special">(</span><span class="identifier">duration_style</span><span class="special">::</span><span class="identifier">symbol</span><span class="special">)</span></code>. 1261 </p> 1262</td></tr> 1263</table></div> 1264<p> 1265 <span class="bold"><strong>Example:</strong></span> 1266 </p> 1267<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 1268<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">chrono_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1269 1270<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 1271<span class="special">{</span> 1272 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 1273 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span> 1274 1275 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"milliseconds(1) = "</span> 1276 <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1277 1278 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"milliseconds(3) + microseconds(10) = "</span> 1279 <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">microseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1280 1281 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"hours(3) + minutes(10) = "</span> 1282 <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">hours</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">minutes</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1283 1284 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">1</span><span class="special">,</span> <span class="number">2500000000</span><span class="special">></span> <span class="special">></span> <span class="identifier">ClockTick</span><span class="special">;</span> 1285 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ClockTick(3) + boost::chrono::nanoseconds(10) = "</span> 1286 <span class="special"><<</span> <span class="identifier">ClockTick</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1287 1288 <span class="comment">// ...</span> 1289 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 1290<span class="special">}</span> 1291</pre> 1292<p> 1293 The output could be 1294 </p> 1295<pre class="programlisting"><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">=</span> <span class="number">1</span> <span class="identifier">microsecond</span> 1296<span class="identifier">milliseconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">microseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">3010</span> <span class="identifier">microseconds</span> 1297<span class="identifier">hours</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">minutes</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">190</span> <span class="identifier">minutes</span> 1298<span class="identifier">ClockTick</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">56</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">5000000000</span><span class="special">]</span><span class="identifier">seconds</span> 1299 1300<span class="identifier">Set</span> <span class="identifier">cout</span> <span class="identifier">to</span> <span class="identifier">use</span> <span class="keyword">short</span> <span class="identifier">names</span><span class="special">:</span> 1301<span class="identifier">milliseconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">microseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">3010</span> μs 1302<span class="identifier">hours</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">minutes</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">190</span> <span class="identifier">m</span> 1303<span class="identifier">ClockTick</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">56</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">5000000000</span><span class="special">]</span><span class="identifier">s</span> 1304 1305<span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">129387415616250000</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">10000000</span><span class="special">]</span><span class="identifier">s</span> <span class="identifier">since</span> <span class="identifier">Jan</span> <span class="number">1</span><span class="special">,</span> <span class="number">1970</span> 1306<span class="identifier">monotonic_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">37297387636417</span> <span class="identifier">ns</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1307 1308<span class="identifier">Set</span> <span class="identifier">cout</span> <span class="identifier">to</span> <span class="identifier">use</span> <span class="keyword">long</span> <span class="identifier">names</span><span class="special">:</span> 1309<span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">37297387655134</span> <span class="identifier">nanoseconds</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1310</pre> 1311<p> 1312 As can be seen, each duration type can be streamed without having to 1313 manually stream the compile-time units after the run-time value. And 1314 when the compile-time unit is known to be a "common unit", 1315 English names are used. For "uncommon units" a unit name is 1316 composed from the reduced numerator and denominator of the associated 1317 <code class="computeroutput"><span class="identifier">ratio</span></code>. Whatever stream/locale 1318 settings are set for <code class="computeroutput"><span class="identifier">duration</span><span class="special">::</span><span class="identifier">rep</span></code> 1319 are used for the value. Additionally, when the value is 1, singular forms 1320 for the units are used. 1321 </p> 1322<p> 1323 Sometimes it is desired to shorten these names by using the SI symbols 1324 instead of SI prefixes. This can be accomplished with the use of the 1325 <a class="link" href="reference.html#chrono.reference.io.duration_io_hpp.manipulators.symbol_format" title="Non Member Function symbol_format(ios_base&)"><code class="computeroutput"><span class="identifier">symbol_format</span></code></a> manipulator <a href="#ftn.chrono.users_guide.tutorial.i_o.duration_io.f0" class="footnote" name="chrono.users_guide.tutorial.i_o.duration_io.f0"><sup class="footnote">[1]</sup></a>: 1326 </p> 1327<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nSet cout to use short names:\n"</span><span class="special">;</span> 1328<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">symbol_format</span><span class="special">;</span> 1329 1330<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"milliseconds(3) + microseconds(10) = "</span> 1331 <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">microseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1332 1333<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"hours(3) + minutes(10) = "</span> 1334 <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">hours</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">minutes</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1335 1336<span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"ClockTick(3) + nanoseconds(10) = "</span> 1337 <span class="special"><<</span> <span class="identifier">ClockTick</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1338</pre> 1339<p> 1340 The output could be 1341 </p> 1342<pre class="programlisting"><span class="identifier">Set</span> <span class="identifier">cout</span> <span class="identifier">to</span> <span class="identifier">use</span> <span class="keyword">short</span> <span class="identifier">names</span><span class="special">:</span> 1343<span class="identifier">milliseconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">microseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">3010</span> μs 1344<span class="identifier">hours</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">minutes</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">190</span> <span class="identifier">m</span> 1345<span class="identifier">ClockTick</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">10</span><span class="special">)</span> <span class="special">=</span> <span class="number">56</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">5000000000</span><span class="special">]</span><span class="identifier">s</span> 1346 1347<span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">129387415616250000</span> <span class="special">[</span><span class="number">1</span><span class="special">/</span><span class="number">10000000</span><span class="special">]</span><span class="identifier">s</span> <span class="identifier">since</span> <span class="identifier">Jan</span> <span class="number">1</span><span class="special">,</span> <span class="number">1970</span> 1348<span class="identifier">monotonic_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">37297387636417</span> <span class="identifier">ns</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1349 1350<span class="identifier">Set</span> <span class="identifier">cout</span> <span class="identifier">to</span> <span class="identifier">use</span> <span class="keyword">long</span> <span class="identifier">names</span><span class="special">:</span> 1351<span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">37297387655134</span> <span class="identifier">nanoseconds</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1352</pre> 1353<p> 1354 The μ for microsecond is specified to be U+00B5, encoded as UTF-8, UTF-16 1355 or UTF-32 as appropriate for the stream's character size. 1356 </p> 1357<p> 1358 When the format decision is taken at runtime, it could be better to use 1359 the parameterized manipulator <a class="link" href="reference.html#chrono.reference.io.duration_io_hpp.manipulators.duration_fmt" title="Template Class duration_fmt"><code class="computeroutput"><span class="identifier">duration_fmt</span></code></a> as in 1360 </p> 1361<pre class="programlisting"><span class="identifier">duration_style</span> <span class="identifier">style</span><span class="special">;</span> 1362<span class="comment">//...</span> 1363<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">duration_fmt</span><span class="special">(</span><span class="identifier">style</span><span class="special">);</span> 1364</pre> 1365<p> 1366 Parsing a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> follows rules analogous 1367 to the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> converting constructor. 1368 A value and a unit (SI symbol or prefixed) are read from the <code class="computeroutput"><span class="identifier">basic_istream</span></code>. If the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> has an integral representation, 1369 then the value parsed must be exactly representable in the target <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> (after conversion to 1370 the target <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> units), else <code class="computeroutput"><span class="identifier">failbit</span></code> is set. <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s based on floating-point 1371 representations can be parsed using any units that do not cause overflow. 1372 </p> 1373<p> 1374 For example a stream containing "5000 milliseconds" can be 1375 parsed into seconds, but if the stream contains "3001 ms", 1376 parsing into <code class="computeroutput"><span class="identifier">seconds</span></code> 1377 will cause <code class="computeroutput"><span class="identifier">failbit</span></code> to 1378 be set. 1379 </p> 1380<p> 1381 <span class="bold"><strong>Example:</strong></span> 1382 </p> 1383<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">chrono_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1384<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> 1385<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 1386 1387<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 1388<span class="special">{</span> 1389 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 1390 1391 <span class="identifier">istringstream</span> <span class="identifier">in</span><span class="special">(</span><span class="string">"5000 milliseconds 4000 ms 3001 ms"</span><span class="special">);</span> 1392 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">d</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 1393 <span class="identifier">in</span> <span class="special">>></span> <span class="identifier">d</span><span class="special">;</span> 1394 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">good</span><span class="special">());</span> 1395 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">d</span> <span class="special">==</span> <span class="identifier">seconds</span><span class="special">(</span><span class="number">5</span><span class="special">));</span> 1396 <span class="identifier">in</span> <span class="special">>></span> <span class="identifier">d</span><span class="special">;</span> 1397 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">good</span><span class="special">());</span> 1398 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">d</span> <span class="special">==</span> <span class="identifier">seconds</span><span class="special">(</span><span class="number">4</span><span class="special">));</span> 1399 <span class="identifier">in</span> <span class="special">>></span> <span class="identifier">d</span><span class="special">;</span> 1400 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">in</span><span class="special">.</span><span class="identifier">fail</span><span class="special">());</span> 1401 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">d</span> <span class="special">==</span> <span class="identifier">seconds</span><span class="special">(</span><span class="number">4</span><span class="special">));</span> 1402 1403 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 1404<span class="special">}</span> 1405</pre> 1406<p> 1407 Note that a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> failure may occur late 1408 in the parsing process. This means that the characters making up the 1409 failed parse in the stream are usually consumed despite the failure to 1410 successfully parse. 1411 </p> 1412<p> 1413 Sometimes in templated code it is difficult to know what the unit of 1414 your duration is. It is all deterministic, and inspect-able. But it can 1415 be inconvenient to do so, especially if you just need to print out a 1416 "debugging" statement. For example: 1417 </p> 1418<pre class="programlisting"><span class="comment">// round to nearest, to even on tie</span> 1419<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">To</span></code></a><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 1420<span class="identifier">To</span> 1421<span class="identifier">round</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">)</span> 1422<span class="special">{</span> 1423 <span class="identifier">To</span> <span class="identifier">t0</span> <span class="special">=</span> <span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">To</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 1424 <span class="identifier">To</span> <span class="identifier">t1</span> <span class="special">=</span> <span class="identifier">t0</span><span class="special">;</span> 1425 <span class="special">++</span><span class="identifier">t1</span><span class="special">;</span> 1426 <span class="keyword">auto</span> <span class="identifier">diff0</span> <span class="special">=</span> <span class="identifier">d</span> <span class="special">-</span> <span class="identifier">t0</span><span class="special">;</span> 1427 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"diff0 = "</span> <span class="special"><<</span> <span class="identifier">diff0</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1428 <span class="keyword">auto</span> <span class="identifier">diff1</span> <span class="special">=</span> <span class="identifier">t1</span> <span class="special">-</span> <span class="identifier">d</span><span class="special">;</span> 1429 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"diff1 = "</span> <span class="special"><<</span> <span class="identifier">diff1</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1430 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">diff0</span> <span class="special">==</span> <span class="identifier">diff1</span><span class="special">)</span> 1431 <span class="special">{</span> 1432 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t0</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&</span> <span class="number">1</span><span class="special">)</span> 1433 <span class="keyword">return</span> <span class="identifier">t1</span><span class="special">;</span> 1434 <span class="keyword">return</span> <span class="identifier">t0</span><span class="special">;</span> 1435 <span class="special">}</span> 1436 <span class="keyword">else</span> <span class="keyword">if</span> <span class="special">(</span><span class="identifier">diff0</span> <span class="special"><</span> <span class="identifier">diff1</span><span class="special">)</span> 1437 <span class="keyword">return</span> <span class="identifier">t0</span><span class="special">;</span> 1438 <span class="keyword">return</span> <span class="identifier">t1</span><span class="special">;</span> 1439<span class="special">}</span> 1440</pre> 1441<p> 1442 This is where I/O for duration really shines. The compiler knows what 1443 the type of diff0 is and with this proposal that type (with proper units) 1444 will automatically be printed out for you. For example: 1445 </p> 1446<pre class="programlisting"><span class="identifier">milliseconds</span> <span class="identifier">ms</span> <span class="special">=</span> <span class="identifier">round</span><span class="special"><</span><span class="identifier">milliseconds</span><span class="special">>(</span><span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">123</span><span class="special">));</span> <span class="comment">// diff0 = 123 nanoseconds</span> 1447 <span class="comment">// diff1 = 999877 nanoseconds</span> 1448<span class="identifier">milliseconds</span> <span class="identifier">ms</span> <span class="special">=</span> <span class="identifier">round</span><span class="special"><</span><span class="identifier">milliseconds</span><span class="special">>(</span><span class="identifier">Ticks</span><span class="special">(</span><span class="number">44</span><span class="special">));</span> <span class="comment">// diff0 = 2 [1/3000]seconds</span> 1449 <span class="comment">// diff1 = 1 [1/3000]second</span> 1450</pre> 1451<p> 1452 This simple I/O will make duration so much more accessible to programmers. 1453 </p> 1454</div> 1455<div class="section"> 1456<div class="titlepage"><div><div><h5 class="title"> 1457<a name="chrono.users_guide.tutorial.i_o.system_clock_time_point_io"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.i_o.system_clock_time_point_io" title="system_clock::time_point"><code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code></a> 1458</h5></div></div></div> 1459<p> 1460 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a> is special. It 1461 is the only clock that has conversions between its <code class="computeroutput"><span class="identifier">time_point</span></code> 1462 and <code class="computeroutput"><span class="identifier">time_t</span></code>. C subsequently 1463 relates time_t to the <a href="http://en.wikipedia.org/wiki/Gregorian_calendar" target="_top">Gregorian 1464 calendar</a> via <code class="computeroutput"><span class="identifier">ctime</span></code>, 1465 <code class="computeroutput"><span class="identifier">gmtime</span></code>, <code class="computeroutput"><span class="identifier">localtime</span></code>, and <code class="computeroutput"><span class="identifier">strftime</span></code>. 1466 Neither C, nor POSIX relate <code class="computeroutput"><span class="identifier">time_t</span></code> 1467 to any calendar other than the <a href="http://en.wikipedia.org/wiki/Gregorian_calendar" target="_top">Gregorian 1468 calendar</a>. ISO 8601 is specified only in terms of the <a href="http://en.wikipedia.org/wiki/Gregorian_calendar" target="_top">Gregorian 1469 calendar</a>. 1470 </p> 1471<p> 1472 <span class="bold"><strong>Boost.Chrono</strong></span> provides <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> I/O in terms of the Gregorian 1473 calendar, and no other calendar. However as <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> 1474 remains convertible with <code class="computeroutput"><span class="identifier">time_t</span></code>, 1475 it is possible for clients to create other calendars which interoperate 1476 with <code class="computeroutput"><span class="identifier">time_t</span></code> and subsequently 1477 <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code>. 1478 </p> 1479<p> 1480 Furthermore, it is existing practice for all major hosted operating systems 1481 to store system time in a format which facilitates display as <a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time" target="_top">Coordinated 1482 Universal Time</a> (UTC). Therefore <span class="bold"><strong>Boost.Chrono</strong></span> 1483 provides that the default output for <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> 1484 be in a format that represents a point in time with respect to UTC. 1485 </p> 1486<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1487</pre> 1488<p> 1489 could output 1490 </p> 1491<pre class="programlisting"><span class="number">2011</span><span class="special">-</span><span class="number">09</span><span class="special">-</span><span class="number">15</span> <span class="number">18</span><span class="special">:</span><span class="number">36</span><span class="special">:</span><span class="number">59.325132</span> <span class="special">+</span><span class="number">0000</span> 1492</pre> 1493<p> 1494 This format is strongly influenced by ISO 8601, but places a ' ' between 1495 the date and time instead of a 'T'. The former appears to more accurately 1496 represent existing practice. A fully numeric format was chosen so as 1497 to be understandable to as large a group of human readers as possible. 1498 A 24 hour format was chosen for the same reasons. 1499 </p> 1500<p> 1501 Of the referenced standards, only ISO 8601 discusses the output of fractional 1502 seconds. Neither C nor POSIX have built-in functionality for this. However 1503 it appears to be universal (as of this writing) that <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">period</span></code> 1504 is sub-second. And it seems desirable that if you stream out a <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code>, you ought to be able to 1505 stream it back in and get the same value. Therefore the streaming of 1506 fractional seconds (at least by default) appears to be unavoidable. 1507 </p> 1508<p> 1509 Finally the trailing " +0000" disambiguates the UTC-formatted 1510 <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> from one formatted with 1511 respect to the local time zone of the computer. The latter can easily 1512 be achieved with: 1513 </p> 1514<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">time_fmt</span><span class="special">(</span><span class="identifier">local</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1515</pre> 1516<p> 1517 that could result in 1518 </p> 1519<pre class="programlisting"><span class="number">2011</span><span class="special">-</span><span class="number">09</span><span class="special">-</span><span class="number">15</span> <span class="number">14</span><span class="special">:</span><span class="number">36</span><span class="special">:</span><span class="number">59.325132</span> <span class="special">-</span><span class="number">0400</span> 1520</pre> 1521<p> 1522 Note that <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> 1523 itself is neither UTC, nor the local time. However in practice, <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> is a count of ticks beyond 1524 some epoch which is synchronized with UTC. So as a mobile computer moves 1525 across time zones, the time zone traversal does not impact the value 1526 of a <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> produced by <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code>. 1527 And it is only in formatting it for human consumption that one can choose 1528 UTC or the local time zone. C and POSIX treat <code class="computeroutput"><span class="identifier">time_t</span></code> 1529 just as <span class="bold"><strong>Boost.Chrono</strong></span> treats <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code>: 1530 </p> 1531<pre class="programlisting"><span class="identifier">tm</span><span class="special">*</span> <span class="identifier">gmtime</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_t</span><span class="special">*</span> <span class="identifier">timer</span><span class="special">)</span> <span class="special">-></span> <span class="identifier">UTC</span> 1532<span class="identifier">tm</span><span class="special">*</span> <span class="identifier">localtime</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">time_t</span><span class="special">*</span> <span class="identifier">timer</span><span class="special">)</span> <span class="special">-></span> <span class="identifier">local</span> <span class="identifier">time</span> 1533</pre> 1534<p> 1535 This proposal simply extends the C/POSIX <code class="computeroutput"><span class="identifier">time_t</span></code> 1536 functionality to C++ syntax and <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code>. 1537 </p> 1538<p> 1539 The <code class="computeroutput"><span class="identifier">time_fmt</span><span class="special">()</span></code> 1540 manipulator is "sticky". It will remain in effect until the 1541 stream destructs or until it is changed. The stream can be reset to its 1542 default state with: 1543 </p> 1544<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">time_fmt</span><span class="special">(</span><span class="identifier">utc</span><span class="special">);</span> 1545</pre> 1546<p> 1547 And the formatting can be further customized by using the time format 1548 sequences. For example: 1549 </p> 1550<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">time_fmt</span><span class="special">(</span><span class="identifier">local</span><span class="special">,</span> <span class="string">"%A %B %e, %Y %r"</span><span class="special">);</span> 1551<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// Sunday April 24, 2011 02:36:59 PM</span> 1552</pre> 1553<p> 1554 When specifying formatting manipulators for wide streams, use wide strings. 1555 </p> 1556<p> 1557 You can use the same manipulators with istreams to specify parsing sequences. 1558 </p> 1559<p> 1560 Unfortunately there are no formatting/parsing sequences which indicate 1561 fractional seconds. <span class="bold"><strong>Boost.Chrono</strong></span> does 1562 not provide such sequences. In the meantime, one can format and parse 1563 fractional seconds for <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> 1564 by defaulting the format, or by using an empty string in <code class="computeroutput"><span class="identifier">time_fmt</span><span class="special">()</span></code>. 1565 </p> 1566<p> 1567 The stream's current locale may impact the parsing/format sequences supplied 1568 to the <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code> manipulators (e.g. names 1569 of days of the week, and names of months). 1570 </p> 1571</div> 1572<div class="section"> 1573<div class="titlepage"><div><div><h5 class="title"> 1574<a name="chrono.users_guide.tutorial.i_o.other_clocks_time_point_io"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.i_o.other_clocks_time_point_io" title="Other clocks time_point">Other 1575 clocks time_point</a> 1576</h5></div></div></div> 1577<p> 1578 Unlike <code class="computeroutput"><span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">time_point</span></code>, the other clocks have no 1579 conversion with <code class="computeroutput"><span class="identifier">time_t</span></code>. 1580 There is likely no relationship between steady_clock::time_point and 1581 UTC at all (UTC is not steady). 1582 </p> 1583<p> 1584 In general a <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> is formatted by outputting 1585 its internal <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> followed by a string 1586 that describes the <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><code class="computeroutput"><span class="special">::</span><span class="identifier">clock</span></code> epoch. This string will vary 1587 for each distinct clock, and for each implementation of the supplied 1588 clocks. 1589 </p> 1590<pre class="programlisting"><span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_CHRONO_HAS_CLOCK_STEADY</span> 1591 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"steady_clock::now() = "</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1592<span class="preprocessor">#endif</span> 1593 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nSet cout to use long names:\n"</span> 1594 <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_long</span> 1595 <span class="special"><<</span> <span class="string">"high_resolution_clock::now() = "</span> 1596 <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1597</pre> 1598<p> 1599 The output could be 1600 </p> 1601<pre class="programlisting"><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">37297387636417</span> <span class="identifier">ns</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1602 1603<span class="identifier">Set</span> <span class="identifier">cout</span> <span class="identifier">to</span> <span class="identifier">use</span> <span class="keyword">long</span> <span class="identifier">names</span><span class="special">:</span> 1604<span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">=</span> <span class="number">37297387655134</span> <span class="identifier">nanoseconds</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1605</pre> 1606<p> 1607 Parsing a <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> involves first parsing 1608 a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> and then parsing the 1609 epoch string. If the epoch string does not match that associated with 1610 <code class="computeroutput"><span class="identifier">time_point</span><span class="special">::</span><span class="identifier">clock</span></code> then failbit will be set. 1611 </p> 1612<p> 1613 <span class="bold"><strong>Example:</strong></span> 1614 </p> 1615<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">chrono_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1616<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> 1617<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 1618<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 1619 1620<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 1621<span class="special">{</span> 1622 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 1623 1624 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">t0</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 1625 <span class="identifier">stringstream</span> <span class="identifier">io</span><span class="special">;</span> 1626 <span class="identifier">io</span> <span class="special"><<</span> <span class="identifier">t0</span><span class="special">;</span> 1627 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">t1</span><span class="special">;</span> 1628 <span class="identifier">io</span> <span class="special">>></span> <span class="identifier">t1</span><span class="special">;</span> 1629 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">io</span><span class="special">.</span><span class="identifier">fail</span><span class="special">());</span> 1630 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">io</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1631 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">t0</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1632 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">t1</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1633 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">high_resolution_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 1634 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">t</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1635 1636 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"That took "</span> <span class="special"><<</span> <span class="identifier">t</span> <span class="special">-</span> <span class="identifier">t0</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1637 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"That took "</span> <span class="special"><<</span> <span class="identifier">t</span> <span class="special">-</span> <span class="identifier">t1</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1638 1639 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 1640<span class="special">}</span> 1641</pre> 1642<p> 1643 The output could be: 1644 </p> 1645<pre class="programlisting"><span class="number">50908679121461</span> <span class="identifier">nanoseconds</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1646<span class="identifier">That</span> <span class="identifier">took</span> <span class="number">649630</span> <span class="identifier">nanoseconds</span> 1647</pre> 1648<p> 1649 Here's a simple example to find out how many hours the computer has been 1650 up (on this platform): 1651 </p> 1652<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">chrono_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1653<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 1654 1655<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 1656<span class="special">{</span> 1657 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 1658 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span> 1659 1660 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">3600</span><span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="identifier">T</span><span class="special">;</span> 1661 <span class="identifier">T</span> <span class="identifier">tp</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 1662 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">tp</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1663 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 1664<span class="special">}</span> 1665</pre> 1666<p> 1667 The output could be: 1668 </p> 1669<pre class="programlisting"><span class="number">17.8666</span> <span class="identifier">hours</span> <span class="identifier">since</span> <span class="identifier">boot</span> 1670</pre> 1671</div> 1672<div class="section"> 1673<div class="titlepage"><div><div><h5 class="title"> 1674<a name="chrono.users_guide.tutorial.i_o.low_level_i_o"></a><a class="link" href="users_guide.html#chrono.users_guide.tutorial.i_o.low_level_i_o" title="Low level I/O">Low 1675 level I/O</a> 1676</h5></div></div></div> 1677<p> 1678 The I/O interface described in the preceding I/O sections were at the 1679 user level. These services are based on low level services that are useful 1680 when writing libraries. The low level services are related to access 1681 to the associated ios state and locale facets. The design follows the 1682 C++ IOStreams standard design: 1683 </p> 1684<p> 1685 The library encapsulate the locale-dependent parsing and formatting of 1686 <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> into a new facet class. 1687 Let's focus on formatting in this example. The concerned facet class 1688 is <a class="link" href="reference.html#chrono.reference.io.duration_put_hpp.duration_put" title="Template Class duration_put"><code class="computeroutput"><span class="identifier">duration_put</span></code></a>, analogous to time_put, 1689 money_put, etc. 1690 </p> 1691<p> 1692 The use of this facet is similar to the time_put facet. 1693 </p> 1694</div> 1695</div> 1696</div> 1697<div class="section"> 1698<div class="titlepage"><div><div><h3 class="title"> 1699<a name="chrono.users_guide.examples"></a><a class="link" href="users_guide.html#chrono.users_guide.examples" title="Examples">Examples</a> 1700</h3></div></div></div> 1701<div class="toc"><dl class="toc"> 1702<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.duration">Duration</a></span></dt> 1703<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.clocks">Clocks</a></span></dt> 1704<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.time_point">Time Point</a></span></dt> 1705<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.io">IO</a></span></dt> 1706</dl></div> 1707<div class="section"> 1708<div class="titlepage"><div><div><h4 class="title"> 1709<a name="chrono.users_guide.examples.duration"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.duration" title="Duration">Duration</a> 1710</h4></div></div></div> 1711<div class="toc"><dl class="toc"> 1712<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.duration.how_you_override_the_duration_s_default_constructor">How 1713 you Override the Duration's Default Constructor</a></span></dt> 1714<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.duration.saturating">Saturating</a></span></dt> 1715<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.duration.xtime_conversions">xtime 1716 Conversions</a></span></dt> 1717</dl></div> 1718<div class="section"> 1719<div class="titlepage"><div><div><h5 class="title"> 1720<a name="chrono.users_guide.examples.duration.how_you_override_the_duration_s_default_constructor"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.duration.how_you_override_the_duration_s_default_constructor" title="How you Override the Duration's Default Constructor">How 1721 you Override the Duration's Default Constructor</a> 1722</h5></div></div></div> 1723<p> 1724 Next we show how to override the <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>'s default constructor 1725 to do anything you want (in this case set it to zero). All we need to 1726 do is to change the representation 1727 </p> 1728<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">I_dont_like_the_default_duration_behavior</span> <span class="special">{</span> 1729 1730<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">></span> 1731<span class="keyword">class</span> <span class="identifier">zero_default</span> 1732<span class="special">{</span> 1733<span class="keyword">public</span><span class="special">:</span> 1734 <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">rep</span><span class="special">;</span> 1735 1736<span class="keyword">private</span><span class="special">:</span> 1737 <span class="identifier">rep</span> <span class="identifier">rep_</span><span class="special">;</span> 1738<span class="keyword">public</span><span class="special">:</span> 1739 <span class="identifier">zero_default</span><span class="special">(</span><span class="identifier">rep</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">rep_</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{}</span> 1740 <span class="keyword">operator</span> <span class="identifier">rep</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">rep_</span><span class="special">;}</span> 1741 1742 <span class="identifier">zero_default</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span><span class="identifier">rep_</span> <span class="special">+=</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">rep_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> 1743 <span class="identifier">zero_default</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">-=(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span><span class="identifier">rep_</span> <span class="special">-=</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">rep_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> 1744 <span class="identifier">zero_default</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*=(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span><span class="identifier">rep_</span> <span class="special">*=</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">rep_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> 1745 <span class="identifier">zero_default</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">/=(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span><span class="identifier">rep_</span> <span class="special">/=</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">rep_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> 1746 1747 <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">+</span> <span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span><span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> 1748 <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">-</span> <span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">zero_default</span><span class="special">(-</span><span class="identifier">rep_</span><span class="special">);}</span> 1749 <span class="identifier">zero_default</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="special">{++</span><span class="identifier">rep_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> 1750 <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">++(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">zero_default</span><span class="special">(</span><span class="identifier">rep_</span><span class="special">++);}</span> 1751 <span class="identifier">zero_default</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">--()</span> <span class="special">{--</span><span class="identifier">rep_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;}</span> 1752 <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">--(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">zero_default</span><span class="special">(</span><span class="identifier">rep_</span><span class="special">--);}</span> 1753 1754 <span class="keyword">friend</span> <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+=</span> <span class="identifier">y</span><span class="special">;}</span> 1755 <span class="keyword">friend</span> <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span> <span class="special">-=</span> <span class="identifier">y</span><span class="special">;}</span> 1756 <span class="keyword">friend</span> <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">*(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span> <span class="special">*=</span> <span class="identifier">y</span><span class="special">;}</span> 1757 <span class="keyword">friend</span> <span class="identifier">zero_default</span> <span class="keyword">operator</span><span class="special">/(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span> <span class="special">/=</span> <span class="identifier">y</span><span class="special">;}</span> 1758 1759 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">rep_</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">rep_</span><span class="special">;}</span> 1760 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="special">!(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">);}</span> 1761 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><</span> <span class="special">(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">rep_</span> <span class="special"><</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">rep_</span><span class="special">;}</span> 1762 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="special">!(</span><span class="identifier">y</span> <span class="special"><</span> <span class="identifier">x</span><span class="special">);}</span> 1763 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">></span> <span class="special">(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">y</span> <span class="special"><</span> <span class="identifier">x</span><span class="special">;}</span> 1764 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="identifier">zero_default</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">zero_default</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="special">!(</span><span class="identifier">x</span> <span class="special"><</span> <span class="identifier">y</span><span class="special">);}</span> 1765<span class="special">};</span> 1766 1767<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">zero_default</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">>,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">nano</span> <span class="special">></span> <span class="identifier">nanoseconds</span><span class="special">;</span> 1768<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">zero_default</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">>,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">micro</span> <span class="special">></span> <span class="identifier">microseconds</span><span class="special">;</span> 1769<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">zero_default</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">>,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">milli</span> <span class="special">></span> <span class="identifier">milliseconds</span><span class="special">;</span> 1770<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">zero_default</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">></span> <span class="special">></span> <span class="identifier">seconds</span><span class="special">;</span> 1771<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">zero_default</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">>,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">60</span><span class="special">></span> <span class="special">></span> <span class="identifier">minutes</span><span class="special">;</span> 1772<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">zero_default</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">>,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">3600</span><span class="special">></span> <span class="special">></span> <span class="identifier">hours</span><span class="special">;</span> 1773<span class="special">}</span> 1774</pre> 1775<p> 1776 Usage 1777 </p> 1778<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">I_dont_like_the_default_duration_behavior</span><span class="special">;</span> 1779 1780<span class="identifier">milliseconds</span> <span class="identifier">ms</span><span class="special">;</span> 1781<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ms</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 1782</pre> 1783<p> 1784 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/i_dont_like_the_default_duration_behavior.cpp" target="_top">example/i_dont_like_the_default_duration_behavior.cpp</a></em></span> 1785 </p> 1786</div> 1787<div class="section"> 1788<div class="titlepage"><div><div><h5 class="title"> 1789<a name="chrono.users_guide.examples.duration.saturating"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.duration.saturating" title="Saturating">Saturating</a> 1790</h5></div></div></div> 1791<p> 1792 A "saturating" signed integral type is developed. This type 1793 has +/- infinity and a NaN (like IEEE floating-point) but otherwise obeys 1794 signed integral arithmetic. This class is subsequently used as the template 1795 parameter Rep in boost::chrono::<a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> to demonstrate a duration 1796 class that does not silently ignore overflow. 1797 </p> 1798<p> 1799 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/saturating.cpp" target="_top">example/saturating.cpp</a></em></span> 1800 </p> 1801</div> 1802<div class="section"> 1803<div class="titlepage"><div><div><h5 class="title"> 1804<a name="chrono.users_guide.examples.duration.xtime_conversions"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.duration.xtime_conversions" title="xtime Conversions">xtime 1805 Conversions</a> 1806</h5></div></div></div> 1807<p> 1808 Example round_up utility: converts d to To, rounding up for inexact conversions 1809 Being able to <span class="bold"><strong>easily</strong></span> write this function 1810 is a major feature! 1811 </p> 1812<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1813<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1814 1815<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 1816 1817<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">To</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 1818<span class="identifier">To</span> 1819<span class="identifier">round_up</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> 1820<span class="special">{</span> 1821 <span class="identifier">To</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">To</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 1822 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span> <span class="special"><</span> <span class="identifier">d</span><span class="special">)</span> 1823 <span class="special">++</span><span class="identifier">result</span><span class="special">;</span> 1824 <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span> 1825<span class="special">}</span> 1826</pre> 1827<p> 1828 To demonstrate interaction with an xtime-like facility: 1829 </p> 1830<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">xtime</span> 1831<span class="special">{</span> 1832 <span class="keyword">long</span> <span class="identifier">sec</span><span class="special">;</span> 1833 <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">usec</span><span class="special">;</span> 1834<span class="special">};</span> 1835 1836<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 1837<span class="identifier">xtime</span> 1838<span class="identifier">to_xtime_truncate</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> 1839<span class="special">{</span> 1840 <span class="identifier">xtime</span> <span class="identifier">xt</span><span class="special">;</span> 1841 <span class="identifier">xt</span><span class="special">.</span><span class="identifier">sec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">seconds</span></code></a><span class="special">>(</span><span class="identifier">d</span><span class="special">).</span><span class="identifier">count</span><span class="special">());</span> 1842 <span class="identifier">xt</span><span class="special">.</span><span class="identifier">usec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">>(</span><span class="identifier">d</span> <span class="special">-</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">seconds</span></code></a><span class="special">(</span><span class="identifier">xt</span><span class="special">.</span><span class="identifier">sec</span><span class="special">)).</span><span class="identifier">count</span><span class="special">());</span> 1843 <span class="keyword">return</span> <span class="identifier">xt</span><span class="special">;</span> 1844<span class="special">}</span> 1845 1846<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 1847<span class="identifier">xtime</span> 1848<span class="identifier">to_xtime_round_up</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> 1849<span class="special">{</span> 1850 <span class="identifier">xtime</span> <span class="identifier">xt</span><span class="special">;</span> 1851 <span class="identifier">xt</span><span class="special">.</span><span class="identifier">sec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span><span class="special">>(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">seconds</span></code></a><span class="special">>(</span><span class="identifier">d</span><span class="special">).</span><span class="identifier">count</span><span class="special">());</span> 1852 <span class="identifier">xt</span><span class="special">.</span><span class="identifier">usec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">>(</span><span class="identifier">round_up</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">>(</span><span class="identifier">d</span> <span class="special">-</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">seconds</span></code></a><span class="special">(</span><span class="identifier">xt</span><span class="special">.</span><span class="identifier">sec</span><span class="special">)).</span><span class="identifier">count</span><span class="special">());</span> 1853 <span class="keyword">return</span> <span class="identifier">xt</span><span class="special">;</span> 1854<span class="special">}</span> 1855 1856<span class="identifier">microseconds</span> 1857<span class="identifier">from_xtime</span><span class="special">(</span><span class="identifier">xtime</span> <span class="identifier">xt</span><span class="special">)</span> 1858<span class="special">{</span> 1859 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">seconds</span></code></a><span class="special">(</span><span class="identifier">xt</span><span class="special">.</span><span class="identifier">sec</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">(</span><span class="identifier">xt</span><span class="special">.</span><span class="identifier">usec</span><span class="special">);</span> 1860<span class="special">}</span> 1861 1862<span class="keyword">void</span> <span class="identifier">print</span><span class="special">(</span><span class="identifier">xtime</span> <span class="identifier">xt</span><span class="special">)</span> 1863<span class="special">{</span> 1864 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="char">'{'</span> <span class="special"><<</span> <span class="identifier">xt</span><span class="special">.</span><span class="identifier">sec</span> <span class="special"><<</span> <span class="char">','</span> <span class="special"><<</span> <span class="identifier">xt</span><span class="special">.</span><span class="identifier">usec</span> <span class="special"><<</span> <span class="string">"}\n"</span><span class="special">;</span> 1865<span class="special">}</span> 1866</pre> 1867<p> 1868 Usage 1869 </p> 1870<pre class="programlisting"><span class="identifier">xtime</span> <span class="identifier">xt</span> <span class="special">=</span> <span class="identifier">to_xtime_truncate</span><span class="special">(</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a><span class="special">(</span><span class="number">251</span><span class="special">));</span> 1871<span class="identifier">print</span><span class="special">(</span><span class="identifier">xt</span><span class="special">);</span> 1872<span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span> <span class="identifier">ms</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a><span class="special">>(</span><span class="identifier">from_xtime</span><span class="special">(</span><span class="identifier">xt</span><span class="special">));</span> 1873<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ms</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" milliseconds\n"</span><span class="special">;</span> 1874<span class="identifier">xt</span> <span class="special">=</span> <span class="identifier">to_xtime_round_up</span><span class="special">(</span><span class="identifier">ms</span><span class="special">);</span> 1875<span class="identifier">print</span><span class="special">(</span><span class="identifier">xt</span><span class="special">);</span> 1876<span class="identifier">xt</span> <span class="special">=</span> <span class="identifier">to_xtime_truncate</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a><span class="special">(</span><span class="number">999</span><span class="special">));</span> 1877<span class="identifier">print</span><span class="special">(</span><span class="identifier">xt</span><span class="special">);</span> 1878<span class="identifier">xt</span> <span class="special">=</span> <span class="identifier">to_xtime_round_up</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> <span class="special">+</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a><span class="special">(</span><span class="number">999</span><span class="special">));</span> 1879<span class="identifier">print</span><span class="special">(</span><span class="identifier">xt</span><span class="special">);</span> 1880</pre> 1881<p> 1882 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/xtime.cpp" target="_top">xtime.cpp</a></em></span> 1883 </p> 1884</div> 1885</div> 1886<div class="section"> 1887<div class="titlepage"><div><div><h4 class="title"> 1888<a name="chrono.users_guide.examples.clocks"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.clocks" title="Clocks">Clocks</a> 1889</h4></div></div></div> 1890<div class="toc"><dl class="toc"> 1891<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.clocks.cycle_count">Cycle 1892 count</a></span></dt> 1893<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.clocks.xtime_clock">xtime_clock</a></span></dt> 1894</dl></div> 1895<div class="section"> 1896<div class="titlepage"><div><div><h5 class="title"> 1897<a name="chrono.users_guide.examples.clocks.cycle_count"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.clocks.cycle_count" title="Cycle count">Cycle 1898 count</a> 1899</h5></div></div></div> 1900<p> 1901 Users can easily create their own clocks, with both points in time and 1902 time durations which have a representation and precision of their own 1903 choosing. For example if there is a hardware counter which simply increments 1904 a count with each cycle of the cpu, one can very easily build clocks, 1905 time points and durations on top of that, using only a few tens of lines 1906 of code. Such systems can be used to call the time-sensitive threading 1907 API's such as sleep, wait on a condition variable, or wait for a mutex 1908 lock. The API proposed herein is not sensitive as to whether this is 1909 a 300MHz clock (with a 3 1/3 nanosecond tick period) or a 3GHz clock 1910 (with a tick period of 1/3 of a nanosecond). And the resulting code will 1911 be just as efficient as if the user wrote a special purpose clock cycle 1912 counter. 1913 </p> 1914<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1915<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 1916<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 1917 1918<span class="keyword">template</span> <span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">speed</span><span class="special">></span> 1919<span class="keyword">struct</span> <span class="identifier">cycle_count</span> 1920<span class="special">{</span> 1921 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">__ratio_multiply__</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><code class="computeroutput"><span class="identifier">ratio</span></code><span class="special"><</span><span class="identifier">speed</span><span class="special">>,</span> <span class="identifier">boost</span><span class="special">::</span><code class="computeroutput"><span class="identifier">mega</span></code><span class="special">>::</span><span class="identifier">type</span> 1922 <span class="identifier">frequency</span><span class="special">;</span> <span class="comment">// Mhz</span> 1923 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">__ratio_divide__</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><code class="computeroutput"><span class="identifier">ratio</span></code><span class="special"><</span><span class="number">1</span><span class="special">>,</span> <span class="identifier">frequency</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">period</span><span class="special">;</span> 1924 <span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">rep</span><span class="special">;</span> 1925 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">rep</span><span class="special">,</span> <span class="identifier">period</span><span class="special">></span> <span class="identifier">duration</span><span class="special">;</span> 1926 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><span class="identifier">cycle_count</span><span class="special">></span> <span class="identifier">time_point</span><span class="special">;</span> 1927 1928 <span class="keyword">static</span> <span class="identifier">time_point</span> <span class="identifier">now</span><span class="special">()</span> 1929 <span class="special">{</span> 1930 <span class="keyword">static</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">tick</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 1931 <span class="comment">// return exact cycle count</span> 1932 <span class="keyword">return</span> <span class="identifier">time_point</span><span class="special">(</span><span class="identifier">duration</span><span class="special">(++</span><span class="identifier">tick</span><span class="special">));</span> <span class="comment">// fake access to clock cycle count</span> 1933 <span class="special">}</span> 1934<span class="special">};</span> 1935 1936<span class="keyword">template</span> <span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">speed</span><span class="special">></span> 1937<span class="keyword">struct</span> <span class="identifier">approx_cycle_count</span> 1938<span class="special">{</span> 1939 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">frequency</span> <span class="special">=</span> <span class="identifier">speed</span> <span class="special">*</span> <span class="number">1000000</span><span class="special">;</span> <span class="comment">// MHz</span> 1940 <span class="keyword">typedef</span> <span class="identifier">nanoseconds</span> <span class="identifier">duration</span><span class="special">;</span> 1941 <span class="keyword">typedef</span> <span class="identifier">duration</span><span class="special">::</span><span class="identifier">rep</span> <span class="identifier">rep</span><span class="special">;</span> 1942 <span class="keyword">typedef</span> <span class="identifier">duration</span><span class="special">::</span><span class="identifier">period</span> <span class="identifier">period</span><span class="special">;</span> 1943 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">nanosec_per_sec</span> <span class="special">=</span> <span class="identifier">period</span><span class="special">::</span><span class="identifier">den</span><span class="special">;</span> 1944 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><span class="identifier">approx_cycle_count</span><span class="special">></span> <span class="identifier">time_point</span><span class="special">;</span> 1945 1946 <span class="keyword">static</span> <span class="identifier">time_point</span> <span class="identifier">now</span><span class="special">()</span> 1947 <span class="special">{</span> 1948 <span class="keyword">static</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">tick</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 1949 <span class="comment">// return cycle count as an approximate number of nanoseconds</span> 1950 <span class="comment">// compute as if nanoseconds is only duration in the std::lib</span> 1951 <span class="keyword">return</span> <span class="identifier">time_point</span><span class="special">(</span><span class="identifier">duration</span><span class="special">(++</span><span class="identifier">tick</span> <span class="special">*</span> <span class="identifier">nanosec_per_sec</span> <span class="special">/</span> <span class="identifier">frequency</span><span class="special">));</span> 1952 <span class="special">}</span> 1953<span class="special">};</span> 1954</pre> 1955<p> 1956 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/cycle_count.cpp" target="_top">cycle_count.cpp</a></em></span> 1957 </p> 1958</div> 1959<div class="section"> 1960<div class="titlepage"><div><div><h5 class="title"> 1961<a name="chrono.users_guide.examples.clocks.xtime_clock"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.clocks.xtime_clock" title="xtime_clock">xtime_clock</a> 1962</h5></div></div></div> 1963<p> 1964 This example demonstrates the use of a timeval-like struct to be used 1965 as the representation type for both <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> and <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>. 1966 </p> 1967<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">xtime</span> <span class="special">{</span> 1968<span class="keyword">private</span><span class="special">:</span> 1969 <span class="keyword">long</span> <span class="identifier">tv_sec</span><span class="special">;</span> 1970 <span class="keyword">long</span> <span class="identifier">tv_usec</span><span class="special">;</span> 1971 1972 <span class="keyword">void</span> <span class="identifier">fixup</span><span class="special">()</span> <span class="special">{</span> 1973 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">tv_usec</span> <span class="special"><</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span> 1974 <span class="identifier">tv_usec</span> <span class="special">+=</span> <span class="number">1000000</span><span class="special">;</span> 1975 <span class="special">--</span><span class="identifier">tv_sec</span><span class="special">;</span> 1976 <span class="special">}</span> 1977 <span class="special">}</span> 1978 1979<span class="keyword">public</span><span class="special">:</span> 1980 <span class="keyword">explicit</span> <span class="identifier">xtime</span><span class="special">(</span><span class="keyword">long</span> <span class="identifier">sec</span><span class="special">,</span> <span class="keyword">long</span> <span class="identifier">usec</span><span class="special">)</span> <span class="special">{</span> 1981 <span class="identifier">tv_sec</span> <span class="special">=</span> <span class="identifier">sec</span><span class="special">;</span> 1982 <span class="identifier">tv_usec</span> <span class="special">=</span> <span class="identifier">usec</span><span class="special">;</span> 1983 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">tv_usec</span> <span class="special"><</span> <span class="number">0</span> <span class="special">||</span> <span class="identifier">tv_usec</span> <span class="special">>=</span> <span class="number">1000000</span><span class="special">)</span> <span class="special">{</span> 1984 <span class="identifier">tv_sec</span> <span class="special">+=</span> <span class="identifier">tv_usec</span> <span class="special">/</span> <span class="number">1000000</span><span class="special">;</span> 1985 <span class="identifier">tv_usec</span> <span class="special">%=</span> <span class="number">1000000</span><span class="special">;</span> 1986 <span class="identifier">fixup</span><span class="special">();</span> 1987 <span class="special">}</span> 1988 <span class="special">}</span> 1989 1990 <span class="keyword">explicit</span> <span class="identifier">xtime</span><span class="special">(</span><span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">usec</span><span class="special">)</span> <span class="special">{</span> 1991 <span class="identifier">tv_usec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span><span class="special">>(</span><span class="identifier">usec</span> <span class="special">%</span> <span class="number">1000000</span><span class="special">);</span> 1992 <span class="identifier">tv_sec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span><span class="special">>(</span><span class="identifier">usec</span> <span class="special">/</span> <span class="number">1000000</span><span class="special">);</span> 1993 <span class="identifier">fixup</span><span class="special">();</span> 1994 <span class="special">}</span> 1995 1996 <span class="comment">// explicit</span> 1997 <span class="keyword">operator</span> <span class="keyword">long</span> <span class="keyword">long</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span><span class="keyword">return</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">>(</span><span class="identifier">tv_sec</span><span class="special">)</span> <span class="special">*</span> <span class="number">1000000</span> <span class="special">+</span> <span class="identifier">tv_usec</span><span class="special">;}</span> 1998 1999 <span class="identifier">xtime</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">+=</span> <span class="special">(</span><span class="identifier">xtime</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">{</span> 2000 <span class="identifier">tv_sec</span> <span class="special">+=</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">tv_sec</span><span class="special">;</span> 2001 <span class="identifier">tv_usec</span> <span class="special">+=</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">tv_usec</span><span class="special">;</span> 2002 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">tv_usec</span> <span class="special">>=</span> <span class="number">1000000</span><span class="special">)</span> <span class="special">{</span> 2003 <span class="identifier">tv_usec</span> <span class="special">-=</span> <span class="number">1000000</span><span class="special">;</span> 2004 <span class="special">++</span><span class="identifier">tv_sec</span><span class="special">;</span> 2005 <span class="special">}</span> 2006 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 2007 <span class="special">}</span> 2008 2009 <span class="identifier">xtime</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">-=</span> <span class="special">(</span><span class="identifier">xtime</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">{</span> 2010 <span class="identifier">tv_sec</span> <span class="special">-=</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">tv_sec</span><span class="special">;</span> 2011 <span class="identifier">tv_usec</span> <span class="special">-=</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">tv_usec</span><span class="special">;</span> 2012 <span class="identifier">fixup</span><span class="special">();</span> 2013 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 2014 <span class="special">}</span> 2015 2016 <span class="identifier">xtime</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">%=</span> <span class="special">(</span><span class="identifier">xtime</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">{</span> 2017 <span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">tv_sec</span> <span class="special">*</span> <span class="number">1000000</span> <span class="special">+</span> <span class="identifier">tv_usec</span><span class="special">;</span> 2018 <span class="keyword">long</span> <span class="keyword">long</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">tv_sec</span> <span class="special">*</span> <span class="number">1000000</span> <span class="special">+</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">tv_usec</span><span class="special">;</span> 2019 <span class="identifier">t</span> <span class="special">%=</span> <span class="identifier">r</span><span class="special">;</span> 2020 <span class="identifier">tv_sec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span><span class="special">>(</span><span class="identifier">t</span> <span class="special">/</span> <span class="number">1000000</span><span class="special">);</span> 2021 <span class="identifier">tv_usec</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">long</span><span class="special">>(</span><span class="identifier">t</span> <span class="special">%</span> <span class="number">1000000</span><span class="special">);</span> 2022 <span class="identifier">fixup</span><span class="special">();</span> 2023 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 2024 <span class="special">}</span> 2025 2026 <span class="keyword">friend</span> <span class="identifier">xtime</span> <span class="keyword">operator</span><span class="special">+(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+=</span> <span class="identifier">y</span><span class="special">;}</span> 2027 <span class="keyword">friend</span> <span class="identifier">xtime</span> <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span> <span class="special">-=</span> <span class="identifier">y</span><span class="special">;}</span> 2028 <span class="keyword">friend</span> <span class="identifier">xtime</span> <span class="keyword">operator</span><span class="special">%(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span> <span class="special">%=</span> <span class="identifier">y</span><span class="special">;}</span> 2029 2030 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> 2031 <span class="special">{</span> <span class="keyword">return</span> <span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">tv_sec</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">tv_sec</span> <span class="special">&&</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">tv_usec</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">tv_usec</span><span class="special">);</span> <span class="special">}</span> 2032 2033 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span> 2034 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">tv_sec</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">tv_sec</span><span class="special">)</span> 2035 <span class="keyword">return</span> <span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">tv_usec</span> <span class="special"><</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">tv_usec</span><span class="special">);</span> 2036 <span class="keyword">return</span> <span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">tv_sec</span> <span class="special"><</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">tv_sec</span><span class="special">);</span> 2037 <span class="special">}</span> 2038 2039 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">!(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">);</span> <span class="special">}</span> 2040 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">></span> <span class="special">(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">y</span> <span class="special"><</span> <span class="identifier">x</span><span class="special">;</span> <span class="special">}</span> 2041 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">!(</span><span class="identifier">y</span> <span class="special"><</span> <span class="identifier">x</span><span class="special">);</span> <span class="special">}</span> 2042 <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">!(</span><span class="identifier">x</span> <span class="special"><</span> <span class="identifier">y</span><span class="special">);</span> <span class="special">}</span> 2043 2044 <span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span><span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">xtime</span> <span class="identifier">x</span><span class="special">)</span> 2045 <span class="special">{</span><span class="keyword">return</span> <span class="identifier">os</span> <span class="special"><<</span> <span class="char">'{'</span> <span class="special"><<</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">tv_sec</span> <span class="special"><<</span> <span class="char">','</span> <span class="special"><<</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">tv_usec</span> <span class="special"><<</span> <span class="char">'}'</span><span class="special">;}</span> 2046<span class="special">};</span> 2047</pre> 2048<p> 2049 Clock based on timeval-like struct. 2050 </p> 2051<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">xtime_clock</span> 2052<span class="special">{</span> 2053<span class="keyword">public</span><span class="special">:</span> 2054 <span class="keyword">typedef</span> <span class="identifier">xtime</span> <span class="identifier">rep</span><span class="special">;</span> 2055 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">micro</span> <span class="identifier">period</span><span class="special">;</span> 2056 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">rep</span><span class="special">,</span> <span class="identifier">period</span><span class="special">></span> <span class="identifier">duration</span><span class="special">;</span> 2057 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">xtime_clock</span><span class="special">></span> <span class="identifier">time_point</span><span class="special">;</span> 2058 2059 <span class="keyword">static</span> <span class="identifier">time_point</span> <span class="identifier">now</span><span class="special">()</span> 2060 <span class="special">{</span> 2061 <span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_CHRONO_WINDOWS_API</span><span class="special">)</span> 2062 <span class="identifier">time_point</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">duration</span><span class="special">(</span><span class="identifier">xtime</span><span class="special">(</span><span class="number">0</span><span class="special">)));</span> 2063 <span class="identifier">gettimeofday</span><span class="special">((</span><span class="identifier">timeval</span><span class="special">*)&</span><span class="identifier">t</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span> 2064 <span class="keyword">return</span> <span class="identifier">t</span><span class="special">;</span> 2065 2066 <span class="preprocessor">#elif</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_CHRONO_MAC_API</span><span class="special">)</span> 2067 2068 <span class="identifier">time_point</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">duration</span><span class="special">(</span><span class="identifier">xtime</span><span class="special">(</span><span class="number">0</span><span class="special">)));</span> 2069 <span class="identifier">gettimeofday</span><span class="special">((</span><span class="identifier">timeval</span><span class="special">*)&</span><span class="identifier">t</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span> 2070 <span class="keyword">return</span> <span class="identifier">t</span><span class="special">;</span> 2071 2072 <span class="preprocessor">#elif</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_CHRONO_POSIX_API</span><span class="special">)</span> 2073 <span class="comment">//time_point t(0,0);</span> 2074 2075 <span class="identifier">timespec</span> <span class="identifier">ts</span><span class="special">;</span> 2076 <span class="special">::</span><span class="identifier">clock_gettime</span><span class="special">(</span> <span class="identifier">CLOCK_REALTIME</span><span class="special">,</span> <span class="special">&</span><span class="identifier">ts</span> <span class="special">);</span> 2077 2078 <span class="identifier">xtime</span> <span class="identifier">xt</span><span class="special">(</span> <span class="identifier">ts</span><span class="special">.</span><span class="identifier">tv_sec</span><span class="special">,</span> <span class="identifier">ts</span><span class="special">.</span><span class="identifier">tv_nsec</span><span class="special">/</span><span class="number">1000</span><span class="special">);</span> 2079 <span class="keyword">return</span> <span class="identifier">time_point</span><span class="special">(</span><span class="identifier">duration</span><span class="special">(</span><span class="identifier">xt</span><span class="special">));</span> 2080 2081 <span class="preprocessor">#endif</span> <span class="comment">// POSIX</span> 2082 <span class="special">}</span> 2083<span class="special">};</span> 2084</pre> 2085<p> 2086 Usage of xtime_clock 2087 </p> 2088<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"sizeof xtime_clock::time_point = "</span> <span class="special"><<</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2089<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"sizeof xtime_clock::duration = "</span> <span class="special"><<</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">duration</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2090<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"sizeof xtime_clock::rep = "</span> <span class="special"><<</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">rep</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2091<span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">delay</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">5</span><span class="special">));</span> 2092<span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">start</span> <span class="special">=</span> <span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2093<span class="keyword">while</span> <span class="special">(</span><span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">start</span> <span class="special"><=</span> <span class="identifier">delay</span><span class="special">)</span> <span class="special">{}</span> 2094<span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">stop</span> <span class="special">=</span> <span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2095<span class="identifier">xtime_clock</span><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">elapsed</span> <span class="special">=</span> <span class="identifier">stop</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 2096<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"paused "</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::::</span><span class="identifier">nanoseconds</span><span class="special">(</span><span class="identifier">elapsed</span><span class="special">).</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" nanoseconds\n"</span><span class="special">;</span> 2097</pre> 2098<p> 2099 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/timeval_demo.cpp" target="_top">example/timeval_demo.cpp</a></em></span> 2100 </p> 2101</div> 2102</div> 2103<div class="section"> 2104<div class="titlepage"><div><div><h4 class="title"> 2105<a name="chrono.users_guide.examples.time_point"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.time_point" title="Time Point">Time Point</a> 2106</h4></div></div></div> 2107<div class="toc"><dl class="toc"> 2108<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.time_point.min_utility">min 2109 Utility</a></span></dt> 2110<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.time_point.a_tiny_program_that_times_how_long_until_a_key_is_struck">A 2111 Tiny Program that Times How Long Until a Key is Struck</a></span></dt> 2112<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.time_point.24_hours_display">24 2113 Hours Display</a></span></dt> 2114<dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.time_point.simulated_thread_interface_demonstration_program">Simulated 2115 Thread Interface Demonstration Program</a></span></dt> 2116</dl></div> 2117<div class="section"> 2118<div class="titlepage"><div><div><h5 class="title"> 2119<a name="chrono.users_guide.examples.time_point.min_utility"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.time_point.min_utility" title="min Utility">min 2120 Utility</a> 2121</h5></div></div></div> 2122<p> 2123 The user can define a function returning the earliest <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a> as follows: 2124 </p> 2125<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration1</span></code></a><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration2</span></code></a><span class="special">></span> 2126<span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><code class="computeroutput"><span class="identifier">common_type</span></code><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration1</span></code></a><span class="special">>,</span> 2127 <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration2</span></code></a><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> 2128<span class="identifier">min</span><span class="special">(</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration1</span></code></a><span class="special">></span> <span class="identifier">t1</span><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration2</span></code></a><span class="special">></span> <span class="identifier">t2</span><span class="special">)</span> 2129<span class="special">{</span> 2130 <span class="keyword">return</span> <span class="identifier">t2</span> <span class="special"><</span> <span class="identifier">t1</span> <span class="special">?</span> <span class="identifier">t2</span> <span class="special">:</span> <span class="identifier">t1</span><span class="special">;</span> 2131<span class="special">}</span> 2132</pre> 2133<p> 2134 Being able to <span class="bold"><strong>easily</strong></span> write this function 2135 is a major feature! 2136 </p> 2137<pre class="programlisting"><span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">t1</span><span class="special">,</span> <span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">seconds</span><span class="special">(</span><span class="number">3</span><span class="special">));</span> 2138<span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">t2</span><span class="special">,</span> <span class="identifier">system_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">nanoseconds</span><span class="special">(</span><span class="number">3</span><span class="special">));</span> 2139<span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">t3</span><span class="special">,</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">t1</span><span class="special">,</span> <span class="identifier">t2</span><span class="special">));</span> 2140</pre> 2141<p> 2142 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/min_time_point.cpp" target="_top">example/min_time_point.cpp</a></em></span> 2143 </p> 2144</div> 2145<div class="section"> 2146<div class="titlepage"><div><div><h5 class="title"> 2147<a name="chrono.users_guide.examples.time_point.a_tiny_program_that_times_how_long_until_a_key_is_struck"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.time_point.a_tiny_program_that_times_how_long_until_a_key_is_struck" title="A Tiny Program that Times How Long Until a Key is Struck">A 2148 Tiny Program that Times How Long Until a Key is Struck</a> 2149</h5></div></div></div> 2150<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2151<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 2152<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span> 2153 2154<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">;</span> 2155 2156<span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a> <span class="special">></span> 2157<span class="keyword">class</span> <span class="identifier">timer</span> 2158<span class="special">{</span> 2159 <span class="keyword">typename</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">start</span><span class="special">;</span> 2160<span class="keyword">public</span><span class="special">:</span> 2161 <span class="identifier">timer</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">start</span><span class="special">(</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">)</span> <span class="special">{}</span> 2162 <span class="keyword">typename</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">duration</span> <span class="identifier">elapsed</span><span class="special">()</span> <span class="keyword">const</span> 2163 <span class="special">{</span> 2164 <span class="keyword">return</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">start</span><span class="special">;</span> 2165 <span class="special">}</span> 2166 <span class="keyword">double</span> <span class="identifier">seconds</span><span class="special">()</span> <span class="keyword">const</span> 2167 <span class="special">{</span> 2168 <span class="keyword">return</span> <span class="identifier">elapsed</span><span class="special">().</span><span class="identifier">count</span><span class="special">()</span> <span class="special">*</span> <span class="special">((</span><span class="keyword">double</span><span class="special">)</span><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">period</span><span class="special">::</span><span class="identifier">num</span><span class="special">/</span><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">period</span><span class="special">::</span><span class="identifier">den</span><span class="special">);</span> 2169 <span class="special">}</span> 2170<span class="special">};</span> 2171 2172<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 2173<span class="special">{</span> 2174 <span class="identifier">timer</span><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">></span> <span class="identifier">t1</span><span class="special">;</span> 2175 <span class="identifier">timer</span><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">></span> <span class="identifier">t2</span><span class="special">;</span> 2176 <span class="identifier">timer</span><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock" title="Class high_resolution_clock"><code class="computeroutput"><span class="identifier">high_resolution_clock</span></code></a><span class="special">></span> <span class="identifier">t3</span><span class="special">;</span> 2177 2178 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Type the Enter key: "</span><span class="special">;</span> 2179 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span> 2180 2181 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">fixed</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setprecision</span><span class="special">(</span><span class="number">9</span><span class="special">);</span> 2182 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"system_clock-----------: "</span> 2183 <span class="special"><<</span> <span class="identifier">t1</span><span class="special">.</span><span class="identifier">seconds</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" seconds\n"</span><span class="special">;</span> 2184 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"steady_clock--------: "</span> 2185 <span class="special"><<</span> <span class="identifier">t2</span><span class="special">.</span><span class="identifier">seconds</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" seconds\n"</span><span class="special">;</span> 2186 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"high_resolution_clock--: "</span> 2187 <span class="special"><<</span> <span class="identifier">t3</span><span class="special">.</span><span class="identifier">seconds</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" seconds\n"</span><span class="special">;</span> 2188 2189 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">d4</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2190 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">d5</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2191 2192 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nsystem_clock latency-----------: "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">d5</span> <span class="special">-</span> <span class="identifier">d4</span><span class="special">).</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 2193 2194 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">d6</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2195 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">d7</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.steady_clock" title="Class steady_clock"><code class="computeroutput"><span class="identifier">steady_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2196 2197 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"steady_clock latency--------: "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">d7</span> <span class="special">-</span> <span class="identifier">d6</span><span class="special">).</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 2198 2199 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock" title="Class high_resolution_clock"><code class="computeroutput"><span class="identifier">high_resolution_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">d8</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock" title="Class high_resolution_clock"><code class="computeroutput"><span class="identifier">high_resolution_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2200 <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock" title="Class high_resolution_clock"><code class="computeroutput"><span class="identifier">high_resolution_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">d9</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.high_resolution_clock" title="Class high_resolution_clock"><code class="computeroutput"><span class="identifier">high_resolution_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2201 2202 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"high_resolution_clock latency--: "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">d9</span> <span class="special">-</span> <span class="identifier">d8</span><span class="special">).</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 2203 2204 <span class="identifier">std</span><span class="special">::</span><span class="identifier">time_t</span> <span class="identifier">now</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">to_time_t</span><span class="special">(</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">());</span> 2205 2206 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"\nsystem_clock::now() reports UTC is "</span> 2207 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">asctime</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">gmtime</span><span class="special">(&</span><span class="identifier">now</span><span class="special">))</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span> 2208 2209 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 2210<span class="special">}</span> 2211</pre> 2212<p> 2213 The output of this program run looks like this: 2214 </p> 2215<p> 2216 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/await_keystroke.cpp" target="_top">example/await_keystroke.cpp</a></em></span> 2217 </p> 2218</div> 2219<div class="section"> 2220<div class="titlepage"><div><div><h5 class="title"> 2221<a name="chrono.users_guide.examples.time_point.24_hours_display"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.time_point.24_hours_display" title="24 Hours Display">24 2222 Hours Display</a> 2223</h5></div></div></div> 2224<p> 2225 In the example above we take advantage of the fact that <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s convert as long 2226 as they have the same clock, and as long as their internal <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s convert. We also take 2227 advantage of the fact that a <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a> with a floating-point 2228 representation will convert from anything. Finally the I/O system discovers 2229 the more readable "hours" unit for our <code class="computeroutput"><span class="identifier">duration</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">ratio</span><span class="special"><</span><span class="number">3600</span><span class="special">>></span></code>. 2230 </p> 2231<p> 2232 There are many other ways to format <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s and <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a>s. For example see 2233 <a href="http://en.wikipedia.org/wiki/ISO_8601#Durations" target="_top">ISO 8601</a>. 2234 Instead of coding every possibility into <code class="computeroutput"><span class="keyword">operator</span><span class="special"><<</span></code>, which would lead to significant 2235 code bloat for even the most trivial uses, this document seeks to inform 2236 the reader how to write custom I/O when desired. 2237 </p> 2238<p> 2239 As an example, the function below streams arbitrary <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a>s to arbitrary <code class="computeroutput"><span class="identifier">basic_ostreams</span></code> using the format: 2240 </p> 2241<pre class="programlisting"><span class="special">[-]</span><span class="identifier">d</span><span class="special">/</span><span class="identifier">hh</span><span class="special">:</span><span class="identifier">mm</span><span class="special">:</span><span class="identifier">ss</span><span class="special">.</span><span class="identifier">cc</span> 2242</pre> 2243<p> 2244 Where: 2245 </p> 2246<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 2247<li class="listitem"> 2248 <code class="computeroutput"><span class="identifier">d</span></code> is the number of 2249 <code class="computeroutput"><span class="identifier">days</span></code> 2250 </li> 2251<li class="listitem"> 2252 <code class="computeroutput"><span class="identifier">h</span></code> is the number of 2253 <code class="computeroutput"><span class="identifier">hours</span></code> 2254 </li> 2255<li class="listitem"> 2256 <code class="computeroutput"><span class="identifier">m</span></code> is the number of 2257 <code class="computeroutput"><span class="identifier">minutes</span></code> 2258 </li> 2259<li class="listitem"> 2260 <code class="computeroutput"><span class="identifier">ss</span><span class="special">.</span><span class="identifier">cc</span></code> is the number of <code class="computeroutput"><span class="identifier">seconds</span></code> rounded to the nearest 2261 hundredth of a second 2262 <div class="orderedlist"><ol class="orderedlist" type="1"> 2263<li class="listitem"> 2264 include <boost/chrono/chrono_io.hpp> 2265 </li> 2266<li class="listitem"> 2267 include <ostream> 2268 </li> 2269<li class="listitem"> 2270 include <iostream> 2271 </li> 2272</ol></div> 2273 </li> 2274</ul></div> 2275<pre class="programlisting"><span class="comment">// format duration as [-]d/hh::mm::ss.cc</span> 2276<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 2277<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">>&</span> 2278<span class="identifier">display</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">Traits</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> 2279 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">></span> <span class="identifier">d</span><span class="special">)</span> 2280<span class="special">{</span> 2281 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 2282 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span> 2283 2284 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ratio</span><span class="special"><</span><span class="number">86400</span><span class="special">></span> <span class="special">></span> <span class="identifier">days</span><span class="special">;</span> 2285 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">:</span><span class="identifier">centi</span><span class="special">></span> <span class="identifier">centiseconds</span><span class="special">;</span> 2286 2287 <span class="comment">// if negative, print negative sign and negate</span> 2288 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">d</span> <span class="special"><</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>(</span><span class="number">0</span><span class="special">))</span> 2289 <span class="special">{</span> 2290 <span class="identifier">d</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">d</span><span class="special">;</span> 2291 <span class="identifier">os</span> <span class="special"><<</span> <span class="char">'-'</span><span class="special">;</span> 2292 <span class="special">}</span> 2293 <span class="comment">// round d to nearest centiseconds, to even on tie</span> 2294 <span class="identifier">centiseconds</span> <span class="identifier">cs</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">centiseconds</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 2295 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">d</span> <span class="special">-</span> <span class="identifier">cs</span> <span class="special">></span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> 2296 <span class="special">||</span> <span class="special">(</span><span class="identifier">d</span> <span class="special">-</span> <span class="identifier">cs</span> <span class="special">==</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> <span class="special">&&</span> <span class="identifier">cs</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&</span> <span class="number">1</span><span class="special">))</span> 2297 <span class="special">++</span><span class="identifier">cs</span><span class="special">;</span> 2298 <span class="comment">// separate seconds from centiseconds</span> 2299 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">>(</span><span class="identifier">cs</span><span class="special">);</span> 2300 <span class="identifier">cs</span> <span class="special">-=</span> <span class="identifier">s</span><span class="special">;</span> 2301 <span class="comment">// separate minutes from seconds</span> 2302 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">minutes</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">minutes</span><span class="special">>(</span><span class="identifier">s</span><span class="special">);</span> 2303 <span class="identifier">s</span> <span class="special">-=</span> <span class="identifier">m</span><span class="special">;</span> 2304 <span class="comment">// separate hours from minutes</span> 2305 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">hours</span> <span class="identifier">h</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">hours</span><span class="special">>(</span><span class="identifier">m</span><span class="special">);</span> 2306 <span class="identifier">m</span> <span class="special">-=</span> <span class="identifier">h</span><span class="special">;</span> 2307 <span class="comment">// separate days from hours</span> 2308 <span class="identifier">days</span> <span class="identifier">dy</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration_cast</span><span class="special"><</span><span class="identifier">days</span><span class="special">>(</span><span class="identifier">h</span><span class="special">);</span> 2309 <span class="identifier">h</span> <span class="special">-=</span> <span class="identifier">dy</span><span class="special">;</span> 2310 <span class="comment">// print d/hh:mm:ss.cc</span> 2311 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">dy</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'/'</span><span class="special">;</span> 2312 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">h</span> <span class="special"><</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">hours</span><span class="special">(</span><span class="number">10</span><span class="special">))</span> 2313 <span class="identifier">os</span> <span class="special"><<</span> <span class="char">'0'</span><span class="special">;</span> 2314 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">h</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="char">':'</span><span class="special">;</span> 2315 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">m</span> <span class="special"><</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">minutes</span><span class="special">(</span><span class="number">10</span><span class="special">))</span> 2316 <span class="identifier">os</span> <span class="special"><<</span> <span class="char">'0'</span><span class="special">;</span> 2317 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">m</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="char">':'</span><span class="special">;</span> 2318 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">s</span> <span class="special"><</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">10</span><span class="special">))</span> 2319 <span class="identifier">os</span> <span class="special"><<</span> <span class="char">'0'</span><span class="special">;</span> 2320 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'.'</span><span class="special">;</span> 2321 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">cs</span> <span class="special"><</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">centiseconds</span><span class="special">(</span><span class="number">10</span><span class="special">))</span> 2322 <span class="identifier">os</span> <span class="special"><<</span> <span class="char">'0'</span><span class="special">;</span> 2323 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">cs</span><span class="special">.</span><span class="identifier">count</span><span class="special">();</span> 2324 <span class="keyword">return</span> <span class="identifier">os</span><span class="special">;</span> 2325<span class="special">}</span> 2326 2327<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 2328<span class="special">{</span> 2329 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 2330 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span> 2331 2332 <span class="identifier">display</span><span class="special">(</span><span class="identifier">cout</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">().</span><span class="identifier">time_since_epoch</span><span class="special">()</span> 2333 <span class="special">+</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mega</span><span class="special">>(</span><span class="number">1</span><span class="special">))</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2334 <span class="identifier">display</span><span class="special">(</span><span class="identifier">cout</span><span class="special">,</span> <span class="special">-</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">6</span><span class="special">))</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2335 <span class="identifier">display</span><span class="special">(</span><span class="identifier">cout</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mega</span><span class="special">>(</span><span class="number">1</span><span class="special">))</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2336 <span class="identifier">display</span><span class="special">(</span><span class="identifier">cout</span><span class="special">,</span> <span class="special">-</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="keyword">long</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mega</span><span class="special">>(</span><span class="number">1</span><span class="special">))</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2337<span class="special">}</span> 2338</pre> 2339<p> 2340 The output could be: 2341 </p> 2342<pre class="programlisting"><span class="number">12</span><span class="special">/</span><span class="number">06</span><span class="special">:</span><span class="number">03</span><span class="special">:</span><span class="number">22.95</span> 2343<span class="special">-</span><span class="number">0</span><span class="special">/</span><span class="number">00</span><span class="special">:</span><span class="number">00</span><span class="special">:</span><span class="number">00</span><span class="special">.</span><span class="number">01</span> 2344<span class="number">11</span><span class="special">/</span><span class="number">13</span><span class="special">:</span><span class="number">46</span><span class="special">:</span><span class="number">40.00</span> 2345<span class="special">-</span><span class="number">11</span><span class="special">/</span><span class="number">13</span><span class="special">:</span><span class="number">46</span><span class="special">:</span><span class="number">40.00</span> 2346</pre> 2347</div> 2348<div class="section"> 2349<div class="titlepage"><div><div><h5 class="title"> 2350<a name="chrono.users_guide.examples.time_point.simulated_thread_interface_demonstration_program"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.time_point.simulated_thread_interface_demonstration_program" title="Simulated Thread Interface Demonstration Program">Simulated 2351 Thread Interface Demonstration Program</a> 2352</h5></div></div></div> 2353<p> 2354 The C++11 standard library's multi-threading library requires the ability 2355 to deal with the representation of time in a manner consistent with modern 2356 C++ practices. Next is a simulation of this interface. 2357 </p> 2358<p> 2359 The non-member sleep functions can be emulated as follows: 2360 </p> 2361<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span> 2362 2363<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 2364<span class="keyword">void</span> <span class="identifier">sleep_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">)</span> <span class="special">{</span> 2365 <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 2366 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span> <span class="special"><</span> <span class="identifier">d</span><span class="special">)</span> 2367 <span class="special">++</span><span class="identifier">t</span><span class="special">;</span> 2368 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span> <span class="special">></span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">(</span><span class="number">0</span><span class="special">))</span> 2369 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"sleep_for "</span> <span class="special"><<</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" microseconds\n"</span><span class="special">;</span> 2370<span class="special">}</span> 2371 2372<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">></span> 2373<span class="keyword">void</span> <span class="identifier">sleep_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">>&</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{</span> 2374 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">chrono</span><span class="special">;</span> 2375 <span class="keyword">typedef</span> <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">></span> <span class="identifier">Time</span><span class="special">;</span> 2376 <span class="keyword">typedef</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">SysTime</span><span class="special">;</span> 2377 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span> <span class="special">></span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">())</span> <span class="special">{</span> 2378 <span class="keyword">typedef</span> <span class="keyword">typename</span> <code class="computeroutput"><span class="identifier">common_type</span></code><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Time</span><span class="special">::</span><span class="identifier">duration</span><span class="special">,</span> 2379 <span class="keyword">typename</span> <span class="identifier">SysTime</span><span class="special">::</span><span class="identifier">duration</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">D</span><span class="special">;</span> 2380 <span class="comment">/* auto */</span> <span class="identifier">D</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">t</span> <span class="special">-</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2381 <span class="identifier">microseconds</span> <span class="identifier">us</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 2382 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">us</span> <span class="special"><</span> <span class="identifier">d</span><span class="special">)</span> 2383 <span class="special">++</span><span class="identifier">us</span><span class="special">;</span> 2384 <span class="identifier">SysTime</span> <span class="identifier">st</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">us</span><span class="special">;</span> 2385 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"sleep_until "</span><span class="special">;</span> 2386 <span class="identifier">detail</span><span class="special">::</span><span class="identifier">print_time</span><span class="special">(</span><span class="identifier">st</span><span class="special">);</span> 2387 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" which is "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">st</span> <span class="special">-</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()).</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" microseconds away\n"</span><span class="special">;</span> 2388 <span class="special">}</span> 2389<span class="special">}</span> 2390 2391<span class="special">}}</span> 2392</pre> 2393<p> 2394 Next is the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_mutex</span></code> modified functions 2395 </p> 2396<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 2397<span class="keyword">struct</span> <span class="identifier">timed_mutex</span> <span class="special">{</span> 2398 <span class="comment">// ...</span> 2399 2400 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 2401 <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">)</span> <span class="special">{</span> 2402 <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 2403 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span> <span class="special"><=</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">(</span><span class="number">0</span><span class="special">))</span> 2404 <span class="keyword">return</span> <span class="identifier">try_lock</span><span class="special">();</span> 2405 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"try_lock_for "</span> <span class="special"><<</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" microseconds\n"</span><span class="special">;</span> 2406 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 2407 <span class="special">}</span> 2408 2409 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">></span> 2410 <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">>&</span> <span class="identifier">t</span><span class="special">)</span> 2411 <span class="special">{</span> 2412 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">chrono</span><span class="special">;</span> 2413 <span class="keyword">typedef</span> <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">></span> <span class="identifier">Time</span><span class="special">;</span> 2414 <span class="keyword">typedef</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">SysTime</span><span class="special">;</span> 2415 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span> <span class="special"><=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">())</span> 2416 <span class="keyword">return</span> <span class="identifier">try_lock</span><span class="special">();</span> 2417 <span class="keyword">typedef</span> <span class="keyword">typename</span> <code class="computeroutput"><span class="identifier">common_type</span></code><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Time</span><span class="special">::</span><span class="identifier">duration</span><span class="special">,</span> 2418 <span class="keyword">typename</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">duration</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">D</span><span class="special">;</span> 2419 <span class="comment">/* auto */</span> <span class="identifier">D</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">t</span> <span class="special">-</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2420 <span class="identifier">microseconds</span> <span class="identifier">us</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 2421 <span class="identifier">SysTime</span> <span class="identifier">st</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">us</span><span class="special">;</span> 2422 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"try_lock_until "</span><span class="special">;</span> 2423 <span class="identifier">detail</span><span class="special">::</span><span class="identifier">print_time</span><span class="special">(</span><span class="identifier">st</span><span class="special">);</span> 2424 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" which is "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">st</span> <span class="special">-</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()).</span><span class="identifier">count</span><span class="special">()</span> 2425 <span class="special"><<</span> <span class="string">" microseconds away\n"</span><span class="special">;</span> 2426 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 2427 <span class="special">}</span> 2428<span class="special">};</span> 2429<span class="special">}</span> 2430</pre> 2431<p> 2432 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">condition_variable</span></code> time related function 2433 are modified as follows: 2434 </p> 2435<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 2436<span class="keyword">struct</span> <span class="identifier">condition_variable</span> 2437<span class="special">{</span> 2438 <span class="comment">// ...</span> 2439 2440 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> 2441 <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">mutex</span><span class="special">&,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">d</span><span class="special">)</span> <span class="special">{</span> 2442 <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">microseconds</span> <span class="identifier">t</span> <span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">microseconds</span><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 2443 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"wait_for "</span> <span class="special"><<</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" microseconds\n"</span><span class="special">;</span> 2444 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 2445 <span class="special">}</span> 2446 2447 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">></span> 2448 <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">mutex</span><span class="special">&,</span> <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">>&</span> <span class="identifier">t</span><span class="special">)</span> <span class="special">{</span> 2449 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">;</span> 2450 <span class="keyword">typedef</span> <a class="link" href="reference.html#chrono.reference.cpp0x.time_point_hpp.time_point" title="Class template time_point<>"><code class="computeroutput"><span class="identifier">time_point</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">,</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">Duration</span></code></a><span class="special">></span> <span class="identifier">Time</span><span class="special">;</span> 2451 <span class="keyword">typedef</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">SysTime</span><span class="special">;</span> 2452 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span> <span class="special"><=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">())</span> 2453 <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span> 2454 <span class="keyword">typedef</span> <span class="keyword">typename</span> <code class="computeroutput"><span class="identifier">common_type</span></code><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Time</span><span class="special">::</span><span class="identifier">duration</span><span class="special">,</span> 2455 <span class="keyword">typename</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">duration</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">D</span><span class="special">;</span> 2456 <span class="comment">/* auto */</span> <span class="identifier">D</span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">t</span> <span class="special">-</span> <a class="link" href="reference.html#chrono.reference.cpp0x.clock" title="Clock Requirements"><code class="computeroutput"><span class="identifier">Clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">();</span> 2457 <span class="identifier">microseconds</span> <span class="identifier">us</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_cast" title="Non-Member Function duration_cast(duration)"><code class="computeroutput"><span class="identifier">duration_cast</span></code></a><span class="special"><</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">microseconds</span></code></a><span class="special">>(</span><span class="identifier">d</span><span class="special">);</span> 2458 <span class="identifier">SysTime</span> <span class="identifier">st</span> <span class="special">=</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">us</span><span class="special">;</span> 2459 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"wait_until "</span><span class="special">;</span> 2460 <span class="identifier">detail</span><span class="special">::</span><span class="identifier">print_time</span><span class="special">(</span><span class="identifier">st</span><span class="special">);</span> 2461 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">" which is "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">st</span> <span class="special">-</span> <a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()).</span><span class="identifier">count</span><span class="special">()</span> 2462 <span class="special"><<</span> <span class="string">" microseconds away\n"</span><span class="special">;</span> 2463 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 2464 <span class="special">}</span> 2465<span class="special">};</span> 2466<span class="special">}</span> 2467</pre> 2468<p> 2469 Next follows how simple is the usage of this functions: 2470 </p> 2471<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span> 2472<span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span> <span class="identifier">mut</span><span class="special">;</span> 2473<span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span> <span class="identifier">cv</span><span class="special">;</span> 2474 2475<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span> 2476 2477<span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">seconds</span></code></a><span class="special">(</span><span class="number">3</span><span class="special">));</span> 2478<span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">nanoseconds</span></code></a><span class="special">(</span><span class="number">300</span><span class="special">));</span> 2479<span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">time_point</span> <span class="identifier">time_limit</span> <span class="special">=</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">__seconds_</span><span class="special">(</span><span class="number">4</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a><span class="special">(</span><span class="number">500</span><span class="special">);</span> 2480<span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_until</span><span class="special">(</span><span class="identifier">time_limit</span><span class="special">);</span> 2481 2482<span class="identifier">mut</span><span class="special">.</span><span class="identifier">try_lock_for</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">milliseconds</span></code></a><span class="special">(</span><span class="number">30</span><span class="special">));</span> 2483<span class="identifier">mut</span><span class="special">.</span><span class="identifier">try_lock_until</span><span class="special">(</span><span class="identifier">time_limit</span><span class="special">);</span> 2484 2485<span class="identifier">cv</span><span class="special">.</span><span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration_typedefs" title="duration typedefs"><code class="computeroutput"><span class="identifier">minutes</span></code></a><span class="special">(</span><span class="number">1</span><span class="special">));</span> <span class="comment">// real code would put this in a loop</span> 2486<span class="identifier">cv</span><span class="special">.</span><span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">time_limit</span><span class="special">);</span> <span class="comment">// real code would put this in a loop</span> 2487 2488<span class="comment">// For those who prefer floating-point</span> 2489<span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">0.25</span><span class="special">));</span> 2490<span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_until</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.system_clocks_hpp.system_clock" title="Class system_clock"><code class="computeroutput"><span class="identifier">system_clock</span></code></a><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">chrono</span><span class="special">::</span><a class="link" href="reference.html#chrono.reference.cpp0x.duration_hpp.duration" title="Class Template duration<>"><code class="computeroutput"><span class="identifier">duration</span></code></a><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">1.5</span><span class="special">));</span> 2491</pre> 2492<p> 2493 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/simulated_thread_interface_demo.cpp" target="_top">example/simulated_thread_interface_demo.cpp</a></em></span> 2494 </p> 2495</div> 2496</div> 2497<div class="section"> 2498<div class="titlepage"><div><div><h4 class="title"> 2499<a name="chrono.users_guide.examples.io"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.io" title="IO">IO</a> 2500</h4></div></div></div> 2501<div class="toc"><dl class="toc"><dt><span class="section"><a href="users_guide.html#chrono.users_guide.examples.io.french">French Output</a></span></dt></dl></div> 2502<div class="section"> 2503<div class="titlepage"><div><div><h5 class="title"> 2504<a name="chrono.users_guide.examples.io.french"></a><a class="link" href="users_guide.html#chrono.users_guide.examples.io.french" title="French Output">French Output</a> 2505</h5></div></div></div> 2506<p> 2507 Example use of output in French 2508 </p> 2509<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">chrono</span><span class="special">/</span><span class="identifier">chrono_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2510<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 2511<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">locale</span><span class="special">></span> 2512 2513<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 2514<span class="special">{</span> 2515 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 2516 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span> 2517 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">;</span> 2518 2519 <span class="identifier">cout</span><span class="special">.</span><span class="identifier">imbue</span><span class="special">(</span><span class="identifier">locale</span><span class="special">(</span><span class="identifier">locale</span><span class="special">(),</span> <span class="keyword">new</span> <span class="identifier">duration_punct</span><span class="special"><</span><span class="keyword">char</span><span class="special">></span> 2520 <span class="special">(</span> 2521 <span class="identifier">duration_punct</span><span class="special"><</span><span class="keyword">char</span><span class="special">>::</span><span class="identifier">use_long</span><span class="special">,</span> 2522 <span class="string">"secondes"</span><span class="special">,</span> <span class="string">"minutes"</span><span class="special">,</span> <span class="string">"heures"</span><span class="special">,</span> 2523 <span class="string">"s"</span><span class="special">,</span> <span class="string">"m"</span><span class="special">,</span> <span class="string">"h"</span> 2524 <span class="special">)));</span> 2525 <span class="identifier">hours</span> <span class="identifier">h</span><span class="special">(</span><span class="number">5</span><span class="special">);</span> 2526 <span class="identifier">minutes</span> <span class="identifier">m</span><span class="special">(</span><span class="number">45</span><span class="special">);</span> 2527 <span class="identifier">seconds</span> <span class="identifier">s</span><span class="special">(</span><span class="number">15</span><span class="special">);</span> 2528 <span class="identifier">milliseconds</span> <span class="identifier">ms</span><span class="special">(</span><span class="number">763</span><span class="special">);</span> 2529 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">h</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">m</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">s</span> <span class="special"><<</span> <span class="string">" et "</span> <span class="special"><<</span> <span class="identifier">ms</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 2530<span class="special">}</span> 2531</pre> 2532<p> 2533 Output is: 2534 </p> 2535<pre class="programlisting"><span class="number">5</span> <span class="identifier">heures</span><span class="special">,</span> <span class="number">45</span> <span class="identifier">minutes</span><span class="special">,</span> <span class="number">15</span> <span class="identifier">secondes</span> <span class="identifier">et</span> <span class="number">763</span> <span class="identifier">millisecondes</span> 2536</pre> 2537<p> 2538 <span class="emphasis"><em>See the source file <a href="../../../libs/chrono/example/french.cpp" target="_top">example/french.cpp</a></em></span> 2539 </p> 2540</div> 2541</div> 2542</div> 2543<div class="section"> 2544<div class="titlepage"><div><div><h3 class="title"> 2545<a name="chrono.users_guide.ext_references"></a><a class="link" href="users_guide.html#chrono.users_guide.ext_references" title="External Resources">External Resources</a> 2546</h3></div></div></div> 2547<div class="variablelist"> 2548<p class="title"><b></b></p> 2549<dl class="variablelist"> 2550<dt><span class="term"><a href="http://www.open-std.org/jtc1/sc22/wg21" target="_top"><span class="bold"><strong>C++ 2551 Standards Committee's current Working Paper</strong></span></a></span></dt> 2552<dd><p> 2553 The most authoritative reference material for the library is the C++ 2554 Standards Committee's current Working Paper (WP). 20.11 Time utilities 2555 "time" 2556 </p></dd> 2557<dt><span class="term"><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm" target="_top"><span class="bold"><strong>N2661 - A Foundation to Sleep On</strong></span></a></span></dt> 2558<dd><p> 2559 From Howard E. Hinnant, Walter E. Brown, Jeff Garland and Marc Paterno. 2560 Is very informative and provides motivation for key design decisions 2561 </p></dd> 2562<dt><span class="term"><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3134.html#934" target="_top"><span class="bold"><strong>LGW 934. duration is missing operator%</strong></span></a></span></dt> 2563<dd><p> 2564 From Terry Golubiewski. Is very informative and provides motivation 2565 for key design decisions 2566 </p></dd> 2567<dt><span class="term"><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3135.html#935" target="_top"><span class="bold"><strong>LGW 935. clock error handling needs to be specified</strong></span></a></span></dt> 2568<dd><p> 2569 From Beman Dawes. This issue has been stated as NAD Future. 2570 </p></dd> 2571</dl> 2572</div> 2573</div> 2574<div class="footnotes"> 2575<br><hr style="width:100; text-align:left;margin-left: 0"> 2576<div id="ftn.chrono.users_guide.tutorial.i_o.duration_io.f0" class="footnote"><p><a href="#chrono.users_guide.tutorial.i_o.duration_io.f0" class="para"><sup class="para">[1] </sup></a> 2577 <a class="link" href="reference.html#chrono.reference.io_v1.chrono_io_hpp.manipulators" title="I/O Manipulators"><code class="computeroutput"><span class="identifier">duration_short</span></code></a> in V1 2578 </p></div> 2579</div> 2580</div> 2581<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 2582<td align="left"></td> 2583<td align="right"><div class="copyright-footer">Copyright © 2008 Howard Hinnant<br>Copyright © 2006, 2008 Beman Dawes<br>Copyright © 2009-2013 Vicente J. Botet Escriba<p> 2584 Distributed under the Boost Software License, Version 1.0. (See accompanying 2585 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 2586 </p> 2587</div></td> 2588</tr></table> 2589<hr> 2590<div class="spirit-nav"> 2591<a accesskey="p" href="../chrono.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../chrono.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 2592</div> 2593</body> 2594</html> 2595