• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(&quot;bar&quot;);
303std::string* foo = new std::string(&quot;foo&quot;);
304BOOST_ASSERT( indirect_fun&lt; std::less&lt;std::string&gt; &gt;()( bar, foo ) == true );
305BOOST_ASSERT( make_indirect_fun( std::less&lt;std::string&gt;() )( foo, bar ) == false );
306
307void*       vptr1  = ptr1;
308void*       vptr2  = ptr2;
309void_ptr_indirect_fun&lt; std::less&lt;std::string&gt;, std::string&gt; 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&lt;T&gt;</a>
326because of the type traits <tt class="docutils literal"><span class="pre">pointee&lt;T&gt;::type</span></tt> from the header <tt class="docutils literal"><span class="pre">&lt;boost/pointee.hpp&gt;</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&lt; class Fun &gt;
335    struct indirect_fun
336    {
337        indirect_fun() : fun(Fun())
338        { }
339
340        indirect_fun( Fun f ) : fun(f)
341        { }
342
343        template&lt; class T &gt;
344        typename result_of&lt; Fun( typename pointee&lt;T&gt;::type ) &gt;::type
345        operator()( const T&amp; r ) const
346        {
347            return fun( *r );
348        }
349
350        template&lt; class T, class U &gt;
351        typename result_of&lt; Fun( typename pointee&lt;T&gt;::type,
352                                 typename pointee&lt;U&gt;::type ) &gt;::type
353        operator()( const T&amp; r, const U&amp; r2 ) const
354        {
355            return fun( *r, *r2 );
356        }
357
358    private:
359        Fun fun;
360    };
361
362    template&lt; class Fun &gt;
363    inline indirect_fun&lt;Fun&gt; make_indirect_fun( Fun f )
364    {
365        return indirect_fun&lt;Fun&gt;( f );
366    }
367
368
369
370    template&lt; class Fun, class Arg1, class Arg2 = Arg1 &gt;
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&lt; Fun( Arg1 ) &gt;::type
380        operator()( const void* r ) const
381        {
382            return fun( * static_cast&lt;const Arg1*&gt;( r ) );
383        }
384
385        typename result_of&lt; Fun( Arg1, Arg2 ) &gt;::type
386        operator()( const void* l, const void* r ) const
387        {
388            return fun( * static_cast&lt;const Arg1*&gt;( l ), * static_cast&lt;const Arg2*&gt;( r ) );
389        }
390
391    private:
392        Fun fun;
393    };
394
395    template&lt; class Fun, class Arg &gt;
396    inline void_ptr_indirect_fun&lt;Fun,Arg&gt;
397    make_void_ptr_indirect_fun( Fun f )
398    {
399        return void_ptr_indirect_fun&lt;Fun,Arg&gt;( 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