]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/ptr_container/doc/indirect_fun.html
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / ptr_container / doc / indirect_fun.html
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
17 Default cascading style sheet for the HTML output of Docutils.
18
19 See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
20 customize 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
35 a.toc-backref {
36 text-decoration: none ;
37 color: black }
38
39 blockquote.epigraph {
40 margin: 2em 5em ; }
41
42 dl.docutils dd {
43 margin-bottom: 0.5em }
44
45 /* Uncomment (and remove this text!) to get bold-faced definition list terms
46 dl.docutils dt {
47 font-weight: bold }
48 */
49
50 div.abstract {
51 margin: 2em 5em }
52
53 div.abstract p.topic-title {
54 font-weight: bold ;
55 text-align: center }
56
57 div.admonition, div.attention, div.caution, div.danger, div.error,
58 div.hint, div.important, div.note, div.tip, div.warning {
59 margin: 2em ;
60 border: medium outset ;
61 padding: 1em }
62
63 div.admonition p.admonition-title, div.hint p.admonition-title,
64 div.important p.admonition-title, div.note p.admonition-title,
65 div.tip p.admonition-title {
66 font-weight: bold ;
67 font-family: sans-serif }
68
69 div.attention p.admonition-title, div.caution p.admonition-title,
70 div.danger p.admonition-title, div.error p.admonition-title,
71 div.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.
78 div.compound .compound-first, div.compound .compound-middle {
79 margin-bottom: 0.5em }
80
81 div.compound .compound-last, div.compound .compound-middle {
82 margin-top: 0.5em }
83 */
84
85 div.dedication {
86 margin: 2em 5em ;
87 text-align: center ;
88 font-style: italic }
89
90 div.dedication p.topic-title {
91 font-weight: bold ;
92 font-style: normal }
93
94 div.figure {
95 margin-left: 2em }
96
97 div.footer, div.header {
98 clear: both;
99 font-size: smaller }
100
101 div.line-block {
102 display: block ;
103 margin-top: 1em ;
104 margin-bottom: 1em }
105
106 div.line-block div.line-block {
107 margin-top: 0 ;
108 margin-bottom: 0 ;
109 margin-left: 1.5em }
110
111 div.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
120 div.sidebar p.rubric {
121 font-family: sans-serif ;
122 font-size: medium }
123
124 div.system-messages {
125 margin: 5em }
126
127 div.system-messages h1 {
128 color: red }
129
130 div.system-message {
131 border: medium outset ;
132 padding: 1em }
133
134 div.system-message p.system-message-title {
135 color: red ;
136 font-weight: bold }
137
138 div.topic {
139 margin: 2em }
140
141 h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
142 h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
143 margin-top: 0.4em }
144
145 h1.title {
146 text-align: center }
147
148 h2.subtitle {
149 text-align: center }
150
151 hr.docutils {
152 width: 75% }
153
154 img.align-left {
155 clear: left }
156
157 img.align-right {
158 clear: right }
159
160 img.borderless {
161 border: 0 }
162
163 ol.simple, ul.simple {
164 margin-bottom: 1em }
165
166 ol.arabic {
167 list-style: decimal }
168
169 ol.loweralpha {
170 list-style: lower-alpha }
171
172 ol.upperalpha {
173 list-style: upper-alpha }
174
175 ol.lowerroman {
176 list-style: lower-roman }
177
178 ol.upperroman {
179 list-style: upper-roman }
180
181 p.attribution {
182 text-align: right ;
183 margin-left: 50% }
184
185 p.caption {
186 font-style: italic }
187
188 p.credits {
189 font-style: italic ;
190 font-size: smaller }
191
192 p.label {
193 white-space: nowrap }
194
195 p.rubric {
196 font-weight: bold ;
197 font-size: larger ;
198 color: maroon ;
199 text-align: center }
200
201 p.sidebar-title {
202 font-family: sans-serif ;
203 font-weight: bold ;
204 font-size: larger }
205
206 p.sidebar-subtitle {
207 font-family: sans-serif ;
208 font-weight: bold }
209
210 p.topic-title {
211 font-weight: bold }
212
213 pre.address {
214 margin-bottom: 0 ;
215 margin-top: 0 ;
216 font-family: serif ;
217 font-size: 100% }
218
219 pre.line-block {
220 font-family: serif ;
221 font-size: 100% }
222
223 pre.literal-block, pre.doctest-block {
224 margin-left: 2em ;
225 margin-right: 2em ;
226 background-color: #eeeeee }
227
228 span.classifier {
229 font-family: sans-serif ;
230 font-style: oblique }
231
232 span.classifier-delimiter {
233 font-family: sans-serif ;
234 font-weight: bold }
235
236 span.interpreted {
237 font-family: sans-serif }
238
239 span.option {
240 white-space: nowrap }
241
242 span.pre {
243 white-space: pre }
244
245 span.problematic {
246 color: red }
247
248 span.section-subtitle {
249 /* font-size relative to parent (h1..h6 element) */
250 font-size: 80% }
251
252 table.citation {
253 border-left: solid thin gray }
254
255 table.docinfo {
256 margin: 2em 4em }
257
258 table.docutils {
259 margin-top: 0.5em ;
260 margin-bottom: 0.5em }
261
262 table.footnote {
263 border-left: solid thin black }
264
265 table.docutils td, table.docutils th,
266 table.docinfo td, table.docinfo th {
267 padding-left: 0.5em ;
268 padding-right: 0.5em ;
269 vertical-align: top }
270
271 table.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
277 h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
278 h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
279 font-size: 100% }
280
281 tt.docutils {
282 background-color: #eeeeee }
283
284 ul.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
294 pointed to objects. Also, we have usually already defined how
295 to compare the objects. So to avoid some tedious boiler-plate code
296 this 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
298 class <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">
302 std::string* bar = new std::string(&quot;bar&quot;);
303 std::string* foo = new std::string(&quot;foo&quot;);
304 BOOST_ASSERT( indirect_fun&lt; std::less&lt;std::string&gt; &gt;()( bar, foo ) == true );
305 BOOST_ASSERT( make_indirect_fun( std::less&lt;std::string&gt;() )( foo, bar ) == false );
306
307 void* vptr1 = ptr1;
308 void* vptr2 = ptr2;
309 void_ptr_indirect_fun&lt; std::less&lt;std::string&gt;, std::string&gt; cast_fun;
310 BOOST_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>
326 because 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
329 first operation is expanded inline.</p>
330 <pre class="literal-block">
331 namespace 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>