9
3

party.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Party</title>
  5. <link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.Icl">
  8. <link rel="up" href="../examples.html" title="Examples">
  9. <link rel="prev" href="../examples.html" title="Examples">
  10. <link rel="next" href="interval.html" title="Interval">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="../examples.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.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="interval.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h3 class="title">
  27. <a name="boost_icl.examples.party"></a><a class="link" href="party.html" title="Party">Party</a>
  28. </h3></div></div></div>
  29. <p>
  30. Example <span class="bold"><strong>party</strong></span> demonstrates the possibilities
  31. of an interval map (<code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_map</a></code>
  32. or <code class="computeroutput"><a class="link" href="../../boost/icl/split_interval_map.html" title="Class template split_interval_map">split_interval_map</a></code>).
  33. An <code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_map</a></code> maps
  34. intervals to a given content. In this case the content is a set of party
  35. guests represented by their name strings.
  36. </p>
  37. <p>
  38. As time goes by, groups of people join the party and leave later in the evening.
  39. So we add a time interval and a name set to the <code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_map</a></code>
  40. for the attendance of each group of people, that come together and leave
  41. together. On every overlap of intervals, the corresponding name sets are
  42. accumulated. At the points of overlap the intervals are split. The accumulation
  43. of content is done via an operator += that has to be implemented for the
  44. content parameter of the <code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_map</a></code>.
  45. Finally the interval_map contains the history of attendance and all points
  46. in time, where the group of party guests changed.
  47. </p>
  48. <p>
  49. Party demonstrates a principle that we call <span class="emphasis"><em><span class="bold"><strong>aggregate
  50. on overlap</strong></span></em></span>: On insertion a value associated to the
  51. interval is aggregated with those values in the interval_map that overlap
  52. with the inserted value. There are two behavioral aspects to <span class="emphasis"><em><span class="bold"><strong>aggregate on overlap</strong></span></em></span>: a <span class="emphasis"><em><span class="bold"><strong>decompositional behavior</strong></span></em></span> and an <span class="emphasis"><em><span class="bold"><strong>accumulative behavior</strong></span></em></span>.
  53. </p>
  54. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  55. <li class="listitem">
  56. The <span class="emphasis"><em><span class="bold"><strong>decompositional behavior</strong></span></em></span>
  57. splits up intervals on the <span class="emphasis"><em>time</em></span> <span class="emphasis"><em>dimension</em></span>
  58. of the interval_map so that the intervals are split whenever associated
  59. values change.
  60. </li>
  61. <li class="listitem">
  62. The <span class="emphasis"><em><span class="bold"><strong>accumulative behavior</strong></span></em></span>
  63. accumulates associated values on every overlap of an insertion for the
  64. associated values.
  65. </li>
  66. </ul></div>
  67. <p>
  68. The aggregation function is += by default. Different aggregations can be
  69. used, if desired.
  70. </p>
  71. <p>
  72. </p>
  73. <pre class="programlisting"><span class="comment">// The next line includes &lt;boost/date_time/posix_time/posix_time.hpp&gt;</span>
  74. <span class="comment">// and a few lines of adapter code.</span>
  75. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">icl</span><span class="special">/</span><span class="identifier">ptime</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  76. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  77. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">icl</span><span class="special">/</span><span class="identifier">interval_map</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  78. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
  79. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">posix_time</span><span class="special">;</span>
  80. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">icl</span><span class="special">;</span>
  81. <span class="comment">// Type set&lt;string&gt; collects the names of party guests. Since std::set is</span>
  82. <span class="comment">// a model of the itl's set concept, the concept provides an operator += </span>
  83. <span class="comment">// that performs a set union on overlap of intervals.</span>
  84. <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">set</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">GuestSetT</span><span class="special">;</span>
  85. <span class="keyword">void</span> <span class="identifier">boost_party</span><span class="special">()</span>
  86. <span class="special">{</span>
  87. <span class="identifier">GuestSetT</span> <span class="identifier">mary_harry</span><span class="special">;</span>
  88. <span class="identifier">mary_harry</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="string">"Mary"</span><span class="special">);</span>
  89. <span class="identifier">mary_harry</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="string">"Harry"</span><span class="special">);</span>
  90. <span class="identifier">GuestSetT</span> <span class="identifier">diana_susan</span><span class="special">;</span>
  91. <span class="identifier">diana_susan</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="string">"Diana"</span><span class="special">);</span>
  92. <span class="identifier">diana_susan</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="string">"Susan"</span><span class="special">);</span>
  93. <span class="identifier">GuestSetT</span> <span class="identifier">peter</span><span class="special">;</span>
  94. <span class="identifier">peter</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="string">"Peter"</span><span class="special">);</span>
  95. <span class="comment">// A party is an interval map that maps time intervals to sets of guests</span>
  96. <span class="identifier">interval_map</span><span class="special">&lt;</span><span class="identifier">ptime</span><span class="special">,</span> <span class="identifier">GuestSetT</span><span class="special">&gt;</span> <span class="identifier">party</span><span class="special">;</span>
  97. <span class="identifier">party</span><span class="special">.</span><span class="identifier">add</span><span class="special">(</span> <span class="comment">// add and element</span>
  98. <span class="identifier">make_pair</span><span class="special">(</span>
  99. <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">ptime</span><span class="special">&gt;::</span><span class="identifier">right_open</span><span class="special">(</span>
  100. <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 19:30"</span><span class="special">),</span>
  101. <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 23:00"</span><span class="special">)),</span>
  102. <span class="identifier">mary_harry</span><span class="special">));</span>
  103. <span class="identifier">party</span> <span class="special">+=</span> <span class="comment">// element addition can also be done via operator +=</span>
  104. <span class="identifier">make_pair</span><span class="special">(</span>
  105. <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">ptime</span><span class="special">&gt;::</span><span class="identifier">right_open</span><span class="special">(</span>
  106. <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 20:10"</span><span class="special">),</span>
  107. <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-21 00:00"</span><span class="special">)),</span>
  108. <span class="identifier">diana_susan</span><span class="special">);</span>
  109. <span class="identifier">party</span> <span class="special">+=</span>
  110. <span class="identifier">make_pair</span><span class="special">(</span>
  111. <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">ptime</span><span class="special">&gt;::</span><span class="identifier">right_open</span><span class="special">(</span>
  112. <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 22:15"</span><span class="special">),</span>
  113. <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-21 00:30"</span><span class="special">)),</span>
  114. <span class="identifier">peter</span><span class="special">);</span>
  115. <span class="identifier">interval_map</span><span class="special">&lt;</span><span class="identifier">ptime</span><span class="special">,</span> <span class="identifier">GuestSetT</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">party</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  116. <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"----- History of party guests -------------------------\n"</span><span class="special">;</span>
  117. <span class="keyword">while</span><span class="special">(</span><span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">party</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span>
  118. <span class="special">{</span>
  119. <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">ptime</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">when</span> <span class="special">=</span> <span class="identifier">it</span><span class="special">-&gt;</span><span class="identifier">first</span><span class="special">;</span>
  120. <span class="comment">// Who is at the party within the time interval 'when' ?</span>
  121. <span class="identifier">GuestSetT</span> <span class="identifier">who</span> <span class="special">=</span> <span class="special">(*</span><span class="identifier">it</span><span class="special">++).</span><span class="identifier">second</span><span class="special">;</span>
  122. <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">when</span> <span class="special">&lt;&lt;</span> <span class="string">": "</span> <span class="special">&lt;&lt;</span> <span class="identifier">who</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
  123. <span class="special">}</span>
  124. <span class="special">}</span>
  125. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
  126. <span class="special">{</span>
  127. <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"&gt;&gt;Interval Container Library: Sample boost_party.cpp &lt;&lt;\n"</span><span class="special">;</span>
  128. <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"-------------------------------------------------------\n"</span><span class="special">;</span>
  129. <span class="identifier">boost_party</span><span class="special">();</span>
  130. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  131. <span class="special">}</span>
  132. <span class="comment">// Program output:</span>
  133. <span class="comment">/*-----------------------------------------------------------------------------
  134. &gt;&gt;Interval Container Library: Sample boost_party.cpp &lt;&lt;
  135. -------------------------------------------------------
  136. ----- History of party guests -------------------------
  137. [2008-May-20 19:30:00, 2008-May-20 20:10:00): Harry Mary
  138. [2008-May-20 20:10:00, 2008-May-20 22:15:00): Diana Harry Mary Susan
  139. [2008-May-20 22:15:00, 2008-May-20 23:00:00): Diana Harry Mary Peter Susan
  140. [2008-May-20 23:00:00, 2008-May-21 00:00:00): Diana Peter Susan
  141. [2008-May-21 00:00:00, 2008-May-21 00:30:00): Peter
  142. -----------------------------------------------------------------------------*/</span>
  143. </pre>
  144. <p>
  145. </p>
  146. <div class="caution"><table border="0" summary="Caution">
  147. <tr>
  148. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../doc/src/images/caution.png"></td>
  149. <th align="left">Caution</th>
  150. </tr>
  151. <tr><td align="left" valign="top"><p>
  152. We are introducing <code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_maps</a></code>
  153. using an <span class="emphasis"><em>interval map <span class="emphasis"><em><span class="bold"><strong>of sets
  154. of strings</strong></span></em></span></em></span>, because of it's didactic advantages.
  155. The party example is used to give an immediate access to the basic ideas
  156. of interval maps and <span class="emphasis"><em>aggregate on overlap</em></span>. For real
  157. world applications, an interval_map of sets is not necessarily recommended.
  158. It has the same efficiency problems as a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span></code>
  159. of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">sets</span></code>. There is a big realm though of
  160. using interval_maps with numerical and other efficient data types for the
  161. associated values.
  162. </p></td></tr>
  163. </table></div>
  164. </div>
  165. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  166. <td align="left"></td>
  167. <td align="right"><div class="copyright-footer">Copyright &#169; 2007-2010 Joachim
  168. Faulhaber<br>Copyright &#169; 1999-2006 Cortex Software
  169. GmbH<p>
  170. Distributed under the Boost Software License, Version 1.0. (See accompanying
  171. 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>)
  172. </p>
  173. </div></td>
  174. </tr></table>
  175. <hr>
  176. <div class="spirit-nav">
  177. <a accesskey="p" href="../examples.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.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="interval.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  178. </div>
  179. </body>
  180. </html>