]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/ptr_container/doc/indirect_fun.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / ptr_container / doc / indirect_fun.html
CommitLineData
7c673cae
FG
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>