1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Segmentational Fineness</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="../function_reference.html" title="Function Reference"> 9<link rel="prev" href="../function_reference.html" title="Function Reference"> 10<link rel="next" href="key_types.html" title="Key Types"> 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="../function_reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../function_reference.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="key_types.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.function_reference.segmentational_fineness"></a><a class="link" href="segmentational_fineness.html" title="Segmentational Fineness">Segmentational 28 Fineness</a> 29</h3></div></div></div> 30<p> 31 For overloading tables on infix operators, we need to break down <code class="computeroutput"><a class="link" href="../../boost/icl/interval_set.html" title="Class template interval_set">interval_sets</a></code> and <code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_maps</a></code> 32 to the specific class templates 33 </p> 34<div class="informaltable"><table class="table"> 35<colgroup> 36<col> 37<col> 38<col> 39<col> 40<col> 41<col> 42</colgroup> 43<thead><tr> 44<th> 45 </th> 46<th> 47 </th> 48<th> 49 </th> 50<th> 51 </th> 52<th> 53 </th> 54<th> 55 </th> 56</tr></thead> 57<tbody> 58<tr> 59<td> 60 <p> 61 <a name="ph_def_S1"></a><span class="bold"><strong>S1</strong></span> 62 </p> 63 </td> 64<td> 65 <p> 66 <code class="computeroutput"><a class="link" href="../../boost/icl/interval_set.html" title="Class template interval_set">interval_set</a></code> 67 </p> 68 </td> 69<td> 70 <p> 71 <a name="ph_def_S2"></a><span class="bold"><strong>S2</strong></span> 72 </p> 73 </td> 74<td> 75 <p> 76 <code class="computeroutput"><a class="link" href="../../boost/icl/separate_interval_set.html" title="Class template separate_interval_set">separate_interval_set</a></code> 77 </p> 78 </td> 79<td> 80 <p> 81 <a name="ph_def_S3"></a><span class="bold"><strong>S3</strong></span> 82 </p> 83 </td> 84<td> 85 <p> 86 <code class="computeroutput"><a class="link" href="../../boost/icl/split_interval_set.html" title="Class template split_interval_set">split_interval_set</a></code> 87 </p> 88 </td> 89</tr> 90<tr> 91<td> 92 <p> 93 <a name="ph_def_M1"></a><span class="bold"><strong>M1</strong></span> 94 </p> 95 </td> 96<td> 97 <p> 98 <code class="computeroutput"><a class="link" href="../../boost/icl/interval_map.html" title="Class template interval_map">interval_map</a></code> 99 </p> 100 </td> 101<td> 102 </td> 103<td> 104 </td> 105<td> 106 <p> 107 <a name="ph_def_M3"></a><span class="bold"><strong>M3</strong></span> 108 </p> 109 </td> 110<td> 111 <p> 112 <code class="computeroutput"><a class="link" href="../../boost/icl/split_interval_map.html" title="Class template split_interval_map">split_interval_map</a></code> 113 </p> 114 </td> 115</tr> 116</tbody> 117</table></div> 118<p> 119 choosing <span class="bold"><strong>Si</strong></span> and <span class="bold"><strong>Mi</strong></span> 120 as placeholders. 121 </p> 122<p> 123 The indices <span class="bold"><strong>i</strong></span> of <span class="bold"><strong>Si</strong></span> 124 and <span class="bold"><strong>Mi</strong></span> represent a property called <span class="emphasis"><em><span class="bold"><strong>segmentational fineness</strong></span></em></span> or short <span class="emphasis"><em><span class="bold"><strong>fineness</strong></span></em></span>, which is a <span class="emphasis"><em><span class="bold"><strong>type trait</strong></span></em></span> on interval containers. 125 </p> 126<div class="informaltable"><table class="table"> 127<colgroup><col></colgroup> 128<thead><tr><th> 129 </th></tr></thead> 130<tbody> 131<tr><td> 132 <p> 133 <code class="computeroutput"><span class="identifier">segmentational_fineness</span><span class="special"><</span></code><span class="bold"><strong>Si</strong></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">value</span></code> 134 == <span class="bold"><strong>i</strong></span> 135 </p> 136 </td></tr> 137<tr><td> 138 <p> 139 <code class="computeroutput"><span class="identifier">segmentational_fineness</span><span class="special"><</span></code><span class="bold"><strong>Mi</strong></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">value</span></code> 140 == <span class="bold"><strong>i</strong></span> 141 </p> 142 </td></tr> 143</tbody> 144</table></div> 145<p> 146 Segmentational fineness represents the fact, that for interval containers 147 holding the same elements, a splitting interval container may contain more 148 segments as a separating container which in turn may contain more segments 149 than a joining one. So for an 150</p> 151<pre class="programlisting"><span class="keyword">operator</span> <span class="special">></span> 152</pre> 153<p> 154 where 155</p> 156<pre class="programlisting"><span class="identifier">x</span> <span class="special">></span> <span class="identifier">y</span> <span class="comment">// means that</span> 157<span class="identifier">x</span> <span class="identifier">is_finer_than</span> <span class="identifier">y</span> 158 159<span class="comment">// we have</span> 160 161<span class="identifier">finer</span> <span class="identifier">coarser</span> 162<span class="identifier">split_interval_set</span> <span class="identifier">interval_set</span> 163 <span class="special">></span> <span class="identifier">separate_interval_set</span> <span class="special">></span> 164<span class="identifier">split_interval_map</span> <span class="identifier">interval_map</span> 165</pre> 166<p> 167 </p> 168<p> 169 This relation is needed to resolve the instantiation of infix operators e.g. 170 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">operator</span> 171 <span class="special">+</span> <span class="special">(</span><span class="identifier">P</span><span class="special">,</span> <span class="identifier">Q</span><span class="special">)</span></code> for two interval container types <code class="computeroutput"><span class="identifier">P</span></code> and <code class="computeroutput"><span class="identifier">Q</span></code>. 172 If both <code class="computeroutput"><span class="identifier">P</span></code> and <code class="computeroutput"><span class="identifier">Q</span></code> are candidates for the result type <code class="computeroutput"><span class="identifier">T</span></code>, one of them must be chosen by the compiler. 173 We choose the type that is segmentational finer as result type <code class="computeroutput"><span class="identifier">T</span></code>. This way we do not loose the <span class="emphasis"><em><span class="bold"><strong>segment information</strong></span></em></span> that is stored in the 174 <span class="emphasis"><em><span class="bold"><strong>finer</strong></span></em></span> one of the container 175 types <code class="computeroutput"><span class="identifier">P</span></code> and <code class="computeroutput"><span class="identifier">Q</span></code>. 176 </p> 177<p> 178</p> 179<pre class="programlisting"><span class="comment">// overload tables for</span> 180<span class="identifier">T</span> <span class="keyword">operator</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">P</span><span class="special">&)</span> 181<span class="identifier">T</span> <span class="keyword">operator</span> <span class="special">+</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">P</span><span class="special">&,</span> <span class="identifier">T</span><span class="special">)</span> 182 183<span class="identifier">element</span> <span class="identifier">containers</span><span class="special">:</span> <span class="identifier">interval</span> <span class="identifier">containers</span><span class="special">:</span> 184<span class="special">+</span> <span class="special">|</span> <span class="identifier">e</span> <span class="identifier">b</span> <span class="identifier">s</span> <span class="identifier">m</span> <span class="special">+</span> <span class="special">|</span> <span class="identifier">e</span> <span class="identifier">i</span> <span class="identifier">b</span> <span class="identifier">p</span> <span class="identifier">S1</span> <span class="identifier">S2</span> <span class="identifier">S3</span> <span class="identifier">M1</span> <span class="identifier">M3</span> 185<span class="special">---+--------</span> <span class="special">---+---------------------------</span> 186<span class="identifier">e</span> <span class="special">|</span> <span class="identifier">s</span> <span class="identifier">e</span> <span class="special">|</span> <span class="identifier">S1</span> <span class="identifier">S2</span> <span class="identifier">S3</span> 187<span class="identifier">b</span> <span class="special">|</span> <span class="identifier">m</span> <span class="identifier">i</span> <span class="special">|</span> <span class="identifier">S1</span> <span class="identifier">S2</span> <span class="identifier">S3</span> 188<span class="identifier">s</span> <span class="special">|</span> <span class="identifier">s</span> <span class="identifier">s</span> <span class="identifier">b</span> <span class="special">|</span> <span class="identifier">M1</span> <span class="identifier">M3</span> 189<span class="identifier">m</span> <span class="special">|</span> <span class="identifier">m</span> <span class="identifier">m</span> <span class="identifier">p</span> <span class="special">|</span> <span class="identifier">M1</span> <span class="identifier">M3</span> 190 <span class="identifier">S1</span> <span class="special">|</span> <span class="identifier">S1</span> <span class="identifier">S1</span> <span class="identifier">S1</span> <span class="identifier">S2</span> <span class="identifier">S3</span> 191 <span class="identifier">S2</span> <span class="special">|</span> <span class="identifier">S2</span> <span class="identifier">S2</span> <span class="identifier">S2</span> <span class="identifier">S2</span> <span class="identifier">S3</span> 192 <span class="identifier">S3</span> <span class="special">|</span> <span class="identifier">S3</span> <span class="identifier">S3</span> <span class="identifier">S3</span> <span class="identifier">S3</span> <span class="identifier">S3</span> 193 <span class="identifier">M1</span> <span class="special">|</span> <span class="identifier">M1</span> <span class="identifier">M1</span> <span class="identifier">M1</span> <span class="identifier">M3</span> 194 <span class="identifier">M3</span> <span class="special">|</span> <span class="identifier">M3</span> <span class="identifier">M3</span> <span class="identifier">M3</span> <span class="identifier">M3</span> 195</pre> 196<p> 197 </p> 198<p> 199 So looking up a type combination for e.g. <code class="computeroutput"><span class="identifier">T</span> 200 <span class="keyword">operator</span> <span class="special">+</span> 201 <span class="special">(</span><span class="identifier">interval_map</span><span class="special">,</span> <span class="identifier">split_interval_map</span><span class="special">)</span></code> which is equivalent to <code class="computeroutput"><span class="identifier">T</span> 202 <span class="keyword">operator</span> <span class="special">+</span> 203 <span class="special">(</span><span class="identifier">M1</span><span class="special">,</span> <span class="identifier">M3</span><span class="special">)</span></code> 204 we find for row type <code class="computeroutput"><span class="identifier">M1</span></code> and 205 column type <code class="computeroutput"><span class="identifier">M3</span></code> that <code class="computeroutput"><span class="identifier">M3</span></code> will be assigned as result type, because 206 <code class="computeroutput"><span class="identifier">M3</span></code> is finer than <code class="computeroutput"><span class="identifier">M1</span></code>. So this type combination will result 207 in choosing this 208</p> 209<pre class="programlisting"><span class="identifier">split_interval_map</span> <span class="keyword">operator</span> <span class="special">+</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">interval_map</span><span class="special">&,</span> <span class="identifier">split_interval_map</span><span class="special">)</span> 210</pre> 211<p> 212 implementation by the compiler. 213 </p> 214</div> 215<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 216<td align="left"></td> 217<td align="right"><div class="copyright-footer">Copyright © 2007-2010 Joachim 218 Faulhaber<br>Copyright © 1999-2006 Cortex Software 219 GmbH<p> 220 Distributed under the Boost Software License, Version 1.0. (See accompanying 221 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>) 222 </p> 223</div></td> 224</tr></table> 225<hr> 226<div class="spirit-nav"> 227<a accesskey="p" href="../function_reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../function_reference.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="key_types.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 228</div> 229</body> 230</html> 231