OSDN Git Service

82e910023a48110e0cd0285fce23ad9aa5c2274a
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / doc / xml / manual / extensions.xml
1 <?xml version='1.0'?>
2 <!DOCTYPE part PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" 
3  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" 
4 [ ]>
5
6 <part id="manual.ext" xreflabel="Extensions">
7 <?dbhtml filename="extensions.html"?>
8  
9 <partinfo>
10   <keywordset>
11     <keyword>
12       ISO C++
13     </keyword>
14     <keyword>
15       library
16     </keyword>
17   </keywordset>
18 </partinfo>
19
20 <title>
21   Extensions
22   <indexterm><primary>Extensions</primary></indexterm>
23 </title>
24
25 <preface>
26   <title></title>
27 <para>
28   Here we will make an attempt at describing the non-Standard extensions to
29   the library.  Some of these are from SGI's STL, some of these are GNU's,
30   and some just seemed to appear on the doorstep.
31 </para>
32 <para><emphasis>Before</emphasis> you leap in and use any of these
33 extensions, be aware of two things:
34 </para>
35 <orderedlist>
36    <listitem>
37      <para>
38      Non-Standard means exactly that.  
39      </para>
40      <para>
41        The behavior, and the very
42        existence, of these extensions may change with little or no
43        warning.  (Ideally, the really good ones will appear in the next
44        revision of C++.)  Also, other platforms, other compilers, other
45        versions of g++ or libstdc++ may not recognize these names, or
46        treat them differently, or... 
47      </para>
48    </listitem>
49    <listitem>
50      <para>
51        You should know how to access these headers properly. 
52      </para>
53    </listitem>
54 </orderedlist>
55 </preface>
56
57 <!-- Chapter 01 : Compile Time Checks -->
58 <chapter id="manual.ext.compile_checks" xreflabel="Compile Time Checks">
59 <?dbhtml filename="ext_compile_checks.html"?>
60   <title>Compile Time Checks</title>
61   <para>
62     Also known as concept checking.
63   </para>
64    <para>In 1999, SGI added <emphasis>concept checkers</emphasis> to their implementation
65       of the STL:  code which checked the template parameters of
66       instantiated pieces of the STL, in order to insure that the parameters
67       being used met the requirements of the standard.  For example,
68       the Standard requires that types passed as template parameters to
69       <code>vector</code> be <quote>Assignable</quote> (which means what you think
70       it means).  The checking was done during compilation, and none of
71       the code was executed at runtime.
72    </para>
73    <para>Unfortunately, the size of the compiler files grew significantly
74       as a result.  The checking code itself was cumbersome.  And bugs
75       were found in it on more than one occasion.
76    </para>
77    <para>The primary author of the checking code, Jeremy Siek, had already
78       started work on a replacement implementation.  The new code has been
79       formally reviewed and accepted into
80       <ulink url="http://www.boost.org/libs/concept_check/concept_check.htm">the
81       Boost libraries</ulink>, and we are pleased to incorporate it into the
82       GNU C++ library.
83    </para>
84    <para>The new version imposes a much smaller space overhead on the generated
85       object file.  The checks are also cleaner and easier to read and
86       understand.
87    </para>
88    <para>They are off by default for all versions of GCC from 3.0 to 3.4 (the
89       latest release at the time of writing).
90       They can be enabled at configure time with
91       <link linkend="manual.intro.setup.configure"><literal>--enable-concept-checks</literal></link>.
92       You can enable them on a per-translation-unit basis with
93       <code>#define _GLIBCXX_CONCEPT_CHECKS</code> for GCC 3.4 and higher
94       (or with <code>#define _GLIBCPP_CONCEPT_CHECKS</code> for versions
95       3.1, 3.2 and 3.3).
96    </para>
97
98    <para>Please note that the upcoming C++ standard has first-class
99    support for template parameter constraints based on concepts in the core
100    language. This will obviate the need for the library-simulated concept
101    checking described above.
102    </para>
103
104 </chapter>
105
106 <!-- Chapter 02 : Debug Mode -->
107 <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
108             parse="xml" href="debug_mode.xml">
109 </xi:include>
110
111 <!-- Chapter 03 : Parallel Mode -->
112 <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
113             parse="xml" href="parallel_mode.xml">
114 </xi:include>
115
116 <!-- Chapter 04 : Allocators -->
117 <chapter id="manual.ext.allocator" xreflabel="Allocators">
118 <?dbhtml filename="ext_allocators.html"?>
119   <title>Allocators</title>
120
121   <!-- Section 01 : __mt_alloc -->
122   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
123               parse="xml" href="mt_allocator.xml">
124   </xi:include>
125
126   <!-- Section 02 : bitmap_allocator -->
127   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
128               parse="xml" href="bitmap_allocator.xml">
129   </xi:include>
130
131 </chapter>
132
133 <!-- Chapter 05 : Containers -->
134 <chapter id="manual.ext.containers" xreflabel="Containers">
135 <?dbhtml filename="ext_containers.html"?>
136   <title>Containers</title>
137   <para>
138   </para>
139   <sect1 id="manual.ext.containers.pbds" xreflabel="Policy Based Data Structures">
140     <title>Policy Based Data Structures</title>
141     <para>
142       <ulink
143       url="http://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/index.html">More details here</ulink>.
144     </para>
145   </sect1>
146
147   <sect1 id="manual.ext.containers.sgi" xreflabel="SGI ext">
148     <title>HP/SGI</title>
149     <para>
150     </para>
151
152 <para>A few extensions and nods to backwards-compatibility have been made with
153    containers.  Those dealing with older SGI-style allocators are dealt with
154    elsewhere.  The remaining ones all deal with bits:
155 </para>
156 <para>The old pre-standard <code>bit_vector</code> class is present for
157    backwards compatibility.  It is simply a typedef for the
158    <code>vector&lt;bool&gt;</code> specialization.
159 </para>
160 <para>The <code>bitset</code> class has a number of extensions, described in the
161    rest of this item.  First, we'll mention that this implementation of
162    <code>bitset&lt;N&gt;</code> is specialized for cases where N number of
163    bits will fit into a single word of storage.  If your choice of N is
164    within that range (&lt;=32 on i686-pc-linux-gnu, for example), then all
165    of the operations will be faster.
166 </para>
167 <para>There are
168    versions of single-bit test, set, reset, and flip member functions which
169    do no range-checking.  If we call them member functions of an instantiation
170    of &quot;bitset&lt;N&gt;,&quot; then their names and signatures are:
171 </para>
172    <programlisting>
173    bitset&lt;N&gt;&amp;   _Unchecked_set   (size_t pos);
174    bitset&lt;N&gt;&amp;   _Unchecked_set   (size_t pos, int val);
175    bitset&lt;N&gt;&amp;   _Unchecked_reset (size_t pos);
176    bitset&lt;N&gt;&amp;   _Unchecked_flip  (size_t pos);
177    bool         _Unchecked_test  (size_t pos);
178    </programlisting>
179    <para>Note that these may in fact be removed in the future, although we have
180    no present plans to do so (and there doesn't seem to be any immediate
181    reason to).
182 </para>
183 <para>The semantics of member function <code>operator[]</code> are not specified 
184    in the C++ standard.  A long-standing defect report calls for sensible
185    obvious semantics, which are already implemented here:  <code>op[]</code>
186    on a const bitset returns a bool, and for a non-const bitset returns a
187    <code>reference</code> (a nested type).  However, this implementation does
188    no range-checking on the index argument, which is in keeping with other
189    containers' <code>op[]</code> requirements.  The defect report's proposed
190    resolution calls for range-checking to be done.  We'll just wait and see...
191 </para>
192 <para>Finally, two additional searching functions have been added.  They return
193    the index of the first &quot;on&quot; bit, and the index of the first
194    &quot;on&quot; bit that is after <code>prev</code>, respectively:
195 </para>
196    <programlisting>
197    size_t _Find_first() const;
198    size_t _Find_next (size_t prev) const;</programlisting>
199 <para>The same caveat given for the _Unchecked_* functions applies here also.
200 </para>
201   </sect1>
202
203
204   <sect1 id="manual.ext.containers.deprecated_sgi" xreflabel="SGI ext dep">
205     <title>Deprecated HP/SGI</title>
206
207    <para>
208      The SGI hashing classes <classname>hash_set</classname> and
209      <classname>hash_set</classname> have been deprecated by the
210      unordered_set, unordered_multiset, unordered_map,
211      unordered_multimap containers in TR1 and the upcoming C++0x, and
212      may be removed in future releases.
213    </para>
214
215    <para>The SGI headers</para>
216    <programlisting>
217      &lt;hash_map&gt;
218      &lt;hash_set&gt;
219      &lt;rope&gt;
220      &lt;slist&gt;
221      &lt;rb_tree&gt;
222    </programlisting>
223    <para>are all here;
224       <code>&lt;hash_map&gt;</code> and <code>&lt;hash_set&gt;</code>
225       are deprecated but available as backwards-compatible extensions,
226       as discussed further below.  <code>&lt;rope&gt;</code> is the
227       SGI specialization for large strings (&quot;rope,&quot;
228       &quot;large strings,&quot; get it? Love that geeky humor.)
229       <code>&lt;slist&gt;</code> is a singly-linked list, for when the
230       doubly-linked <code>list&lt;&gt;</code> is too much space
231       overhead, and <code>&lt;rb_tree&gt;</code> exposes the red-black
232       tree classes used in the implementation of the standard maps and
233       sets.
234    </para>
235    <para>Each of the associative containers map, multimap, set, and multiset
236       have a counterpart which uses a
237       <ulink url="http://www.sgi.com/tech/stl/HashFunction.html">hashing
238       function</ulink> to do the arranging, instead of a strict weak ordering
239       function.  The classes take as one of their template parameters a
240       function object that will return the hash value; by default, an
241       instantiation of
242       <ulink url="http://www.sgi.com/tech/stl/hash.html">hash</ulink>.
243       You should specialize this functor for your class, or define your own,
244       before trying to use one of the hashing classes.
245    </para>
246    <para>The hashing classes support all the usual associative container
247       functions, as well as some extra constructors specifying the number
248       of buckets, etc.
249    </para>
250    <para>Why would you want to use a hashing class instead of the
251       <quote>normal</quote>implementations?  Matt Austern writes:
252    </para>
253    <blockquote>
254      <para>
255        <emphasis>[W]ith a well chosen hash function, hash tables
256        generally provide much better average-case performance than
257        binary search trees, and much worse worst-case performance.  So
258        if your implementation has hash_map, if you don't mind using
259        nonstandard components, and if you aren't scared about the
260        possibility of pathological cases, you'll probably get better
261        performance from hash_map.
262      </emphasis>
263      </para>
264    </blockquote>
265
266   </sect1>  
267 </chapter>
268
269 <!-- Chapter 06 : Utilities -->
270 <chapter id="manual.ext.util" xreflabel="Utilities">
271 <?dbhtml filename="ext_utilities.html"?>
272   <title>Utilities</title>
273   <para>
274     The &lt;functional&gt; header contains many additional functors
275     and helper functions, extending section 20.3.  They are
276     implemented in the file stl_function.h:
277   </para>
278   <itemizedlist>
279   <listitem>
280   <para><code>identity_element</code> for addition and multiplication. * 
281   </para>
282   </listitem>
283   <listitem>
284     <para>The functor <code>identity</code>, whose <code>operator()</code>
285       returns the argument unchanged. * 
286   </para>
287   </listitem>
288   <listitem>
289     <para>Composition functors <code>unary_function</code> and
290       <code>binary_function</code>, and their helpers <code>compose1</code>
291       and <code>compose2</code>. * 
292     </para>
293   </listitem>
294   <listitem>
295   <para><code>select1st</code> and <code>select2nd</code>, to strip pairs. * 
296   </para>
297   </listitem>
298   <listitem><para><code>project1st</code> and <code>project2nd</code>. * </para></listitem>
299   <listitem><para>A set of functors/functions which always return the same result.  They
300       are <code>constant_void_fun</code>, <code>constant_binary_fun</code>,
301       <code>constant_unary_fun</code>, <code>constant0</code>,
302       <code>constant1</code>, and <code>constant2</code>. * </para></listitem>
303   <listitem><para>The class <code>subtractive_rng</code>. * </para></listitem>
304   <listitem><para>mem_fun adaptor helpers <code>mem_fun1</code> and
305       <code>mem_fun1_ref</code> are provided for backwards compatibility. </para></listitem>
306 </itemizedlist>
307 <para>
308   20.4.1 can use several different allocators; they are described on the
309    main extensions page.
310 </para>
311 <para>
312   20.4.3 is extended with a special version of
313   <code>get_temporary_buffer</code> taking a second argument.  The
314   argument is a pointer, which is ignored, but can be used to specify
315   the template type (instead of using explicit function template
316   arguments like the standard version does).  That is, in addition to
317 </para>
318 <programlisting>
319 get_temporary_buffer&lt;int&gt;(5);
320 </programlisting>
321
322 <para>
323 you can also use
324 </para>
325
326 <programlisting>
327 get_temporary_buffer(5, (int*)0);
328 </programlisting>
329 <para>
330   A class <code>temporary_buffer</code> is given in stl_tempbuf.h. *
331 </para>
332 <para>
333   The specialized algorithms of section 20.4.4 are extended with
334   <code>uninitialized_copy_n</code>. *
335 </para>
336
337 </chapter>
338
339 <!-- Chapter 07 : Algorithms -->
340 <chapter id="manual.ext.algorithms" xreflabel="Algorithms">
341 <?dbhtml filename="ext_algorithms.html"?>
342   <title>Algorithms</title>
343 <para>25.1.6 (count, count_if) is extended with two more versions of count
344    and count_if.  The standard versions return their results.  The
345    additional signatures return void, but take a final parameter by
346    reference to which they assign their results, e.g.,
347 </para>
348    <programlisting>
349    void count (first, last, value, n);</programlisting>
350 <para>25.2 (mutating algorithms) is extended with two families of signatures,
351    random_sample and random_sample_n.
352 </para>
353 <para>25.2.1 (copy) is extended with
354 </para>
355    <programlisting>
356    copy_n (_InputIter first, _Size count, _OutputIter result);</programlisting>
357 <para>which copies the first 'count' elements at 'first' into 'result'.
358 </para>
359 <para>25.3 (sorting 'n' heaps 'n' stuff) is extended with some helper
360    predicates.  Look in the doxygen-generated pages for notes on these.
361 </para>
362    <itemizedlist>
363     <listitem><para><code>is_heap</code> tests whether or not a range is a heap.</para></listitem>
364     <listitem><para><code>is_sorted</code> tests whether or not a range is sorted in
365         nondescending order.</para></listitem>
366    </itemizedlist>
367 <para>25.3.8 (lexicographical_compare) is extended with
368 </para>
369    <programlisting>
370    lexicographical_compare_3way(_InputIter1 first1, _InputIter1 last1,
371                                  _InputIter2 first2, _InputIter2 last2)</programlisting>
372 <para>which does... what?
373 </para>
374
375 </chapter>
376
377 <!-- Chapter 08 : Numerics -->
378 <chapter id="manual.ext.numerics" xreflabel="Numerics">
379 <?dbhtml filename="ext_numerics.html"?>
380   <title>Numerics</title>
381 <para>26.4, the generalized numeric operations such as accumulate, are extended
382    with the following functions:
383 </para>
384    <programlisting>
385    power (x, n);
386    power (x, n, moniod_operation);</programlisting>
387 <para>Returns, in FORTRAN syntax, &quot;x ** n&quot; where n&gt;=0.  In the
388    case of n == 0, returns the identity element for the
389    monoid operation.  The two-argument signature uses multiplication (for
390    a true &quot;power&quot; implementation), but addition is supported as well.
391    The operation functor must be associative.
392 </para>
393 <para>The <code>iota</code> function wins the award for Extension With the
394    Coolest Name.  It &quot;assigns sequentially increasing values to a range.
395    That is, it assigns value to *first, value + 1 to *(first + 1) and so
396    on.&quot;  Quoted from SGI documentation.
397 </para>
398    <programlisting>
399    void iota(_ForwardIter first, _ForwardIter last, _Tp value);</programlisting>
400 </chapter>
401
402 <!-- Chapter 09 : Iterators -->
403 <chapter id="manual.ext.iterators" xreflabel="Iterators">
404 <?dbhtml filename="ext_iterators.html"?>
405   <title>Iterators</title>
406 <para>24.3.2 describes <code>struct iterator</code>, which didn't exist in the
407    original HP STL implementation (the language wasn't rich enough at the
408    time).  For backwards compatibility, base classes are provided which
409    declare the same nested typedefs:
410 </para>
411    <itemizedlist>
412     <listitem><para>input_iterator</para></listitem>
413     <listitem><para>output_iterator</para></listitem>
414     <listitem><para>forward_iterator</para></listitem>
415     <listitem><para>bidirectional_iterator</para></listitem>
416     <listitem><para>random_access_iterator</para></listitem>
417    </itemizedlist>
418 <para>24.3.4 describes iterator operation <code>distance</code>, which takes
419    two iterators and returns a result.  It is extended by another signature
420    which takes two iterators and a reference to a result.  The result is
421    modified, and the function returns nothing.
422 </para>
423
424 </chapter>
425
426 <!-- Chapter 08 : IO -->
427 <chapter id="manual.ext.io" xreflabel="IO">
428 <?dbhtml filename="ext_io.html"?>
429   <title>Input and Output</title>
430
431   <para>
432     Extensions allowing <code>filebuf</code>s to be constructed from
433     "C" types like  FILE*s and file descriptors.
434   </para>
435
436   <sect1 id="manual.ext.io.filebuf_derived" xreflabel="Derived filebufs">
437     <title>Derived filebufs</title>
438
439    <para>The v2 library included non-standard extensions to construct
440       <code>std::filebuf</code>s from C stdio types such as
441       <code>FILE*</code>s and POSIX file descriptors.
442       Today the recommended way to use stdio types with libstdc++
443       IOStreams is via the <code>stdio_filebuf</code> class (see below),
444       but earlier releases provided slightly different mechanisms.
445    </para>
446    <itemizedlist>
447      <listitem><para>3.0.x <code>filebuf</code>s have another ctor with this signature:
448         <code>basic_filebuf(__c_file_type*, ios_base::openmode, int_type);
449         </code>
450          This comes in very handy in a number of places, such as
451          attaching Unix sockets, pipes, and anything else which uses file
452          descriptors, into the IOStream buffering classes.  The three
453          arguments are as follows:
454          <itemizedlist>
455           <listitem><para><code>__c_file_type*      F   </code>
456               // the __c_file_type typedef usually boils down to stdio's FILE
457           </para></listitem>
458           <listitem><para><code>ios_base::openmode  M   </code>
459               // same as all the other uses of openmode
460           </para></listitem>
461           <listitem><para><code>int_type            B   </code>
462               // buffer size, defaults to BUFSIZ if not specified
463           </para></listitem>
464          </itemizedlist>
465          For those wanting to use file descriptors instead of FILE*'s, I
466          invite you to contemplate the mysteries of C's <code>fdopen()</code>.
467      </para></listitem>
468      <listitem><para>In library snapshot 3.0.95 and later, <code>filebuf</code>s bring
469          back an old extension:  the <code>fd()</code> member function.  The
470          integer returned from this function can be used for whatever file
471          descriptors can be used for on your platform.  Naturally, the
472          library cannot track what you do on your own with a file descriptor,
473          so if you perform any I/O directly, don't expect the library to be
474          aware of it.
475      </para></listitem>
476      <listitem><para>Beginning with 3.1, the extra <code>filebuf</code> constructor and
477          the <code>fd()</code> function were removed from the standard
478          filebuf.  Instead, <code>&lt;ext/stdio_filebuf.h&gt;</code> contains
479          a derived class called
480          <ulink url="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00063.html"><code>__gnu_cxx::stdio_filebuf</code></ulink>.
481          This class can be constructed from a C <code>FILE*</code> or a file
482          descriptor, and provides the <code>fd()</code> function.
483      </para></listitem>
484    </itemizedlist>
485    <para>If you want to access a <code>filebuf</code>'s file descriptor to
486       implement file locking (e.g. using the <code>fcntl()</code> system
487       call) then you might be interested in Henry Suter's RWLock class.
488       <!-- url="http://suter.home.cern.ch/suter/RWLock.html" -->
489    </para>
490
491     <para>
492     </para>
493   </sect1>
494 </chapter>
495
496 <!-- Chapter 09 : Demangling -->
497 <chapter id="manual.ext.demangle" xreflabel="Demangling">
498 <?dbhtml filename="ext_demangling.html"?>
499   <title>Demangling</title>
500   <para>
501     Transforming C++ ABI identifiers (like RTTI symbols) into the
502     original C++ source identifiers is called
503     <quote>demangling.</quote>
504   </para>
505   <para>
506     If you have read the <ulink
507     url="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaceabi.html">source
508     documentation for <code>namespace abi</code></ulink> then you are
509     aware of the cross-vendor C++ ABI in use by GCC.  One of the
510     exposed functions is used for demangling,
511     <code>abi::__cxa_demangle</code>.
512   </para>
513   <para>
514     In programs like <command>c++filt</command>, the linker, and other tools
515     have the ability to decode C++ ABI names, and now so can you.
516   </para>
517   <para>
518     (The function itself might use different demanglers, but that's the
519     whole point of abstract interfaces.  If we change the implementation,
520     you won't notice.)
521   </para>
522   <para>
523     Probably the only times you'll be interested in demangling at runtime
524     are when you're seeing <code>typeid</code> strings in RTTI, or when
525     you're handling the runtime-support exception classes.  For example:
526   </para>
527    <programlisting>
528 #include &lt;exception&gt;
529 #include &lt;iostream&gt;
530 #include &lt;cxxabi.h&gt;
531
532 struct empty { };
533
534 template &lt;typename T, int N&gt;
535   struct bar { };
536
537
538 int main()
539 {
540   int     status;
541   char   *realname;
542
543   // exception classes not in &lt;stdexcept&gt;, thrown by the implementation
544   // instead of the user
545   std::bad_exception  e;
546   realname = abi::__cxa_demangle(e.what(), 0, 0, &amp;status);
547   std::cout &lt;&lt; e.what() &lt;&lt; "\t=&gt; " &lt;&lt; realname &lt;&lt; "\t: " &lt;&lt; status &lt;&lt; '\n';
548   free(realname);
549
550
551   // typeid
552   bar&lt;empty,17&gt;          u;
553   const std::type_info  &amp;ti = typeid(u);
554
555   realname = abi::__cxa_demangle(ti.name(), 0, 0, &amp;status);
556   std::cout &lt;&lt; ti.name() &lt;&lt; "\t=&gt; " &lt;&lt; realname &lt;&lt; "\t: " &lt;&lt; status &lt;&lt; '\n';
557   free(realname);
558
559   return 0;
560 }
561    </programlisting>
562    <para>
563      This prints
564    </para>
565
566    <screen>
567    <computeroutput>
568       St13bad_exception       =&gt; std::bad_exception   : 0
569       3barI5emptyLi17EE       =&gt; bar&lt;empty, 17&gt;       : 0 
570    </computeroutput>
571    </screen>
572
573    <para>
574      The demangler interface is described in the source documentation
575      linked to above.  It is actually written in C, so you don't need to
576      be writing C++ in order to demangle C++.  (That also means we have to
577      use crummy memory management facilities, so don't forget to free()
578      the returned char array.)
579    </para>
580 </chapter>
581
582 <!-- Chapter 10 : Concurrency -->
583 <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
584             parse="xml" href="concurrency.xml">
585 </xi:include>
586
587 </part>