1<?xml version="1.0" encoding="utf-8" ?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 4<head> 5<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 6<meta name="generator" content="Docutils 0.3.10: http://docutils.sourceforge.net/" /> 7<title>Boost Pointer Container Library</title> 8<style type="text/css"> 9 10/* 11:Author: David Goodger 12:Contact: goodger@users.sourceforge.net 13:Date: $Date$ 14:Revision: $Revision$ 15:Copyright: This stylesheet has been placed in the public domain. 16 17Default cascading style sheet for the HTML output of Docutils. 18 19See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to 20customize this style sheet. 21*/ 22 23/* "! important" is used here to override other ``margin-top`` and 24 ``margin-bottom`` styles that are later in the stylesheet or 25 more specific. See http://www.w3.org/TR/CSS1#the-cascade */ 26.first { 27 margin-top: 0 ! important } 28 29.last, .with-subtitle { 30 margin-bottom: 0 ! important } 31 32.hidden { 33 display: none } 34 35a.toc-backref { 36 text-decoration: none ; 37 color: black } 38 39blockquote.epigraph { 40 margin: 2em 5em ; } 41 42dl.docutils dd { 43 margin-bottom: 0.5em } 44 45/* Uncomment (and remove this text!) to get bold-faced definition list terms 46dl.docutils dt { 47 font-weight: bold } 48*/ 49 50div.abstract { 51 margin: 2em 5em } 52 53div.abstract p.topic-title { 54 font-weight: bold ; 55 text-align: center } 56 57div.admonition, div.attention, div.caution, div.danger, div.error, 58div.hint, div.important, div.note, div.tip, div.warning { 59 margin: 2em ; 60 border: medium outset ; 61 padding: 1em } 62 63div.admonition p.admonition-title, div.hint p.admonition-title, 64div.important p.admonition-title, div.note p.admonition-title, 65div.tip p.admonition-title { 66 font-weight: bold ; 67 font-family: sans-serif } 68 69div.attention p.admonition-title, div.caution p.admonition-title, 70div.danger p.admonition-title, div.error p.admonition-title, 71div.warning p.admonition-title { 72 color: red ; 73 font-weight: bold ; 74 font-family: sans-serif } 75 76/* Uncomment (and remove this text!) to get reduced vertical space in 77 compound paragraphs. 78div.compound .compound-first, div.compound .compound-middle { 79 margin-bottom: 0.5em } 80 81div.compound .compound-last, div.compound .compound-middle { 82 margin-top: 0.5em } 83*/ 84 85div.dedication { 86 margin: 2em 5em ; 87 text-align: center ; 88 font-style: italic } 89 90div.dedication p.topic-title { 91 font-weight: bold ; 92 font-style: normal } 93 94div.figure { 95 margin-left: 2em } 96 97div.footer, div.header { 98 clear: both; 99 font-size: smaller } 100 101div.line-block { 102 display: block ; 103 margin-top: 1em ; 104 margin-bottom: 1em } 105 106div.line-block div.line-block { 107 margin-top: 0 ; 108 margin-bottom: 0 ; 109 margin-left: 1.5em } 110 111div.sidebar { 112 margin-left: 1em ; 113 border: medium outset ; 114 padding: 1em ; 115 background-color: #ffffee ; 116 width: 40% ; 117 float: right ; 118 clear: right } 119 120div.sidebar p.rubric { 121 font-family: sans-serif ; 122 font-size: medium } 123 124div.system-messages { 125 margin: 5em } 126 127div.system-messages h1 { 128 color: red } 129 130div.system-message { 131 border: medium outset ; 132 padding: 1em } 133 134div.system-message p.system-message-title { 135 color: red ; 136 font-weight: bold } 137 138div.topic { 139 margin: 2em } 140 141h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, 142h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { 143 margin-top: 0.4em } 144 145h1.title { 146 text-align: center } 147 148h2.subtitle { 149 text-align: center } 150 151hr.docutils { 152 width: 75% } 153 154img.align-left { 155 clear: left } 156 157img.align-right { 158 clear: right } 159 160img.borderless { 161 border: 0 } 162 163ol.simple, ul.simple { 164 margin-bottom: 1em } 165 166ol.arabic { 167 list-style: decimal } 168 169ol.loweralpha { 170 list-style: lower-alpha } 171 172ol.upperalpha { 173 list-style: upper-alpha } 174 175ol.lowerroman { 176 list-style: lower-roman } 177 178ol.upperroman { 179 list-style: upper-roman } 180 181p.attribution { 182 text-align: right ; 183 margin-left: 50% } 184 185p.caption { 186 font-style: italic } 187 188p.credits { 189 font-style: italic ; 190 font-size: smaller } 191 192p.label { 193 white-space: nowrap } 194 195p.rubric { 196 font-weight: bold ; 197 font-size: larger ; 198 color: maroon ; 199 text-align: center } 200 201p.sidebar-title { 202 font-family: sans-serif ; 203 font-weight: bold ; 204 font-size: larger } 205 206p.sidebar-subtitle { 207 font-family: sans-serif ; 208 font-weight: bold } 209 210p.topic-title { 211 font-weight: bold } 212 213pre.address { 214 margin-bottom: 0 ; 215 margin-top: 0 ; 216 font-family: serif ; 217 font-size: 100% } 218 219pre.line-block { 220 font-family: serif ; 221 font-size: 100% } 222 223pre.literal-block, pre.doctest-block { 224 margin-left: 2em ; 225 margin-right: 2em ; 226 background-color: #eeeeee } 227 228span.classifier { 229 font-family: sans-serif ; 230 font-style: oblique } 231 232span.classifier-delimiter { 233 font-family: sans-serif ; 234 font-weight: bold } 235 236span.interpreted { 237 font-family: sans-serif } 238 239span.option { 240 white-space: nowrap } 241 242span.pre { 243 white-space: pre } 244 245span.problematic { 246 color: red } 247 248span.section-subtitle { 249 /* font-size relative to parent (h1..h6 element) */ 250 font-size: 80% } 251 252table.citation { 253 border-left: solid thin gray } 254 255table.docinfo { 256 margin: 2em 4em } 257 258table.docutils { 259 margin-top: 0.5em ; 260 margin-bottom: 0.5em } 261 262table.footnote { 263 border-left: solid thin black } 264 265table.docutils td, table.docutils th, 266table.docinfo td, table.docinfo th { 267 padding-left: 0.5em ; 268 padding-right: 0.5em ; 269 vertical-align: top } 270 271table.docutils th.field-name, table.docinfo th.docinfo-name { 272 font-weight: bold ; 273 text-align: left ; 274 white-space: nowrap ; 275 padding-left: 0 } 276 277h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, 278h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { 279 font-size: 100% } 280 281tt.docutils { 282 background-color: #eeeeee } 283 284ul.auto-toc { 285 list-style-type: none } 286 287</style> 288</head> 289<body> 290<div class="document" id="boost-pointer-container-library"> 291<h1 class="title"><img alt="Boost" src="boost.png" /> Pointer Container Library</h1> 292<h2 class="subtitle" id="indirected-functions">Indirected functions</h2> 293<p>It is quite common that we have two pointers and what to compare the 294pointed to objects. Also, we have usually already defined how 295to compare the objects. So to avoid some tedious boiler-plate code 296this library defines predicates that apply an indirection before comparing.</p> 297<p>When the container uses <tt class="docutils literal"><span class="pre">void*</span></tt> internally, we can use the 298class <tt class="docutils literal"><span class="pre">void_ptr_indirect_fun</span></tt>; otherwise we use the class 299<tt class="docutils literal"><span class="pre">indirect_fun</span></tt>.</p> 300<p><strong>Example:</strong></p> 301<pre class="literal-block"> 302std::string* bar = new std::string("bar"); 303std::string* foo = new std::string("foo"); 304BOOST_ASSERT( indirect_fun< std::less<std::string> >()( bar, foo ) == true ); 305BOOST_ASSERT( make_indirect_fun( std::less<std::string>() )( foo, bar ) == false ); 306 307void* vptr1 = ptr1; 308void* vptr2 = ptr2; 309void_ptr_indirect_fun< std::less<std::string>, std::string> cast_fun; 310BOOST_CHECK( cast_fun( vptr1, vptr2 ) == true ); 311</pre> 312<p><strong>See also:</strong></p> 313<ul class="simple"> 314<li><a class="reference" href="http://www.boost.org/libs/utility/utility.htm#result_of">result_of</a></li> 315<li><a class="reference" href="http://www.boost.org/libs/iterator/doc/pointee.html">pointee</a></li> 316<li><a class="reference" href="ptr_set.html">ptr_set</a></li> 317<li><a class="reference" href="ptr_multiset.html">ptr_multiset</a></li> 318</ul> 319<p><strong>Navigate</strong></p> 320<ul class="simple"> 321<li><a class="reference" href="ptr_container.html">home</a></li> 322<li><a class="reference" href="reference.html">reference</a></li> 323</ul> 324<p><strong>Remarks:</strong></p> 325<p>The class <tt class="docutils literal"><span class="pre">indirect_fun</span></tt> will work with smart pointers such as <a class="reference" href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm">boost::shared_ptr<T></a> 326because of the type traits <tt class="docutils literal"><span class="pre">pointee<T>::type</span></tt> from the header <tt class="docutils literal"><span class="pre"><boost/pointee.hpp></span></tt>.</p> 327<p><strong>Synopsis:</strong></p> 328<p>Since the definition of the predicates is somewhat trivial, only the 329first operation is expanded inline.</p> 330<pre class="literal-block"> 331namespace boost 332{ 333 334 template< class Fun > 335 struct indirect_fun 336 { 337 indirect_fun() : fun(Fun()) 338 { } 339 340 indirect_fun( Fun f ) : fun(f) 341 { } 342 343 template< class T > 344 typename result_of< Fun( typename pointee<T>::type ) >::type 345 operator()( const T& r ) const 346 { 347 return fun( *r ); 348 } 349 350 template< class T, class U > 351 typename result_of< Fun( typename pointee<T>::type, 352 typename pointee<U>::type ) >::type 353 operator()( const T& r, const U& r2 ) const 354 { 355 return fun( *r, *r2 ); 356 } 357 358 private: 359 Fun fun; 360 }; 361 362 template< class Fun > 363 inline indirect_fun<Fun> make_indirect_fun( Fun f ) 364 { 365 return indirect_fun<Fun>( f ); 366 } 367 368 369 370 template< class Fun, class Arg1, class Arg2 = Arg1 > 371 struct void_ptr_indirect_fun 372 { 373 void_ptr_indirect_fun() : fun(Fun()) 374 { } 375 376 void_ptr_indirect_fun( Fun f ) : fun(f) 377 { } 378 379 typename result_of< Fun( Arg1 ) >::type 380 operator()( const void* r ) const 381 { 382 return fun( * static_cast<const Arg1*>( r ) ); 383 } 384 385 typename result_of< Fun( Arg1, Arg2 ) >::type 386 operator()( const void* l, const void* r ) const 387 { 388 return fun( * static_cast<const Arg1*>( l ), * static_cast<const Arg2*>( r ) ); 389 } 390 391 private: 392 Fun fun; 393 }; 394 395 template< class Fun, class Arg > 396 inline void_ptr_indirect_fun<Fun,Arg> 397 make_void_ptr_indirect_fun( Fun f ) 398 { 399 return void_ptr_indirect_fun<Fun,Arg>( f ); 400 } 401 402} // namespace 'boost' 403</pre> 404<hr><table class="docutils field-list" frame="void" rules="none"> 405<col class="field-name" /> 406<col class="field-body" /> 407<tbody valign="top"> 408<tr class="field"><th class="field-name">Copyright:</th><td class="field-body">Thorsten Ottosen 2004-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see <a class="reference" href="http://www.boost.org/LICENSE_1_0.txt">LICENSE_1_0.txt</a>).</td> 409</tr> 410</tbody> 411</table> 412</div> 413</body> 414</html> 415