1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 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 1. 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 <boost/date_time/posix_time/posix_time.hpp></span> 74<span class="comment">// and a few lines of adapter code.</span> 75<span class="preprocessor">#include</span> <span class="special"><</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">></span> 76<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 77<span class="preprocessor">#include</span> <span class="special"><</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">></span> 78 79<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</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">posix_time</span><span class="special">;</span> 81<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> 82 83<span class="comment">// Type set<string> collects the names of party guests. Since std::set is</span> 84<span class="comment">// a model of the itl's set concept, the concept provides an operator += </span> 85<span class="comment">// that performs a set union on overlap of intervals.</span> 86<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">set</span><span class="special"><</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">GuestSetT</span><span class="special">;</span> 87 88<span class="keyword">void</span> <span class="identifier">boost_party</span><span class="special">()</span> 89<span class="special">{</span> 90 <span class="identifier">GuestSetT</span> <span class="identifier">mary_harry</span><span class="special">;</span> 91 <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> 92 <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> 93 94 <span class="identifier">GuestSetT</span> <span class="identifier">diana_susan</span><span class="special">;</span> 95 <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> 96 <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> 97 98 <span class="identifier">GuestSetT</span> <span class="identifier">peter</span><span class="special">;</span> 99 <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> 100 101 <span class="comment">// A party is an interval map that maps time intervals to sets of guests</span> 102 <span class="identifier">interval_map</span><span class="special"><</span><span class="identifier">ptime</span><span class="special">,</span> <span class="identifier">GuestSetT</span><span class="special">></span> <span class="identifier">party</span><span class="special">;</span> 103 104 <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> 105 <span class="identifier">make_pair</span><span class="special">(</span> 106 <span class="identifier">interval</span><span class="special"><</span><span class="identifier">ptime</span><span class="special">>::</span><span class="identifier">right_open</span><span class="special">(</span> 107 <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 19:30"</span><span class="special">),</span> 108 <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 23:00"</span><span class="special">)),</span> 109 <span class="identifier">mary_harry</span><span class="special">));</span> 110 111 <span class="identifier">party</span> <span class="special">+=</span> <span class="comment">// element addition can also be done via operator +=</span> 112 <span class="identifier">make_pair</span><span class="special">(</span> 113 <span class="identifier">interval</span><span class="special"><</span><span class="identifier">ptime</span><span class="special">>::</span><span class="identifier">right_open</span><span class="special">(</span> 114 <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 20:10"</span><span class="special">),</span> 115 <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-21 00:00"</span><span class="special">)),</span> 116 <span class="identifier">diana_susan</span><span class="special">);</span> 117 118 <span class="identifier">party</span> <span class="special">+=</span> 119 <span class="identifier">make_pair</span><span class="special">(</span> 120 <span class="identifier">interval</span><span class="special"><</span><span class="identifier">ptime</span><span class="special">>::</span><span class="identifier">right_open</span><span class="special">(</span> 121 <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-20 22:15"</span><span class="special">),</span> 122 <span class="identifier">time_from_string</span><span class="special">(</span><span class="string">"2008-05-21 00:30"</span><span class="special">)),</span> 123 <span class="identifier">peter</span><span class="special">);</span> 124 125 126 <span class="identifier">interval_map</span><span class="special"><</span><span class="identifier">ptime</span><span class="special">,</span> <span class="identifier">GuestSetT</span><span class="special">>::</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> 127 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"----- History of party guests -------------------------\n"</span><span class="special">;</span> 128 <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> 129 <span class="special">{</span> 130 <span class="identifier">interval</span><span class="special"><</span><span class="identifier">ptime</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">when</span> <span class="special">=</span> <span class="identifier">it</span><span class="special">-></span><span class="identifier">first</span><span class="special">;</span> 131 <span class="comment">// Who is at the party within the time interval 'when' ?</span> 132 <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> 133 <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">when</span> <span class="special"><<</span> <span class="string">": "</span> <span class="special"><<</span> <span class="identifier">who</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 134 <span class="special">}</span> 135 136<span class="special">}</span> 137 138 139<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 140<span class="special">{</span> 141 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">">>Interval Container Library: Sample boost_party.cpp <<\n"</span><span class="special">;</span> 142 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"-------------------------------------------------------\n"</span><span class="special">;</span> 143 <span class="identifier">boost_party</span><span class="special">();</span> 144 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 145<span class="special">}</span> 146 147<span class="comment">// Program output:</span> 148<span class="comment">/*----------------------------------------------------------------------------- 149>>Interval Container Library: Sample boost_party.cpp << 150------------------------------------------------------- 151----- History of party guests ------------------------- 152[2008-May-20 19:30:00, 2008-May-20 20:10:00): Harry Mary 153[2008-May-20 20:10:00, 2008-May-20 22:15:00): Diana Harry Mary Susan 154[2008-May-20 22:15:00, 2008-May-20 23:00:00): Diana Harry Mary Peter Susan 155[2008-May-20 23:00:00, 2008-May-21 00:00:00): Diana Peter Susan 156[2008-May-21 00:00:00, 2008-May-21 00:30:00): Peter 157-----------------------------------------------------------------------------*/</span> 158</pre> 159<p> 160 </p> 161<div class="caution"><table border="0" summary="Caution"> 162<tr> 163<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../doc/src/images/caution.png"></td> 164<th align="left">Caution</th> 165</tr> 166<tr><td align="left" valign="top"><p> 167 We are introducing <code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_maps</a></code> 168 using an <span class="emphasis"><em>interval map <span class="emphasis"><em><span class="bold"><strong>of sets 169 of strings</strong></span></em></span></em></span>, because of it's didactic advantages. 170 The party example is used to give an immediate access to the basic ideas 171 of interval maps and <span class="emphasis"><em>aggregate on overlap</em></span>. For real 172 world applications, an interval_map of sets is not necessarily recommended. 173 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> 174 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 175 using interval_maps with numerical and other efficient data types for the 176 associated values. 177 </p></td></tr> 178</table></div> 179</div> 180<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 181<td align="left"></td> 182<td align="right"><div class="copyright-footer">Copyright © 2007-2010 Joachim 183 Faulhaber<br>Copyright © 1999-2006 Cortex Software 184 GmbH<p> 185 Distributed under the Boost Software License, Version 1.0. (See accompanying 186 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>) 187 </p> 188</div></td> 189</tr></table> 190<hr> 191<div class="spirit-nav"> 192<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> 193</div> 194</body> 195</html> 196