* doc/xml/faq.xml (faq): Refer to clauses instead of chapters.
[official-gcc.git] / libstdc++-v3 / doc / xml / manual / appendix_contributing.xml
blobbd7dfc7064a6a6952a7e46b94bd08f8b193576ca
1 <appendix xmlns="http://docbook.org/ns/docbook" version="5.0" 
2           xml:id="appendix.contrib" xreflabel="Contributing">
3 <?dbhtml filename="appendix_contributing.html"?>
5 <info><title>
6   Contributing
7   <indexterm>
8     <primary>Appendix</primary>
9     <secondary>Contributing</secondary>
10   </indexterm>
11 </title>
12   <keywordset>
13     <keyword>ISO C++</keyword>
14     <keyword>library</keyword>
15   </keywordset>
16 </info>
20 <para>
21   The GNU C++ Library is part of GCC and follows the same development model,
22   so the general rules for
23   <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/contribute.html">contributing
24   to GCC</link> apply. Active
25   contributors are assigned maintainership responsibility, and given
26   write access to the source repository. First-time contributors
27   should follow this procedure:
28 </para>
30 <section xml:id="contrib.list" xreflabel="Contributor Checklist"><info><title>Contributor Checklist</title></info>
31   
33   <section xml:id="list.reading"><info><title>Reading</title></info>
34     
36     <itemizedlist>
37       <listitem>
38         <para>
39           Get and read the relevant sections of the C++ language
40           specification. Copies of the full ISO 14882 standard are
41           available on line via the ISO mirror site for committee
42           members. Non-members, or those who have not paid for the
43           privilege of sitting on the committee and sustained their
44           two meeting commitment for voting rights, may get a copy of
45           the standard from their respective national standards
46           organization. In the USA, this national standards
47           organization is
48           <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ansi.org">ANSI</link>.
49           (And if you've already registered with them you can
50           <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2fISO%2fIEC+14882-2012">buy the standard on-line</link>.)
51         </para>
52       </listitem>
54       <listitem>
55         <para>
56           The library working group bugs, and known defects, can
57           be obtained here:
58           <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/jtc1/sc22/wg21</link>
59         </para>
60       </listitem>
62       <listitem>
63         <para>
64           Peruse
65           the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.gnu.org/prep/standards/">GNU
66           Coding Standards</link>, and chuckle when you hit the part
67           about <quote>Using Languages Other Than C</quote>.
68         </para>
69       </listitem>
71       <listitem>
72         <para>
73           Be familiar with the extensions that preceded these
74           general GNU rules. These style issues for libstdc++ can be
75           found in <link linkend="contrib.coding_style">Coding Style</link>.
76       </para>
77       </listitem>
79       <listitem>
80         <para>
81           And last but certainly not least, read the
82           library-specific information found in
83           <link linkend="appendix.porting">Porting and Maintenance</link>.
84       </para>
85       </listitem>
86     </itemizedlist>
88   </section>
89   <section xml:id="list.copyright"><info><title>Assignment</title></info>
90     
91     <para>
92       See the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/contribute.html#legal">legal prerequisites</link> for all GCC contributions.
93     </para>
95     <para>
96       Historically, the libstdc++ assignment form added the following
97       question:
98     </para>
100     <para>
101       <quote>
102         Which Belgian comic book character is better, Tintin or Asterix, and
103         why?
104       </quote>
105     </para>
107     <para>
108       While not strictly necessary, humoring the maintainers and answering
109       this question would be appreciated.
110     </para>
112     <para>
113       Please contact Benjamin Kosnik at
114       <email>bkoz+assign@redhat.com</email> if you are confused
115       about the assignment or have general licensing questions. When
116       requesting an assignment form from
117       <email>mailto:assign@gnu.org</email>, please cc the libstdc++
118       maintainer above so that progress can be monitored.
119     </para>
120   </section>
122   <section xml:id="list.getting"><info><title>Getting Sources</title></info>
123     
124     <para>
125       <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/svnwrite.html">Getting write access
126         (look for "Write after approval")</link>
127     </para>
128   </section>
130   <section xml:id="list.patches"><info><title>Submitting Patches</title></info>
131     
133     <para>
134       Every patch must have several pieces of information before it can be
135       properly evaluated. Ideally (and to ensure the fastest possible
136       response from the maintainers) it would have all of these pieces:
137     </para>
139     <itemizedlist>
140       <listitem>
141         <para>
142           A description of the bug and how your patch fixes this
143           bug. For new features a description of the feature and your
144           implementation.
145         </para>
146       </listitem>
148       <listitem>
149         <para>
150           A ChangeLog entry as plain text; see the various
151           ChangeLog files for format and content. If you are
152           using emacs as your editor, simply position the insertion
153           point at the beginning of your change and hit CX-4a to bring
154           up the appropriate ChangeLog entry. See--magic! Similar
155           functionality also exists for vi.
156         </para>
157       </listitem>
159       <listitem>
160         <para>
161           A testsuite submission or sample program that will
162           easily and simply show the existing error or test new
163           functionality.
164         </para>
165       </listitem>
167       <listitem>
168         <para>
169           The patch itself. If you are accessing the SVN
170           repository use <command>svn update; svn diff NEW</command>;
171           else, use <command>diff -cp OLD NEW</command> ... If your
172           version of diff does not support these options, then get the
173           latest version of GNU
174           diff. The <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/wiki/SvnTricks">SVN
175           Tricks</link> wiki page has information on customising the
176           output of <code>svn diff</code>.
177         </para>
178       </listitem>
180       <listitem>
181         <para>
182           When you have all these pieces, bundle them up in a
183           mail message and send it to libstdc++@gcc.gnu.org. All
184           patches and related discussion should be sent to the
185           libstdc++ mailing list.
186         </para>
187       </listitem>
188     </itemizedlist>
190   </section>
192 </section>
194 <section xml:id="contrib.organization" xreflabel="Source Organization"><info><title>Directory Layout and Source Conventions</title></info>
195   <?dbhtml filename="source_organization.html"?>
196   
198   <para>
199     The unpacked source directory of libstdc++ contains the files
200     needed to create the GNU C++ Library.
201   </para>
203   <literallayout class="normal">
204 It has subdirectories:
206   doc
207     Files in HTML and text format that document usage, quirks of the
208     implementation, and contributor checklists.
210   include
211     All header files for the C++ library are within this directory,
212     modulo specific runtime-related files that are in the libsupc++
213     directory.
215     include/std
216       Files meant to be found by #include &lt;name&gt; directives in
217       standard-conforming user programs.
219     include/c
220       Headers intended to directly include standard C headers.
221       [NB: this can be enabled via --enable-cheaders=c]
223     include/c_global
224       Headers intended to include standard C headers in
225       the global namespace, and put select names into the std::
226       namespace.  [NB: this is the default, and is the same as
227       --enable-cheaders=c_global]
229     include/c_std
230       Headers intended to include standard C headers
231       already in namespace std, and put select names into the std::
232       namespace.  [NB: this is the same as --enable-cheaders=c_std]
234     include/bits
235       Files included by standard headers and by other files in
236       the bits directory.
238     include/backward
239       Headers provided for backward compatibility, such as &lt;iostream.h&gt;.
240       They are not used in this library.
242     include/ext
243       Headers that define extensions to the standard library.  No
244       standard header refers to any of them.
246   scripts
247     Scripts that are used during the configure, build, make, or test
248     process.
250   src
251     Files that are used in constructing the library, but are not
252     installed.
254   testsuites/[backward, demangle, ext, performance, thread, 17_* to 30_*]
255     Test programs are here, and may be used to begin to exercise the
256     library.  Support for "make check" and "make check-install" is
257     complete, and runs through all the subdirectories here when this
258     command is issued from the build directory.  Please note that
259     "make check" requires DejaGNU 1.4 or later to be installed.  Please
260     note that "make check-script" calls the script mkcheck, which
261     requires bash, and which may need the paths to bash adjusted to
262     work properly, as /bin/bash is assumed.
264 Other subdirectories contain variant versions of certain files
265 that are meant to be copied or linked by the configure script.
266 Currently these are:
268   config/abi
269   config/cpu
270   config/io
271   config/locale
272   config/os
274 In addition, a subdirectory holds the convenience library libsupc++.
276   libsupc++
277     Contains the runtime library for C++, including exception
278     handling and memory allocation and deallocation, RTTI, terminate
279     handlers, etc.
281 Note that glibc also has a bits/ subdirectory.  We will either
282 need to be careful not to collide with names in its bits/
283 directory; or rename bits to (e.g.) cppbits/.
285 In files throughout the system, lines marked with an "XXX" indicate
286 a bug or incompletely-implemented feature.  Lines marked "XXX MT"
287 indicate a place that may require attention for multi-thread safety.
288   </literallayout>
290 </section>
292 <section xml:id="contrib.coding_style" xreflabel="Coding Style"><info><title>Coding Style</title></info>
293   <?dbhtml filename="source_code_style.html"?>
294   
295   <para>
296   </para>
297   <section xml:id="coding_style.bad_identifiers"><info><title>Bad Identifiers</title></info>
298     
299     <para>
300       Identifiers that conflict and should be avoided.
301     </para>
303     <literallayout class="normal">
304       This is the list of names <quote>reserved to the
305       implementation</quote> that have been claimed by certain
306       compilers and system headers of interest, and should not be used
307       in the library. It will grow, of course.  We generally are
308       interested in names that are not all-caps, except for those like
309       "_T"
311       For Solaris:
312       _B
313       _C
314       _L
315       _N
316       _P
317       _S
318       _U
319       _X
320       _E1
321       ..
322       _E24
324       Irix adds:
325       _A
326       _G
328       MS adds:
329       _T
331       BSD adds:
332       __used
333       __unused
334       __inline
335       _Complex
336       __istype
337       __maskrune
338       __tolower
339       __toupper
340       __wchar_t
341       __wint_t
342       _res
343       _res_ext
344       __tg_*
346       SPU adds:
347       __ea
349       For GCC:
351       [Note that this list is out of date. It applies to the old
352       name-mangling; in G++ 3.0 and higher a different name-mangling is
353       used. In addition, many of the bugs relating to G++ interpreting
354       these names as operators have been fixed.]
356       The full set of __* identifiers (combined from gcc/cp/lex.c and
357       gcc/cplus-dem.c) that are either old or new, but are definitely
358       recognized by the demangler, is:
360       __aa
361       __aad
362       __ad
363       __addr
364       __adv
365       __aer
366       __als
367       __alshift
368       __amd
369       __ami
370       __aml
371       __amu
372       __aor
373       __apl
374       __array
375       __ars
376       __arshift
377       __as
378       __bit_and
379       __bit_ior
380       __bit_not
381       __bit_xor
382       __call
383       __cl
384       __cm
385       __cn
386       __co
387       __component
388       __compound
389       __cond
390       __convert
391       __delete
392       __dl
393       __dv
394       __eq
395       __er
396       __ge
397       __gt
398       __indirect
399       __le
400       __ls
401       __lt
402       __max
403       __md
404       __method_call
405       __mi
406       __min
407       __minus
408       __ml
409       __mm
410       __mn
411       __mult
412       __mx
413       __ne
414       __negate
415       __new
416       __nop
417       __nt
418       __nw
419       __oo
420       __op
421       __or
422       __pl
423       __plus
424       __postdecrement
425       __postincrement
426       __pp
427       __pt
428       __rf
429       __rm
430       __rs
431       __sz
432       __trunc_div
433       __trunc_mod
434       __truth_andif
435       __truth_not
436       __truth_orif
437       __vc
438       __vd
439       __vn
441       SGI badnames:
442       __builtin_alloca
443       __builtin_fsqrt
444       __builtin_sqrt
445       __builtin_fabs
446       __builtin_dabs
447       __builtin_cast_f2i
448       __builtin_cast_i2f
449       __builtin_cast_d2ll
450       __builtin_cast_ll2d
451       __builtin_copy_dhi2i
452       __builtin_copy_i2dhi
453       __builtin_copy_dlo2i
454       __builtin_copy_i2dlo
455       __add_and_fetch
456       __sub_and_fetch
457       __or_and_fetch
458       __xor_and_fetch
459       __and_and_fetch
460       __nand_and_fetch
461       __mpy_and_fetch
462       __min_and_fetch
463       __max_and_fetch
464       __fetch_and_add
465       __fetch_and_sub
466       __fetch_and_or
467       __fetch_and_xor
468       __fetch_and_and
469       __fetch_and_nand
470       __fetch_and_mpy
471       __fetch_and_min
472       __fetch_and_max
473       __lock_test_and_set
474       __lock_release
475       __lock_acquire
476       __compare_and_swap
477       __synchronize
478       __high_multiply
479       __unix
480       __sgi
481       __linux__
482       __i386__
483       __i486__
484       __cplusplus
485       __embedded_cplusplus
486       // long double conversion members mangled as __opr
487       // http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00060.html
488       __opr
489     </literallayout>
490   </section>
492   <section xml:id="coding_style.example"><info><title>By Example</title></info>
493     
494     <literallayout class="normal">
495       This library is written to appropriate C++ coding standards. As such,
496       it is intended to precede the recommendations of the GNU Coding
497       Standard, which can be referenced in full here:
499       <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.gnu.org/prep/standards/standards.html#Formatting">http://www.gnu.org/prep/standards/standards.html#Formatting</link>
501       The rest of this is also interesting reading, but skip the "Design
502       Advice" part.
504       The GCC coding conventions are here, and are also useful:
505       <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/codingconventions.html">http://gcc.gnu.org/codingconventions.html</link>
507       In addition, because it doesn't seem to be stated explicitly anywhere
508       else, there is an 80 column source limit.
510       <filename>ChangeLog</filename> entries for member functions should use the
511       classname::member function name syntax as follows:
513 <code>
514 1999-04-15  Dennis Ritchie  &lt;dr@att.com&gt;
516       * src/basic_file.cc (__basic_file::open): Fix thinko in
517       _G_HAVE_IO_FILE_OPEN bits.
518 </code>
520       Notable areas of divergence from what may be previous local practice
521       (particularly for GNU C) include:
523       01. Pointers and references
524       <code>
525         char* p = "flop";
526         char&amp; c = *p;
527           -NOT-
528         char *p = "flop";  // wrong
529         char &amp;c = *p;      // wrong
530       </code>
532       Reason: In C++, definitions are mixed with executable code. Here,
533       <code>p</code> is being initialized, not <code>*p</code>.  This is near-universal
534       practice among C++ programmers; it is normal for C hackers
535       to switch spontaneously as they gain experience.
537       02. Operator names and parentheses
538       <code>
539         operator==(type)
540           -NOT-
541         operator == (type)  // wrong
542       </code>
544       Reason: The <code>==</code> is part of the function name. Separating
545       it makes the declaration look like an expression.
547       03. Function names and parentheses
548       <code>
549         void mangle()
550           -NOT-
551         void mangle ()  // wrong
552       </code>
554       Reason: no space before parentheses (except after a control-flow
555       keyword) is near-universal practice for C++. It identifies the
556       parentheses as the function-call operator or declarator, as
557       opposed to an expression or other overloaded use of parentheses.
559       04. Template function indentation
560       <code>
561         template&lt;typename T&gt;
562           void
563           template_function(args)
564           { }
565           -NOT-
566         template&lt;class T&gt;
567         void template_function(args) {};
568       </code>
570       Reason: In class definitions, without indentation whitespace is
571       needed both above and below the declaration to distinguish
572       it visually from other members. (Also, re: "typename"
573       rather than "class".)  <code>T</code> often could be <code>int</code>, which is
574       not a class. ("class", here, is an anachronism.)
576       05. Template class indentation
577       <code>
578         template&lt;typename _CharT, typename _Traits&gt;
579           class basic_ios : public ios_base
580           {
581           public:
582             // Types:
583           };
584           -NOT-
585         template&lt;class _CharT, class _Traits&gt;
586         class basic_ios : public ios_base
587           {
588           public:
589             // Types:
590           };
591           -NOT-
592         template&lt;class _CharT, class _Traits&gt;
593           class basic_ios : public ios_base
594         {
595           public:
596             // Types:
597         };
598       </code>
600       06. Enumerators
601       <code>
602         enum
603         {
604           space = _ISspace,
605           print = _ISprint,
606           cntrl = _IScntrl
607         };
608           -NOT-
609         enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl };
610       </code>
612       07. Member initialization lists
613       All one line, separate from class name.
615       <code>
616         gribble::gribble()
617         : _M_private_data(0), _M_more_stuff(0), _M_helper(0)
618         { }
619           -NOT-
620         gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0)
621         { }
622       </code>
624       08. Try/Catch blocks
625       <code>
626         try
627           {
628             //
629           }
630         catch (...)
631           {
632             //
633           }
634           -NOT-
635         try {
636           //
637         } catch(...) {
638           //
639         }
640       </code>
642       09. Member functions declarations and definitions
643       Keywords such as extern, static, export, explicit, inline, etc
644       go on the line above the function name. Thus
646       <code>
647       virtual int
648       foo()
649       -NOT-
650       virtual int foo()
651       </code>
653       Reason: GNU coding conventions dictate return types for functions
654       are on a separate line than the function name and parameter list
655       for definitions. For C++, where we have member functions that can
656       be either inline definitions or declarations, keeping to this
657       standard allows all member function names for a given class to be
658       aligned to the same margin, increasing readability.
661       10. Invocation of member functions with "this-&gt;"
662       For non-uglified names, use <code>this-&gt;name</code> to call the function.
664       <code>
665       this-&gt;sync()
666       -NOT-
667       sync()
668       </code>
670       Reason: Koenig lookup.
672       11. Namespaces
673       <code>
674       namespace std
675       {
676         blah blah blah;
677       } // namespace std
679       -NOT-
681       namespace std {
682         blah blah blah;
683       } // namespace std
684       </code>
686       12. Spacing under protected and private in class declarations:
687       space above, none below
688       i.e.
690       <code>
691       public:
692         int foo;
694       -NOT-
695       public:
697         int foo;
698       </code>
700       13. Spacing WRT return statements.
701       no extra spacing before returns, no parenthesis
702       i.e.
704       <code>
705       }
706       return __ret;
708       -NOT-
709       }
711       return __ret;
713       -NOT-
715       }
716       return (__ret);
717       </code>
720       14. Location of global variables.
721       All global variables of class type, whether in the "user visible"
722       space (e.g., <code>cin</code>) or the implementation namespace, must be defined
723       as a character array with the appropriate alignment and then later
724       re-initialized to the correct value.
726       This is due to startup issues on certain platforms, such as AIX.
727       For more explanation and examples, see <filename>src/globals.cc</filename>. All such
728       variables should be contained in that file, for simplicity.
730       15. Exception abstractions
731       Use the exception abstractions found in <filename class="headerfile">functexcept.h</filename>, which allow
732       C++ programmers to use this library with <literal>-fno-exceptions</literal>.  (Even if
733       that is rarely advisable, it's a necessary evil for backwards
734       compatibility.)
736       16. Exception error messages
737       All start with the name of the function where the exception is
738       thrown, and then (optional) descriptive text is added. Example:
740       <code>
741       __throw_logic_error(__N("basic_string::_S_construct NULL not valid"));
742       </code>
744       Reason: The verbose terminate handler prints out <code>exception::what()</code>,
745       as well as the typeinfo for the thrown exception. As this is the
746       default terminate handler, by putting location info into the
747       exception string, a very useful error message is printed out for
748       uncaught exceptions. So useful, in fact, that non-programmers can
749       give useful error messages, and programmers can intelligently
750       speculate what went wrong without even using a debugger.
752       17. The doxygen style guide to comments is a separate document,
753       see index.
755       The library currently has a mixture of GNU-C and modern C++ coding
756       styles. The GNU C usages will be combed out gradually.
758       Name patterns:
760       For nonstandard names appearing in Standard headers, we are constrained
761       to use names that begin with underscores. This is called "uglification".
762       The convention is:
764       Local and argument names:  <literal>__[a-z].*</literal>
766       Examples:  <code>__count  __ix  __s1</code>
768       Type names and template formal-argument names: <literal>_[A-Z][^_].*</literal>
770       Examples:  <code>_Helper  _CharT  _N</code>
772       Member data and function names: <literal>_M_.*</literal>
774       Examples:  <code>_M_num_elements  _M_initialize ()</code>
776       Static data members, constants, and enumerations: <literal>_S_.*</literal>
778       Examples: <code>_S_max_elements  _S_default_value</code>
780       Don't use names in the same scope that differ only in the prefix,
781       e.g. _S_top and _M_top. See BADNAMES for a list of forbidden names.
782       (The most tempting of these seem to be and "_T" and "__sz".)
784       Names must never have "__" internally; it would confuse name
785       unmanglers on some targets. Also, never use "__[0-9]", same reason.
787       --------------------------
789       [BY EXAMPLE]
790       <code>
792       #ifndef  _HEADER_
793       #define  _HEADER_ 1
795       namespace std
796       {
797         class gribble
798         {
799         public:
800           gribble() throw();
802           gribble(const gribble&amp;);
804           explicit
805           gribble(int __howmany);
807           gribble&amp;
808           operator=(const gribble&amp;);
810           virtual
811           ~gribble() throw ();
813           // Start with a capital letter, end with a period.
814           inline void
815           public_member(const char* __arg) const;
817           // In-class function definitions should be restricted to one-liners.
818           int
819           one_line() { return 0 }
821           int
822           two_lines(const char* arg)
823           { return strchr(arg, 'a'); }
825           inline int
826           three_lines();  // inline, but defined below.
828           // Note indentation.
829           template&lt;typename _Formal_argument&gt;
830             void
831             public_template() const throw();
833           template&lt;typename _Iterator&gt;
834             void
835             other_template();
837         private:
838           class _Helper;
840           int _M_private_data;
841           int _M_more_stuff;
842           _Helper* _M_helper;
843           int _M_private_function();
845           enum _Enum
846             {
847               _S_one,
848               _S_two
849             };
851           static void
852           _S_initialize_library();
853         };
855         // More-or-less-standard language features described by lack, not presence.
856       # ifndef _G_NO_LONGLONG
857         extern long long _G_global_with_a_good_long_name;  // avoid globals!
858       # endif
860         // Avoid in-class inline definitions, define separately;
861         // likewise for member class definitions:
862         inline int
863         gribble::public_member() const
864         { int __local = 0; return __local; }
866         class gribble::_Helper
867         {
868           int _M_stuff;
870           friend class gribble;
871         };
872       }
874       // Names beginning with "__": only for arguments and
875       //   local variables; never use "__" in a type name, or
876       //   within any name; never use "__[0-9]".
878       #endif /* _HEADER_ */
881       namespace std
882       {
883         template&lt;typename T&gt;  // notice: "typename", not "class", no space
884           long_return_value_type&lt;with_many, args&gt;
885           function_name(char* pointer,               // "char *pointer" is wrong.
886                         char* argument,
887                         const Reference&amp; ref)
888           {
889             // int a_local;  /* wrong; see below. */
890             if (test)
891             {
892               nested code
893             }
895             int a_local = 0;  // declare variable at first use.
897             //  char a, b, *p;   /* wrong */
898             char a = 'a';
899             char b = a + 1;
900             char* c = "abc";  // each variable goes on its own line, always.
902             // except maybe here...
903             for (unsigned i = 0, mask = 1; mask; ++i, mask &lt;&lt;= 1) {
904               // ...
905             }
906           }
908         gribble::gribble()
909         : _M_private_data(0), _M_more_stuff(0), _M_helper(0)
910         { }
912         int
913         gribble::three_lines()
914         {
915           // doesn't fit in one line.
916         }
917       } // namespace std
918       </code>
919     </literallayout>
920   </section>
921 </section>
923 <section xml:id="contrib.design_notes" xreflabel="Design Notes"><info><title>Design Notes</title></info>
924   <?dbhtml filename="source_design_notes.html"?>
925   
926   <para>
927   </para>
929   <literallayout class="normal">
931     The Library
932     -----------
934     This paper is covers two major areas:
936     - Features and policies not mentioned in the standard that
937     the quality of the library implementation depends on, including
938     extensions and "implementation-defined" features;
940     - Plans for required but unimplemented library features and
941     optimizations to them.
943     Overhead
944     --------
946     The standard defines a large library, much larger than the standard
947     C library. A naive implementation would suffer substantial overhead
948     in compile time, executable size, and speed, rendering it unusable
949     in many (particularly embedded) applications. The alternative demands
950     care in construction, and some compiler support, but there is no
951     need for library subsets.
953     What are the sources of this overhead?  There are four main causes:
955     - The library is specified almost entirely as templates, which
956     with current compilers must be included in-line, resulting in
957     very slow builds as tens or hundreds of thousands of lines
958     of function definitions are read for each user source file.
959     Indeed, the entire SGI STL, as well as the dos Reis valarray,
960     are provided purely as header files, largely for simplicity in
961     porting. Iostream/locale is (or will be) as large again.
963     - The library is very flexible, specifying a multitude of hooks
964     where users can insert their own code in place of defaults.
965     When these hooks are not used, any time and code expended to
966     support that flexibility is wasted.
968     - Templates are often described as causing to "code bloat". In
969     practice, this refers (when it refers to anything real) to several
970     independent processes. First, when a class template is manually
971     instantiated in its entirely, current compilers place the definitions
972     for all members in a single object file, so that a program linking
973     to one member gets definitions of all. Second, template functions
974     which do not actually depend on the template argument are, under
975     current compilers, generated anew for each instantiation, rather
976     than being shared with other instantiations. Third, some of the
977     flexibility mentioned above comes from virtual functions (both in
978     regular classes and template classes) which current linkers add
979     to the executable file even when they manifestly cannot be called.
981     - The library is specified to use a language feature, exceptions,
982     which in the current gcc compiler ABI imposes a run time and
983     code space cost to handle the possibility of exceptions even when
984     they are not used. Under the new ABI (accessed with -fnew-abi),
985     there is a space overhead and a small reduction in code efficiency
986     resulting from lost optimization opportunities associated with
987     non-local branches associated with exceptions.
989     What can be done to eliminate this overhead?  A variety of coding
990     techniques, and compiler, linker and library improvements and
991     extensions may be used, as covered below. Most are not difficult,
992     and some are already implemented in varying degrees.
994     Overhead: Compilation Time
995     --------------------------
997     Providing "ready-instantiated" template code in object code archives
998     allows us to avoid generating and optimizing template instantiations
999     in each compilation unit which uses them. However, the number of such
1000     instantiations that are useful to provide is limited, and anyway this
1001     is not enough, by itself, to minimize compilation time. In particular,
1002     it does not reduce time spent parsing conforming headers.
1004     Quicker header parsing will depend on library extensions and compiler
1005     improvements.  One approach is some variation on the techniques
1006     previously marketed as "pre-compiled headers", now standardized as
1007     support for the "export" keyword. "Exported" template definitions
1008     can be placed (once) in a "repository" -- really just a library, but
1009     of template definitions rather than object code -- to be drawn upon
1010     at link time when an instantiation is needed, rather than placed in
1011     header files to be parsed along with every compilation unit.
1013     Until "export" is implemented we can put some of the lengthy template
1014     definitions in #if guards or alternative headers so that users can skip
1015     over the full definitions when they need only the ready-instantiated
1016     specializations.
1018     To be precise, this means that certain headers which define
1019     templates which users normally use only for certain arguments
1020     can be instrumented to avoid exposing the template definitions
1021     to the compiler unless a macro is defined. For example, in
1022     &lt;string&gt;, we might have:
1024     template &lt;class _CharT, ... &gt; class basic_string {
1025     ... // member declarations
1026     };
1027     ... // operator declarations
1029     #ifdef _STRICT_ISO_
1030     # if _G_NO_TEMPLATE_EXPORT
1031     #   include &lt;bits/std_locale.h&gt;  // headers needed by definitions
1032     #   ...
1033     #   include &lt;bits/string.tcc&gt;  // member and global template definitions.
1034     # endif
1035     #endif
1037     Users who compile without specifying a strict-ISO-conforming flag
1038     would not see many of the template definitions they now see, and rely
1039     instead on ready-instantiated specializations in the library. This
1040     technique would be useful for the following substantial components:
1041     string, locale/iostreams, valarray. It would *not* be useful or
1042     usable with the following: containers, algorithms, iterators,
1043     allocator. Since these constitute a large (though decreasing)
1044     fraction of the library, the benefit the technique offers is
1045     limited.
1047     The language specifies the semantics of the "export" keyword, but
1048     the gcc compiler does not yet support it. When it does, problems
1049     with large template inclusions can largely disappear, given some
1050     minor library reorganization, along with the need for the apparatus
1051     described above.
1053     Overhead: Flexibility Cost
1054     --------------------------
1056     The library offers many places where users can specify operations
1057     to be performed by the library in place of defaults. Sometimes
1058     this seems to require that the library use a more-roundabout, and
1059     possibly slower, way to accomplish the default requirements than
1060     would be used otherwise.
1062     The primary protection against this overhead is thorough compiler
1063     optimization, to crush out layers of inline function interfaces.
1064     Kuck &amp; Associates has demonstrated the practicality of this kind
1065     of optimization.
1067     The second line of defense against this overhead is explicit
1068     specialization. By defining helper function templates, and writing
1069     specialized code for the default case, overhead can be eliminated
1070     for that case without sacrificing flexibility. This takes full
1071     advantage of any ability of the optimizer to crush out degenerate
1072     code.
1074     The library specifies many virtual functions which current linkers
1075     load even when they cannot be called. Some minor improvements to the
1076     compiler and to ld would eliminate any such overhead by simply
1077     omitting virtual functions that the complete program does not call.
1078     A prototype of this work has already been done. For targets where
1079     GNU ld is not used, a "pre-linker" could do the same job.
1081     The main areas in the standard interface where user flexibility
1082     can result in overhead are:
1084     - Allocators:  Containers are specified to use user-definable
1085     allocator types and objects, making tuning for the container
1086     characteristics tricky.
1088     - Locales: the standard specifies locale objects used to implement
1089     iostream operations, involving many virtual functions which use
1090     streambuf iterators.
1092     - Algorithms and containers: these may be instantiated on any type,
1093     frequently duplicating code for identical operations.
1095     - Iostreams and strings: users are permitted to use these on their
1096     own types, and specify the operations the stream must use on these
1097     types.
1099     Note that these sources of overhead are _avoidable_. The techniques
1100     to avoid them are covered below.
1102     Code Bloat
1103     ----------
1105     In the SGI STL, and in some other headers, many of the templates
1106     are defined "inline" -- either explicitly or by their placement
1107     in class definitions -- which should not be inline. This is a
1108     source of code bloat. Matt had remarked that he was relying on
1109     the compiler to recognize what was too big to benefit from inlining,
1110     and generate it out-of-line automatically. However, this also can
1111     result in code bloat except where the linker can eliminate the extra
1112     copies.
1114     Fixing these cases will require an audit of all inline functions
1115     defined in the library to determine which merit inlining, and moving
1116     the rest out of line. This is an issue mainly in clauses 23, 25, and
1117     27. Of course it can be done incrementally, and we should generally
1118     accept patches that move large functions out of line and into ".tcc"
1119     files, which can later be pulled into a repository. Compiler/linker
1120     improvements to recognize very large inline functions and move them
1121     out-of-line, but shared among compilation units, could make this
1122     work unnecessary.
1124     Pre-instantiating template specializations currently produces large
1125     amounts of dead code which bloats statically linked programs. The
1126     current state of the static library, libstdc++.a, is intolerable on
1127     this account, and will fuel further confused speculation about a need
1128     for a library "subset". A compiler improvement that treats each
1129     instantiated function as a separate object file, for linking purposes,
1130     would be one solution to this problem. An alternative would be to
1131     split up the manual instantiation files into dozens upon dozens of
1132     little files, each compiled separately, but an abortive attempt at
1133     this was done for &lt;string&gt; and, though it is far from complete, it
1134     is already a nuisance. A better interim solution (just until we have
1135     "export") is badly needed.
1137     When building a shared library, the current compiler/linker cannot
1138     automatically generate the instantiations needed. This creates a
1139     miserable situation; it means any time something is changed in the
1140     library, before a shared library can be built someone must manually
1141     copy the declarations of all templates that are needed by other parts
1142     of the library to an "instantiation" file, and add it to the build
1143     system to be compiled and linked to the library. This process is
1144     readily automated, and should be automated as soon as possible.
1145     Users building their own shared libraries experience identical
1146     frustrations.
1148     Sharing common aspects of template definitions among instantiations
1149     can radically reduce code bloat. The compiler could help a great
1150     deal here by recognizing when a function depends on nothing about
1151     a template parameter, or only on its size, and giving the resulting
1152     function a link-name "equate" that allows it to be shared with other
1153     instantiations. Implementation code could take advantage of the
1154     capability by factoring out code that does not depend on the template
1155     argument into separate functions to be merged by the compiler.
1157     Until such a compiler optimization is implemented, much can be done
1158     manually (if tediously) in this direction. One such optimization is
1159     to derive class templates from non-template classes, and move as much
1160     implementation as possible into the base class. Another is to partial-
1161     specialize certain common instantiations, such as vector&lt;T*&gt;, to share
1162     code for instantiations on all types T. While these techniques work,
1163     they are far from the complete solution that a compiler improvement
1164     would afford.
1166     Overhead: Expensive Language Features
1167     -------------------------------------
1169     The main "expensive" language feature used in the standard library
1170     is exception support, which requires compiling in cleanup code with
1171     static table data to locate it, and linking in library code to use
1172     the table. For small embedded programs the amount of such library
1173     code and table data is assumed by some to be excessive. Under the
1174     "new" ABI this perception is generally exaggerated, although in some
1175     cases it may actually be excessive.
1177     To implement a library which does not use exceptions directly is
1178     not difficult given minor compiler support (to "turn off" exceptions
1179     and ignore exception constructs), and results in no great library
1180     maintenance difficulties. To be precise, given "-fno-exceptions",
1181     the compiler should treat "try" blocks as ordinary blocks, and
1182     "catch" blocks as dead code to ignore or eliminate. Compiler
1183     support is not strictly necessary, except in the case of "function
1184     try blocks"; otherwise the following macros almost suffice:
1186     #define throw(X)
1187     #define try      if (true)
1188     #define catch(X) else if (false)
1190     However, there may be a need to use function try blocks in the
1191     library implementation, and use of macros in this way can make
1192     correct diagnostics impossible. Furthermore, use of this scheme
1193     would require the library to call a function to re-throw exceptions
1194     from a try block. Implementing the above semantics in the compiler
1195     is preferable.
1197     Given the support above (however implemented) it only remains to
1198     replace code that "throws" with a call to a well-documented "handler"
1199     function in a separate compilation unit which may be replaced by
1200     the user. The main source of exceptions that would be difficult
1201     for users to avoid is memory allocation failures, but users can
1202     define their own memory allocation primitives that never throw.
1203     Otherwise, the complete list of such handlers, and which library
1204     functions may call them, would be needed for users to be able to
1205     implement the necessary substitutes. (Fortunately, they have the
1206     source code.)
1208     Opportunities
1209     -------------
1211     The template capabilities of C++ offer enormous opportunities for
1212     optimizing common library operations, well beyond what would be
1213     considered "eliminating overhead". In particular, many operations
1214     done in Glibc with macros that depend on proprietary language
1215     extensions can be implemented in pristine Standard C++. For example,
1216     the chapter 25 algorithms, and even C library functions such as strchr,
1217     can be specialized for the case of static arrays of known (small) size.
1219     Detailed optimization opportunities are identified below where
1220     the component where they would appear is discussed. Of course new
1221     opportunities will be identified during implementation.
1223     Unimplemented Required Library Features
1224     ---------------------------------------
1226     The standard specifies hundreds of components, grouped broadly by
1227     chapter. These are listed in excruciating detail in the CHECKLIST
1228     file.
1230     17 general
1231     18 support
1232     19 diagnostics
1233     20 utilities
1234     21 string
1235     22 locale
1236     23 containers
1237     24 iterators
1238     25 algorithms
1239     26 numerics
1240     27 iostreams
1241     Annex D  backward compatibility
1243     Anyone participating in implementation of the library should obtain
1244     a copy of the standard, ISO 14882.  People in the U.S. can obtain an
1245     electronic copy for US$18 from ANSI's web site. Those from other
1246     countries should visit http://www.iso.org/ to find out the location
1247     of their country's representation in ISO, in order to know who can
1248     sell them a copy.
1250     The emphasis in the following sections is on unimplemented features
1251     and optimization opportunities.
1253     Chapter 17  General
1254     -------------------
1256     Chapter 17 concerns overall library requirements.
1258     The standard doesn't mention threads. A multi-thread (MT) extension
1259     primarily affects operators new and delete (18), allocator (20),
1260     string (21), locale (22), and iostreams (27). The common underlying
1261     support needed for this is discussed under chapter 20.
1263     The standard requirements on names from the C headers create a
1264     lot of work, mostly done. Names in the C headers must be visible
1265     in the std:: and sometimes the global namespace; the names in the
1266     two scopes must refer to the same object. More stringent is that
1267     Koenig lookup implies that any types specified as defined in std::
1268     really are defined in std::. Names optionally implemented as
1269     macros in C cannot be macros in C++. (An overview may be read at
1270     &lt;http://www.cantrip.org/cheaders.html&gt;). The scripts "inclosure"
1271     and "mkcshadow", and the directories shadow/ and cshadow/, are the
1272     beginning of an effort to conform in this area.
1274     A correct conforming definition of C header names based on underlying
1275     C library headers, and practical linking of conforming namespaced
1276     customer code with third-party C libraries depends ultimately on
1277     an ABI change, allowing namespaced C type names to be mangled into
1278     type names as if they were global, somewhat as C function names in a
1279     namespace, or C++ global variable names, are left unmangled. Perhaps
1280     another "extern" mode, such as 'extern "C-global"' would be an
1281     appropriate place for such type definitions. Such a type would
1282     affect mangling as follows:
1284     namespace A {
1285     struct X {};
1286     extern "C-global" {  // or maybe just 'extern "C"'
1287     struct Y {};
1288     };
1289     }
1290     void f(A::X*);  // mangles to f__FPQ21A1X
1291     void f(A::Y*);  // mangles to f__FP1Y
1293     (It may be that this is really the appropriate semantics for regular
1294     'extern "C"', and 'extern "C-global"', as an extension, would not be
1295     necessary.) This would allow functions declared in non-standard C headers
1296     (and thus fixable by neither us nor users) to link properly with functions
1297     declared using C types defined in properly-namespaced headers. The
1298     problem this solves is that C headers (which C++ programmers do persist
1299     in using) frequently forward-declare C struct tags without including
1300     the header where the type is defined, as in
1302     struct tm;
1303     void munge(tm*);
1305     Without some compiler accommodation, munge cannot be called by correct
1306     C++ code using a pointer to a correctly-scoped tm* value.
1308     The current C headers use the preprocessor extension "#include_next",
1309     which the compiler complains about when run "-pedantic".
1310     (Incidentally, it appears that "-fpedantic" is currently ignored,
1311     probably a bug.)  The solution in the C compiler is to use
1312     "-isystem" rather than "-I", but unfortunately in g++ this seems
1313     also to wrap the whole header in an 'extern "C"' block, so it's
1314     unusable for C++ headers. The correct solution appears to be to
1315     allow the various special include-directory options, if not given
1316     an argument, to affect subsequent include-directory options additively,
1317     so that if one said
1319     -pedantic -iprefix $(prefix) \
1320     -idirafter -ino-pedantic -ino-extern-c -iwithprefix -I g++-v3 \
1321     -iwithprefix -I g++-v3/ext
1323     the compiler would search $(prefix)/g++-v3 and not report
1324     pedantic warnings for files found there, but treat files in
1325     $(prefix)/g++-v3/ext pedantically. (The undocumented semantics
1326     of "-isystem" in g++ stink. Can they be rescinded?  If not it
1327     must be replaced with something more rationally behaved.)
1329     All the C headers need the treatment above; in the standard these
1330     headers are mentioned in various clauses. Below, I have only
1331     mentioned those that present interesting implementation issues.
1333     The components identified as "mostly complete", below, have not been
1334     audited for conformance. In many cases where the library passes
1335     conformance tests we have non-conforming extensions that must be
1336     wrapped in #if guards for "pedantic" use, and in some cases renamed
1337     in a conforming way for continued use in the implementation regardless
1338     of conformance flags.
1340     The STL portion of the library still depends on a header
1341     stl/bits/stl_config.h full of #ifdef clauses. This apparatus
1342     should be replaced with autoconf/automake machinery.
1344     The SGI STL defines a type_traits&lt;&gt; template, specialized for
1345     many types in their code including the built-in numeric and
1346     pointer types and some library types, to direct optimizations of
1347     standard functions. The SGI compiler has been extended to generate
1348     specializations of this template automatically for user types,
1349     so that use of STL templates on user types can take advantage of
1350     these optimizations. Specializations for other, non-STL, types
1351     would make more optimizations possible, but extending the gcc
1352     compiler in the same way would be much better. Probably the next
1353     round of standardization will ratify this, but probably with
1354     changes, so it probably should be renamed to place it in the
1355     implementation namespace.
1357     The SGI STL also defines a large number of extensions visible in
1358     standard headers. (Other extensions that appear in separate headers
1359     have been sequestered in subdirectories ext/ and backward/.)  All
1360     these extensions should be moved to other headers where possible,
1361     and in any case wrapped in a namespace (not std!), and (where kept
1362     in a standard header) girded about with macro guards. Some cannot be
1363     moved out of standard headers because they are used to implement
1364     standard features.  The canonical method for accommodating these
1365     is to use a protected name, aliased in macro guards to a user-space
1366     name. Unfortunately C++ offers no satisfactory template typedef
1367     mechanism, so very ad-hoc and unsatisfactory aliasing must be used
1368     instead.
1370     Implementation of a template typedef mechanism should have the highest
1371     priority among possible extensions, on the same level as implementation
1372     of the template "export" feature.
1374     Chapter 18  Language support
1375     ----------------------------
1377     Headers: &lt;limits&gt; &lt;new&gt; &lt;typeinfo&gt; &lt;exception&gt;
1378     C headers: &lt;cstddef&gt; &lt;climits&gt; &lt;cfloat&gt;  &lt;cstdarg&gt; &lt;csetjmp&gt;
1379     &lt;ctime&gt;   &lt;csignal&gt; &lt;cstdlib&gt; (also 21, 25, 26)
1381     This defines the built-in exceptions, rtti, numeric_limits&lt;&gt;,
1382     operator new and delete. Much of this is provided by the
1383     compiler in its static runtime library.
1385     Work to do includes defining numeric_limits&lt;&gt; specializations in
1386     separate files for all target architectures. Values for integer types
1387     except for bool and wchar_t are readily obtained from the C header
1388     &lt;limits.h&gt;, but values for the remaining numeric types (bool, wchar_t,
1389     float, double, long double) must be entered manually. This is
1390     largely dog work except for those members whose values are not
1391     easily deduced from available documentation. Also, this involves
1392     some work in target configuration to identify the correct choice of
1393     file to build against and to install.
1395     The definitions of the various operators new and delete must be
1396     made thread-safe, which depends on a portable exclusion mechanism,
1397     discussed under chapter 20.  Of course there is always plenty of
1398     room for improvements to the speed of operators new and delete.
1400     &lt;cstdarg&gt;, in Glibc, defines some macros that gcc does not allow to
1401     be wrapped into an inline function. Probably this header will demand
1402     attention whenever a new target is chosen. The functions atexit(),
1403     exit(), and abort() in cstdlib have different semantics in C++, so
1404     must be re-implemented for C++.
1406     Chapter 19  Diagnostics
1407     -----------------------
1409     Headers: &lt;stdexcept&gt;
1410     C headers: &lt;cassert&gt; &lt;cerrno&gt;
1412     This defines the standard exception objects, which are "mostly complete".
1413     Cygnus has a version, and now SGI provides a slightly different one.
1414     It makes little difference which we use.
1416     The C global name "errno", which C allows to be a variable or a macro,
1417     is required in C++ to be a macro. For MT it must typically result in
1418     a function call.
1420     Chapter 20  Utilities
1421     ---------------------
1422     Headers: &lt;utility&gt; &lt;functional&gt; &lt;memory&gt;
1423     C header: &lt;ctime&gt; (also in 18)
1425     SGI STL provides "mostly complete" versions of all the components
1426     defined in this chapter. However, the auto_ptr&lt;&gt; implementation
1427     is known to be wrong. Furthermore, the standard definition of it
1428     is known to be unimplementable as written. A minor change to the
1429     standard would fix it, and auto_ptr&lt;&gt; should be adjusted to match.
1431     Multi-threading affects the allocator implementation, and there must
1432     be configuration/installation choices for different users' MT
1433     requirements. Anyway, users will want to tune allocator options
1434     to support different target conditions, MT or no.
1436     The primitives used for MT implementation should be exposed, as an
1437     extension, for users' own work. We need cross-CPU "mutex" support,
1438     multi-processor shared-memory atomic integer operations, and single-
1439     processor uninterruptible integer operations, and all three configurable
1440     to be stubbed out for non-MT use, or to use an appropriately-loaded
1441     dynamic library for the actual runtime environment, or statically
1442     compiled in for cases where the target architecture is known.
1444     Chapter 21  String
1445     ------------------
1446     Headers: &lt;string&gt;
1447     C headers: &lt;cctype&gt; &lt;cwctype&gt; &lt;cstring&gt; &lt;cwchar&gt; (also in 27)
1448     &lt;cstdlib&gt; (also in 18, 25, 26)
1450     We have "mostly-complete" char_traits&lt;&gt; implementations. Many of the
1451     char_traits&lt;char&gt; operations might be optimized further using existing
1452     proprietary language extensions.
1454     We have a "mostly-complete" basic_string&lt;&gt; implementation. The work
1455     to manually instantiate char and wchar_t specializations in object
1456     files to improve link-time behavior is extremely unsatisfactory,
1457     literally tripling library-build time with no commensurate improvement
1458     in static program link sizes. It must be redone. (Similar work is
1459     needed for some components in clauses 22 and 27.)
1461     Other work needed for strings is MT-safety, as discussed under the
1462     chapter 20 heading.
1464     The standard C type mbstate_t from &lt;cwchar&gt; and used in char_traits&lt;&gt;
1465     must be different in C++ than in C, because in C++ the default constructor
1466     value mbstate_t() must be the "base" or "ground" sequence state.
1467     (According to the likely resolution of a recently raised Core issue,
1468     this may become unnecessary. However, there are other reasons to
1469     use a state type not as limited as whatever the C library provides.)
1470     If we might want to provide conversions from (e.g.) internally-
1471     represented EUC-wide to externally-represented Unicode, or vice-
1472     versa, the mbstate_t we choose will need to be more accommodating
1473     than what might be provided by an underlying C library.
1475     There remain some basic_string template-member functions which do
1476     not overload properly with their non-template brethren. The infamous
1477     hack akin to what was done in vector&lt;&gt; is needed, to conform to
1478     23.1.1 para 10. The CHECKLIST items for basic_string marked 'X',
1479     or incomplete, are so marked for this reason.
1481     Replacing the string iterators, which currently are simple character
1482     pointers, with class objects would greatly increase the safety of the
1483     client interface, and also permit a "debug" mode in which range,
1484     ownership, and validity are rigorously checked. The current use of
1485     raw pointers as string iterators is evil. vector&lt;&gt; iterators need the
1486     same treatment. Note that the current implementation freely mixes
1487     pointers and iterators, and that must be fixed before safer iterators
1488     can be introduced.
1490     Some of the functions in &lt;cstring&gt; are different from the C version.
1491     generally overloaded on const and non-const argument pointers. For
1492     example, in &lt;cstring&gt; strchr is overloaded. The functions isupper
1493     etc. in &lt;cctype&gt; typically implemented as macros in C are functions
1494     in C++, because they are overloaded with others of the same name
1495     defined in &lt;locale&gt;.
1497     Many of the functions required in &lt;cwctype&gt; and &lt;cwchar&gt; cannot be
1498     implemented using underlying C facilities on intended targets because
1499     such facilities only partly exist.
1501     Chapter 22  Locale
1502     ------------------
1503     Headers: &lt;locale&gt;
1504     C headers: &lt;clocale&gt;
1506     We have a "mostly complete" class locale, with the exception of
1507     code for constructing, and handling the names of, named locales.
1508     The ways that locales are named (particularly when categories
1509     (e.g. LC_TIME, LC_COLLATE) are different) varies among all target
1510     environments. This code must be written in various versions and
1511     chosen by configuration parameters.
1513     Members of many of the facets defined in &lt;locale&gt; are stubs. Generally,
1514     there are two sets of facets: the base class facets (which are supposed
1515     to implement the "C" locale) and the "byname" facets, which are supposed
1516     to read files to determine their behavior. The base ctype&lt;&gt;, collate&lt;&gt;,
1517     and numpunct&lt;&gt; facets are "mostly complete", except that the table of
1518     bitmask values used for "is" operations, and corresponding mask values,
1519     are still defined in libio and just included/linked. (We will need to
1520     implement these tables independently, soon, but should take advantage
1521     of libio where possible.)  The num_put&lt;&gt;::put members for integer types
1522     are "mostly complete".
1524     A complete list of what has and has not been implemented may be
1525     found in CHECKLIST. However, note that the current definition of
1526     codecvt&lt;wchar_t,char,mbstate_t&gt; is wrong. It should simply write
1527     out the raw bytes representing the wide characters, rather than
1528     trying to convert each to a corresponding single "char" value.
1530     Some of the facets are more important than others. Specifically,
1531     the members of ctype&lt;&gt;, numpunct&lt;&gt;, num_put&lt;&gt;, and num_get&lt;&gt; facets
1532     are used by other library facilities defined in &lt;string&gt;, &lt;istream&gt;,
1533     and &lt;ostream&gt;, and the codecvt&lt;&gt; facet is used by basic_filebuf&lt;&gt;
1534     in &lt;fstream&gt;, so a conforming iostream implementation depends on
1535     these.
1537     The "long long" type eventually must be supported, but code mentioning
1538     it should be wrapped in #if guards to allow pedantic-mode compiling.
1540     Performance of num_put&lt;&gt; and num_get&lt;&gt; depend critically on
1541     caching computed values in ios_base objects, and on extensions
1542     to the interface with streambufs.
1544     Specifically: retrieving a copy of the locale object, extracting
1545     the needed facets, and gathering data from them, for each call to
1546     (e.g.) operator&lt;&lt; would be prohibitively slow.  To cache format
1547     data for use by num_put&lt;&gt; and num_get&lt;&gt; we have a _Format_cache&lt;&gt;
1548     object stored in the ios_base::pword() array. This is constructed
1549     and initialized lazily, and is organized purely for utility. It
1550     is discarded when a new locale with different facets is imbued.
1552     Using only the public interfaces of the iterator arguments to the
1553     facet functions would limit performance by forbidding "vector-style"
1554     character operations. The streambuf iterator optimizations are
1555     described under chapter 24, but facets can also bypass the streambuf
1556     iterators via explicit specializations and operate directly on the
1557     streambufs, and use extended interfaces to get direct access to the
1558     streambuf internal buffer arrays. These extensions are mentioned
1559     under chapter 27. These optimizations are particularly important
1560     for input parsing.
1562     Unused virtual members of locale facets can be omitted, as mentioned
1563     above, by a smart linker.
1565     Chapter 23  Containers
1566     ----------------------
1567     Headers: &lt;deque&gt; &lt;list&gt; &lt;queue&gt; &lt;stack&gt; &lt;vector&gt; &lt;map&gt; &lt;set&gt; &lt;bitset&gt;
1569     All the components in chapter 23 are implemented in the SGI STL.
1570     They are "mostly complete"; they include a large number of
1571     nonconforming extensions which must be wrapped. Some of these
1572     are used internally and must be renamed or duplicated.
1574     The SGI components are optimized for large-memory environments. For
1575     embedded targets, different criteria might be more appropriate. Users
1576     will want to be able to tune this behavior. We should provide
1577     ways for users to compile the library with different memory usage
1578     characteristics.
1580     A lot more work is needed on factoring out common code from different
1581     specializations to reduce code size here and in chapter 25. The
1582     easiest fix for this would be a compiler/ABI improvement that allows
1583     the compiler to recognize when a specialization depends only on the
1584     size (or other gross quality) of a template argument, and allow the
1585     linker to share the code with similar specializations. In its
1586     absence, many of the algorithms and containers can be partial-
1587     specialized, at least for the case of pointers, but this only solves
1588     a small part of the problem. Use of a type_traits-style template
1589     allows a few more optimization opportunities, more if the compiler
1590     can generate the specializations automatically.
1592     As an optimization, containers can specialize on the default allocator
1593     and bypass it, or take advantage of details of its implementation
1594     after it has been improved upon.
1596     Replacing the vector iterators, which currently are simple element
1597     pointers, with class objects would greatly increase the safety of the
1598     client interface, and also permit a "debug" mode in which range,
1599     ownership, and validity are rigorously checked. The current use of
1600     pointers for iterators is evil.
1602     As mentioned for chapter 24, the deque iterator is a good example of
1603     an opportunity to implement a "staged" iterator that would benefit
1604     from specializations of some algorithms.
1606     Chapter 24  Iterators
1607     ---------------------
1608     Headers: &lt;iterator&gt;
1610     Standard iterators are "mostly complete", with the exception of
1611     the stream iterators, which are not yet templatized on the
1612     stream type. Also, the base class template iterator&lt;&gt; appears
1613     to be wrong, so everything derived from it must also be wrong,
1614     currently.
1616     The streambuf iterators (currently located in stl/bits/std_iterator.h,
1617     but should be under bits/) can be rewritten to take advantage of
1618     friendship with the streambuf implementation.
1620     Matt Austern has identified opportunities where certain iterator
1621     types, particularly including streambuf iterators and deque
1622     iterators, have a "two-stage" quality, such that an intermediate
1623     limit can be checked much more quickly than the true limit on
1624     range operations. If identified with a member of iterator_traits,
1625     algorithms may be specialized for this case. Of course the
1626     iterators that have this quality can be identified by specializing
1627     a traits class.
1629     Many of the algorithms must be specialized for the streambuf
1630     iterators, to take advantage of block-mode operations, in order
1631     to allow iostream/locale operations' performance not to suffer.
1632     It may be that they could be treated as staged iterators and
1633     take advantage of those optimizations.
1635     Chapter 25  Algorithms
1636     ----------------------
1637     Headers: &lt;algorithm&gt;
1638     C headers: &lt;cstdlib&gt; (also in 18, 21, 26))
1640     The algorithms are "mostly complete". As mentioned above, they
1641     are optimized for speed at the expense of code and data size.
1643     Specializations of many of the algorithms for non-STL types would
1644     give performance improvements, but we must use great care not to
1645     interfere with fragile template overloading semantics for the
1646     standard interfaces. Conventionally the standard function template
1647     interface is an inline which delegates to a non-standard function
1648     which is then overloaded (this is already done in many places in
1649     the library). Particularly appealing opportunities for the sake of
1650     iostream performance are for copy and find applied to streambuf
1651     iterators or (as noted elsewhere) for staged iterators, of which
1652     the streambuf iterators are a good example.
1654     The bsearch and qsort functions cannot be overloaded properly as
1655     required by the standard because gcc does not yet allow overloading
1656     on the extern-"C"-ness of a function pointer.
1658     Chapter 26  Numerics
1659     --------------------
1660     Headers: &lt;complex&gt; &lt;valarray&gt; &lt;numeric&gt;
1661     C headers: &lt;cmath&gt;, &lt;cstdlib&gt; (also 18, 21, 25)
1663     Numeric components: Gabriel dos Reis's valarray, Drepper's complex,
1664     and the few algorithms from the STL are "mostly done".  Of course
1665     optimization opportunities abound for the numerically literate. It
1666     is not clear whether the valarray implementation really conforms
1667     fully, in the assumptions it makes about aliasing (and lack thereof)
1668     in its arguments.
1670     The C div() and ldiv() functions are interesting, because they are the
1671     only case where a C library function returns a class object by value.
1672     Since the C++ type div_t must be different from the underlying C type
1673     (which is in the wrong namespace) the underlying functions div() and
1674     ldiv() cannot be re-used efficiently. Fortunately they are trivial to
1675     re-implement.
1677     Chapter 27  Iostreams
1678     ---------------------
1679     Headers: &lt;iosfwd&gt; &lt;streambuf&gt; &lt;ios&gt; &lt;ostream&gt; &lt;istream&gt; &lt;iostream&gt;
1680     &lt;iomanip&gt; &lt;sstream&gt; &lt;fstream&gt;
1681     C headers: &lt;cstdio&gt; &lt;cwchar&gt; (also in 21)
1683     Iostream is currently in a very incomplete state. &lt;iosfwd&gt;, &lt;iomanip&gt;,
1684     ios_base, and basic_ios&lt;&gt; are "mostly complete". basic_streambuf&lt;&gt; and
1685     basic_ostream&lt;&gt; are well along, but basic_istream&lt;&gt; has had little work
1686     done. The standard stream objects, &lt;sstream&gt; and &lt;fstream&gt; have been
1687     started; basic_filebuf&lt;&gt; "write" functions have been implemented just
1688     enough to do "hello, world".
1690     Most of the istream and ostream operators &lt;&lt; and &gt;&gt; (with the exception
1691     of the op&lt;&lt;(integer) ones) have not been changed to use locale primitives,
1692     sentry objects, or char_traits members.
1694     All these templates should be manually instantiated for char and
1695     wchar_t in a way that links only used members into user programs.
1697     Streambuf is fertile ground for optimization extensions. An extended
1698     interface giving iterator access to its internal buffer would be very
1699     useful for other library components.
1701     Iostream operations (primarily operators &lt;&lt; and &gt;&gt;) can take advantage
1702     of the case where user code has not specified a locale, and bypass locale
1703     operations entirely. The current implementation of op&lt;&lt;/num_put&lt;&gt;::put,
1704     for the integer types, demonstrates how they can cache encoding details
1705     from the locale on each operation. There is lots more room for
1706     optimization in this area.
1708     The definition of the relationship between the standard streams
1709     cout et al. and stdout et al. requires something like a "stdiobuf".
1710     The SGI solution of using double-indirection to actually use a
1711     stdio FILE object for buffering is unsatisfactory, because it
1712     interferes with peephole loop optimizations.
1714     The &lt;sstream&gt; header work has begun. stringbuf can benefit from
1715     friendship with basic_string&lt;&gt; and basic_string&lt;&gt;::_Rep to use
1716     those objects directly as buffers, and avoid allocating and making
1717     copies.
1719     The basic_filebuf&lt;&gt; template is a complex beast. It is specified to
1720     use the locale facet codecvt&lt;&gt; to translate characters between native
1721     files and the locale character encoding. In general this involves
1722     two buffers, one of "char" representing the file and another of
1723     "char_type", for the stream, with codecvt&lt;&gt; translating. The process
1724     is complicated by the variable-length nature of the translation, and
1725     the need to seek to corresponding places in the two representations.
1726     For the case of basic_filebuf&lt;char&gt;, when no translation is needed,
1727     a single buffer suffices. A specialized filebuf can be used to reduce
1728     code space overhead when no locale has been imbued. Matt Austern's
1729     work at SGI will be useful, perhaps directly as a source of code, or
1730     at least as an example to draw on.
1732     Filebuf, almost uniquely (cf. operator new), depends heavily on
1733     underlying environmental facilities. In current releases iostream
1734     depends fairly heavily on libio constant definitions, but it should
1735     be made independent.  It also depends on operating system primitives
1736     for file operations. There is immense room for optimizations using
1737     (e.g.) mmap for reading. The shadow/ directory wraps, besides the
1738     standard C headers, the libio.h and unistd.h headers, for use mainly
1739     by filebuf. These wrappings have not been completed, though there
1740     is scaffolding in place.
1742     The encapsulation of certain C header &lt;cstdio&gt; names presents an
1743     interesting problem. It is possible to define an inline std::fprintf()
1744     implemented in terms of the 'extern "C"' vfprintf(), but there is no
1745     standard vfscanf() to use to implement std::fscanf(). It appears that
1746     vfscanf but be re-implemented in C++ for targets where no vfscanf
1747     extension has been defined. This is interesting in that it seems
1748     to be the only significant case in the C library where this kind of
1749     rewriting is necessary. (Of course Glibc provides the vfscanf()
1750     extension.)  (The functions related to exit() must be rewritten
1751     for other reasons.)
1754     Annex D
1755     -------
1756     Headers: &lt;strstream&gt;
1758     Annex D defines many non-library features, and many minor
1759     modifications to various headers, and a complete header.
1760     It is "mostly done", except that the libstdc++-2 &lt;strstream&gt;
1761     header has not been adopted into the library, or checked to
1762     verify that it matches the draft in those details that were
1763     clarified by the committee. Certainly it must at least be
1764     moved into the std namespace.
1766     We still need to wrap all the deprecated features in #if guards
1767     so that pedantic compile modes can detect their use.
1769     Nonstandard Extensions
1770     ----------------------
1771     Headers: &lt;iostream.h&gt; &lt;strstream.h&gt; &lt;hash&gt; &lt;rbtree&gt;
1772     &lt;pthread_alloc&gt; &lt;stdiobuf&gt; (etc.)
1774     User code has come to depend on a variety of nonstandard components
1775     that we must not omit. Much of this code can be adopted from
1776     libstdc++-v2 or from the SGI STL. This particularly includes
1777     &lt;iostream.h&gt;, &lt;strstream.h&gt;, and various SGI extensions such
1778     as &lt;hash_map.h&gt;. Many of these are already placed in the
1779     subdirectories ext/ and backward/. (Note that it is better to
1780     include them via "&lt;backward/hash_map.h&gt;" or "&lt;ext/hash_map&gt;" than
1781     to search the subdirectory itself via a "-I" directive.
1782   </literallayout>
1783 </section>
1785 </appendix>