<?xml version='1.0'?>
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" 
 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" 
[ ]>

<appendix id="appendix.contrib" xreflabel="Contributing">
<?dbhtml filename="appendix_contributing.html"?>

<appendixinfo>
  <keywordset>
    <keyword>
      ISO C++
    </keyword>
    <keyword>
      library
    </keyword>
  </keywordset>
</appendixinfo>

<title>
  Contributing
  <indexterm>
    <primary>Appendix</primary>
    <secondary>Contributing</secondary>
  </indexterm>
</title>

<para> 
  The GNU C++ Library follows an open development model. Active
  contributors are assigned maintainer-ship responsibility, and given
  write access to the source repository. First time contributors
  should follow this procedure:
</para>

<sect1 id="contrib.list" xreflabel="Contributor Checklist">
  <title>Contributor Checklist</title>

  <sect2 id="list.reading" xreflabel="list.reading">
    <title>Reading</title>

    <itemizedlist>
      <listitem>
	<para> 
	  Get and read the relevant sections of the C++ language
	  specification. Copies of the full ISO 14882 standard are
	  available on line via the ISO mirror site for committee
	  members. Non-members, or those who have not paid for the
	  privilege of sitting on the committee and sustained their
	  two meeting commitment for voting rights, may get a copy of
	  the standard from their respective national standards
	  organization. In the USA, this national standards
	  organization is ANSI and their web-site is right
	  <ulink url="http://www.ansi.org">here.</ulink> 
	  (And if you've already registered with them, clicking this link will take you to directly to the place where you can 
	  <ulink url="http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003">buy the standard on-line.)</ulink>
	</para>
      </listitem>

      <listitem>
	<para> 
	  The library working group bugs, and known defects, can
	  be obtained here:
	  <ulink url="http://www.open-std.org/jtc1/sc22/wg21/">http://www.open-std.org/jtc1/sc22/wg21 </ulink>
	</para>
      </listitem>

      <listitem>
	<para> 
	  The newsgroup dedicated to standardization issues is
	  comp.std.c++: this FAQ for this group is quite useful and
	  can be
	  found <ulink url="http://www.jamesd.demon.co.uk/csc/faq.html">
	  here </ulink>.
      </para>
      </listitem>

      <listitem>
	<para> 
	  Peruse
	  the <ulink url="http://www.gnu.org/prep/standards_toc.html">GNU
	  Coding Standards</ulink>, and chuckle when you hit the part
	  about <quote>Using Languages Other Than C</quote>.
	</para>
      </listitem>

      <listitem>
	<para> 
	  Be familiar with the extensions that preceded these
	  general GNU rules. These style issues for libstdc++ can be
	  found <link linkend="contrib.coding_style">here</link>.
      </para>
      </listitem>

      <listitem>
	<para> 
	  And last but certainly not least, read the
	  library-specific information
	  found <link linkend="appendix.porting"> here</link>.
      </para>
      </listitem>
    </itemizedlist>

  </sect2>
  <sect2 id="list.copyright" xreflabel="list.copyright">
    <title>Assignment</title>
    <para>
      Small changes can be accepted without a copyright assignment form on
      file. New code and additions to the library need completed copyright
      assignment form on file at the FSF. Note: your employer may be required
      to fill out appropriate disclaimer forms as well. 
    </para>

    <para> 
      Historically, the libstdc++ assignment form added the following
      question:
    </para>

    <para>
      <quote>
	Which Belgian comic book character is better, Tintin or Asterix, and
	why?
      </quote>
    </para>

    <para>
      While not strictly necessary, humoring the maintainers and answering
      this question would be appreciated.
    </para>

    <para>
      For more information about getting a copyright assignment, please see 
      <ulink url="http://www.gnu.org/prep/maintain/html_node/Legal-Matters.html">Legal
	Matters</ulink>.
    </para>

    <para>
      Please contact Benjamin Kosnik at
      <email>bkoz+assign@redhat.com</email> if you are confused
      about the assignment or have general licensing questions. When
      requesting an assignment form from
      <email>mailto:assign@gnu.org</email>, please cc the libstdc++
      maintainer above so that progress can be monitored.
    </para>
  </sect2>

  <sect2 id="list.getting" xreflabel="list.getting">
    <title>Getting Sources</title>
    <para>
      <ulink url="http://gcc.gnu.org/svnwrite.html">Getting write access
	(look for &quot;Write after approval&quot;)</ulink>
    </para>
  </sect2>

  <sect2 id="list.patches" xreflabel="list.patches">
    <title>Submitting Patches</title>

    <para>
      Every patch must have several pieces of information before it can be
      properly evaluated. Ideally (and to ensure the fastest possible
      response from the maintainers) it would have all of these pieces:
    </para>

    <itemizedlist>
      <listitem>
	<para> 
	  A description of the bug and how your patch fixes this
	  bug. For new features a description of the feature and your
	  implementation. 
	</para>
      </listitem>

      <listitem>
	<para> 
	  A ChangeLog entry as plain text; see the various
	  ChangeLog files for format and content. If using you are
	  using emacs as your editor, simply position the insertion
	  point at the beginning of your change and hit CX-4a to bring
	  up the appropriate ChangeLog entry. See--magic! Similar
	  functionality also exists for vi. 
	</para>
      </listitem>

      <listitem>
	<para> 
	  A testsuite submission or sample program that will
	  easily and simply show the existing error or test new
	  functionality. 
	</para>
      </listitem>

      <listitem>
	<para> 
	  The patch itself. If you are accessing the SVN
	  repository use <command>svn update; svn diff NEW</command>;
	  else, use <command>diff -cp OLD NEW</command> ... If your
	  version of diff does not support these options, then get the
	  latest version of GNU
	  diff. The <ulink url="http://gcc.gnu.org/wiki/SvnTricks">SVN
	  Tricks</ulink> wiki page has information on customising the
	  output of <code>svn diff</code>.
	</para>
      </listitem>

      <listitem>
	<para> 
	  When you have all these pieces, bundle them up in a
	  mail message and send it to libstdc++@gcc.gnu.org. All
	  patches and related discussion should be sent to the
	  libstdc++ mailing list. 
	</para>
      </listitem>      
    </itemizedlist>

  </sect2>

</sect1>

<sect1 id="contrib.organization" xreflabel="Source Organization">
  <?dbhtml filename="source_organization.html"?>
  <title>Directory Layout and Source Conventions</title>
  
  <para>
    The unpacked source directory of libstdc++ contains the files
    needed to create the GNU C++ Library.
  </para>

  <literallayout>
It has subdirectories:

  doc
    Files in HTML and text format that document usage, quirks of the
    implementation, and contributor checklists.

  include
    All header files for the C++ library are within this directory,
    modulo specific runtime-related files that are in the libsupc++
    directory.

    include/std
      Files meant to be found by #include &lt;name&gt; directives in
      standard-conforming user programs.  

    include/c
      Headers intended to directly include standard C headers. 
      [NB: this can be enabled via --enable-cheaders=c]

    include/c_global 
      Headers intended to include standard C headers in
      the global namespace, and put select names into the std::
      namespace.  [NB: this is the default, and is the same as
      --enable-cheaders=c_global]

    include/c_std 
      Headers intended to include standard C headers
      already in namespace std, and put select names into the std::
      namespace.  [NB: this is the same as --enable-cheaders=c_std]

    include/bits
      Files included by standard headers and by other files in
      the bits directory. 

    include/backward
      Headers provided for backward compatibility, such as &lt;iostream.h&gt;.
      They are not used in this library.

    include/ext
      Headers that define extensions to the standard library.  No
      standard header refers to any of them.

  scripts
    Scripts that are used during the configure, build, make, or test
    process.

  src
    Files that are used in constructing the library, but are not
    installed.

  testsuites/[backward, demangle, ext, performance, thread, 17_* to 27_*]
    Test programs are here, and may be used to begin to exercise the 
    library.  Support for "make check" and "make check-install" is
    complete, and runs through all the subdirectories here when this
    command is issued from the build directory.  Please note that
    "make check" requires DejaGNU 1.4 or later to be installed.  Please
    note that "make check-script" calls the script mkcheck, which
    requires bash, and which may need the paths to bash adjusted to
    work properly, as /bin/bash is assumed.

Other subdirectories contain variant versions of certain files
that are meant to be copied or linked by the configure script.
Currently these are:

  config/abi
  config/cpu
  config/io
  config/locale
  config/os

In addition, a subdirectory holds the convenience library libsupc++.

  libsupc++
    Contains the runtime library for C++, including exception
    handling and memory allocation and deallocation, RTTI, terminate
    handlers, etc.

Note that glibc also has a bits/ subdirectory.  We will either
need to be careful not to collide with names in its bits/
directory; or rename bits to (e.g.) cppbits/.

In files throughout the system, lines marked with an "XXX" indicate
a bug or incompletely-implemented feature.  Lines marked "XXX MT"
indicate a place that may require attention for multi-thread safety.
  </literallayout>

</sect1>

<sect1 id="contrib.coding_style" xreflabel="Coding Style">
  <?dbhtml filename="source_code_style.html"?>
  <title>Coding Style</title>
  <para>
  </para>
  <sect2 id="coding_style.bad_identifiers" xreflabel="coding_style.bad">
    <title>Bad Identifiers</title>
    <para>
      Identifiers that conflict and should be avoided.
    </para>

    <literallayout>
      This is the list of names <quote>reserved to the
      implementation</quote> that have been claimed by certain
      compilers and system headers of interest, and should not be used
      in the library. It will grow, of course.  We generally are
      interested in names that are not all-caps, except for those like
      "_T"

      For Solaris:
      _B
      _C
      _L
      _N
      _P
      _S
      _U
      _X
      _E1
      ..
      _E24

      Irix adds:
      _A
      _G

      MS adds:
      _T

      BSD adds:
      __used
      __unused
      __inline
      _Complex
      __istype
      __maskrune
      __tolower
      __toupper
      __wchar_t
      __wint_t
      _res
      _res_ext
      __tg_*

      SPU adds:
      __ea

      For GCC:

      [Note that this list is out of date. It applies to the old
      name-mangling; in G++ 3.0 and higher a different name-mangling is
      used. In addition, many of the bugs relating to G++ interpreting
      these names as operators have been fixed.]

      The full set of __* identifiers (combined from gcc/cp/lex.c and
      gcc/cplus-dem.c) that are either old or new, but are definitely 
      recognized by the demangler, is:

      __aa
      __aad
      __ad
      __addr
      __adv
      __aer
      __als
      __alshift
      __amd
      __ami
      __aml
      __amu
      __aor
      __apl
      __array
      __ars
      __arshift
      __as
      __bit_and
      __bit_ior
      __bit_not
      __bit_xor
      __call
      __cl
      __cm
      __cn
      __co
      __component
      __compound
      __cond
      __convert
      __delete
      __dl
      __dv
      __eq
      __er
      __ge
      __gt
      __indirect
      __le
      __ls
      __lt
      __max
      __md
      __method_call
      __mi
      __min
      __minus
      __ml
      __mm
      __mn
      __mult
      __mx
      __ne
      __negate
      __new
      __nop
      __nt
      __nw
      __oo
      __op
      __or
      __pl
      __plus
      __postdecrement
      __postincrement
      __pp
      __pt
      __rf
      __rm
      __rs
      __sz
      __trunc_div
      __trunc_mod
      __truth_andif
      __truth_not
      __truth_orif
      __vc
      __vd
      __vn

      SGI badnames:
      __builtin_alloca
      __builtin_fsqrt
      __builtin_sqrt
      __builtin_fabs
      __builtin_dabs
      __builtin_cast_f2i
      __builtin_cast_i2f
      __builtin_cast_d2ll
      __builtin_cast_ll2d
      __builtin_copy_dhi2i
      __builtin_copy_i2dhi
      __builtin_copy_dlo2i
      __builtin_copy_i2dlo
      __add_and_fetch
      __sub_and_fetch
      __or_and_fetch
      __xor_and_fetch
      __and_and_fetch
      __nand_and_fetch
      __mpy_and_fetch
      __min_and_fetch
      __max_and_fetch
      __fetch_and_add
      __fetch_and_sub
      __fetch_and_or
      __fetch_and_xor
      __fetch_and_and
      __fetch_and_nand
      __fetch_and_mpy
      __fetch_and_min
      __fetch_and_max
      __lock_test_and_set
      __lock_release
      __lock_acquire
      __compare_and_swap
      __synchronize
      __high_multiply
      __unix
      __sgi
      __linux__
      __i386__
      __i486__
      __cplusplus
      __embedded_cplusplus
      // long double conversion members mangled as __opr
      // http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00060.html
      _opr
    </literallayout>
  </sect2>

  <sect2 id="coding_style.example" xreflabel="coding_style.example">
    <title>By Example</title>
    <literallayout>
      This library is written to appropriate C++ coding standards. As such,
      it is intended to precede the recommendations of the GNU Coding
      Standard, which can be referenced in full here:

      http://www.gnu.org/prep/standards/standards.html#Formatting

      The rest of this is also interesting reading, but skip the "Design
      Advice" part.

      The GCC coding conventions are here, and are also useful:
      http://gcc.gnu.org/codingconventions.html

      In addition, because it doesn't seem to be stated explicitly anywhere
      else, there is an 80 column source limit.

      ChangeLog entries for member functions should use the
      classname::member function name syntax as follows:

      1999-04-15  Dennis Ritchie  &lt;dr@att.com&gt;

      * src/basic_file.cc (__basic_file::open): Fix thinko in
      _G_HAVE_IO_FILE_OPEN bits.

      Notable areas of divergence from what may be previous local practice
      (particularly for GNU C) include:

      01. Pointers and references
      char* p = "flop";
      char&amp; c = *p;
      -NOT-
      char *p = "flop";  // wrong
      char &amp;c = *p;      // wrong
      
      Reason: In C++, definitions are mixed with executable code. Here,       
      p is being initialized, not *p. This is near-universal
      practice among C++ programmers; it is normal for C hackers
      to switch spontaneously as they gain experience.

      02. Operator names and parentheses
      operator==(type)
      -NOT-
      operator == (type)  // wrong
      
      Reason: The == is part of the function name. Separating
      it makes the declaration look like an expression. 

      03. Function names and parentheses
      void mangle()
      -NOT-
      void mangle ()  // wrong

      Reason: no space before parentheses (except after a control-flow
      keyword) is near-universal practice for C++. It identifies the
      parentheses as the function-call operator or declarator, as 
      opposed to an expression or other overloaded use of parentheses.

      04. Template function indentation
      template&lt;typename T&gt;
      void 
      template_function(args)
      { }
      -NOT-
      template&lt;class T&gt;
      void template_function(args) {};
      
      Reason: In class definitions, without indentation whitespace is
      needed both above and below the declaration to distinguish
      it visually from other members. (Also, re: "typename"
      rather than "class".)  T often could be int, which is 
      not a class. ("class", here, is an anachronism.)

      05. Template class indentation
      template&lt;typename _CharT, typename _Traits&gt;
      class basic_ios : public ios_base
      {
      public:
      // Types:
      };
      -NOT-
      template&lt;class _CharT, class _Traits&gt;
      class basic_ios : public ios_base
      {
      public:
      // Types:
      };
      -NOT-
      template&lt;class _CharT, class _Traits&gt;
      class basic_ios : public ios_base
      {
      public:
      // Types:
      };

      06. Enumerators
      enum
      {
      space = _ISspace,
      print = _ISprint,
      cntrl = _IScntrl
      };
      -NOT-
      enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl };

      07. Member initialization lists
      All one line, separate from class name.

      gribble::gribble() 
      : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
      { }
      -NOT-
      gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
      { }

      08. Try/Catch blocks
      try 
      {
      //
      }   
      catch (...)
      {
      //
      }   
      -NOT-
      try {
      // 
      } catch(...) { 
      //
      }

      09. Member functions declarations and definitions
      Keywords such as extern, static, export, explicit, inline, etc
      go on the line above the function name. Thus

      virtual int   
      foo()
      -NOT-
      virtual int foo()

      Reason: GNU coding conventions dictate return types for functions
      are on a separate line than the function name and parameter list
      for definitions. For C++, where we have member functions that can
      be either inline definitions or declarations, keeping to this
      standard allows all member function names for a given class to be
      aligned to the same margin, increasing readability.


      10. Invocation of member functions with "this-&gt;"
      For non-uglified names, use this-&gt;name to call the function.

      this-&gt;sync()
      -NOT-
      sync()

      Reason: Koenig lookup.

      11. Namespaces
      namespace std
      {
      blah blah blah;
      } // namespace std

      -NOT-

      namespace std {
      blah blah blah;
      } // namespace std

      12. Spacing under protected and private in class declarations:
      space above, none below
      i.e.

      public:
      int foo;

      -NOT-
      public:
      
      int foo;

      13. Spacing WRT return statements.
      no extra spacing before returns, no parenthesis
      i.e.

      }
      return __ret;

      -NOT-
      }

      return __ret;

      -NOT-

      }
      return (__ret);


      14. Location of global variables.
      All global variables of class type, whether in the "user visible"
      space (e.g., cin) or the implementation namespace, must be defined
      as a character array with the appropriate alignment and then later
      re-initialized to the correct value.

      This is due to startup issues on certain platforms, such as AIX.
      For more explanation and examples, see src/globals.cc. All such
      variables should be contained in that file, for simplicity.

      15. Exception abstractions
      Use the exception abstractions found in functexcept.h, which allow
      C++ programmers to use this library with -fno-exceptions. (Even if
      that is rarely advisable, it's a necessary evil for backwards
      compatibility.)

      16. Exception error messages
      All start with the name of the function where the exception is
      thrown, and then (optional) descriptive text is added. Example:

      __throw_logic_error(__N("basic_string::_S_construct NULL not valid"));

      Reason: The verbose terminate handler prints out exception::what(),
      as well as the typeinfo for the thrown exception. As this is the
      default terminate handler, by putting location info into the
      exception string, a very useful error message is printed out for
      uncaught exceptions. So useful, in fact, that non-programmers can
      give useful error messages, and programmers can intelligently
      speculate what went wrong without even using a debugger.

      17. The doxygen style guide to comments is a separate document,
      see index.

      The library currently has a mixture of GNU-C and modern C++ coding
      styles. The GNU C usages will be combed out gradually.

      Name patterns:

      For nonstandard names appearing in Standard headers, we are constrained 
      to use names that begin with underscores. This is called "uglification".
      The convention is:

      Local and argument names:  __[a-z].*

      Examples:  __count  __ix  __s1  

      Type names and template formal-argument names: _[A-Z][^_].*

      Examples:  _Helper  _CharT  _N 

      Member data and function names: _M_.*

      Examples:  _M_num_elements  _M_initialize ()

      Static data members, constants, and enumerations: _S_.*

      Examples: _S_max_elements  _S_default_value

      Don't use names in the same scope that differ only in the prefix, 
      e.g. _S_top and _M_top. See BADNAMES for a list of forbidden names.
      (The most tempting of these seem to be and "_T" and "__sz".)

      Names must never have "__" internally; it would confuse name
      unmanglers on some targets. Also, never use "__[0-9]", same reason.

      --------------------------

      [BY EXAMPLE]
      
      #ifndef  _HEADER_
      #define  _HEADER_ 1

      namespace std
      {
      class gribble
      {
      public:
      gribble() throw();

      gribble(const gribble&amp;);

      explicit 
      gribble(int __howmany);

      gribble&amp; 
      operator=(const gribble&amp;);

      virtual 
      ~gribble() throw ();

      // Start with a capital letter, end with a period.
      inline void  
      public_member(const char* __arg) const;

      // In-class function definitions should be restricted to one-liners.
      int 
      one_line() { return 0 }

      int 
      two_lines(const char* arg) 
      { return strchr(arg, 'a'); }

      inline int 
      three_lines();  // inline, but defined below.

      // Note indentation.
      template&lt;typename _Formal_argument&gt;
      void 
      public_template() const throw();

      template&lt;typename _Iterator&gt;
      void 
      other_template();

      private:
      class _Helper;

      int _M_private_data;
      int _M_more_stuff;
      _Helper* _M_helper;
      int _M_private_function();

      enum _Enum 
      { 
      _S_one, 
      _S_two 
      };

      static void 
      _S_initialize_library();
      };

      // More-or-less-standard language features described by lack, not presence.
      # ifndef _G_NO_LONGLONG
      extern long long _G_global_with_a_good_long_name;  // avoid globals!
      # endif

      // Avoid in-class inline definitions, define separately;
      // likewise for member class definitions:
      inline int
      gribble::public_member() const
      { int __local = 0; return __local; }

      class gribble::_Helper
      {
      int _M_stuff;

      friend class gribble;
      };
      }

      // Names beginning with "__": only for arguments and
      //   local variables; never use "__" in a type name, or
      //   within any name; never use "__[0-9]".

      #endif /* _HEADER_ */


      namespace std 
      {
      template&lt;typename T&gt;  // notice: "typename", not "class", no space
      long_return_value_type&lt;with_many, args&gt;  
      function_name(char* pointer,               // "char *pointer" is wrong.
      char* argument, 
      const Reference&amp; ref)
      {
      // int a_local;  /* wrong; see below. */
      if (test) 
      { 
      nested code 
      }
      
      int a_local = 0;  // declare variable at first use.

      //  char a, b, *p;   /* wrong */
      char a = 'a';
      char b = a + 1;
      char* c = "abc";  // each variable goes on its own line, always.

      // except maybe here...
      for (unsigned i = 0, mask = 1; mask; ++i, mask &lt;&lt;= 1) {
      // ...
      }
      }
      
      gribble::gribble()
      : _M_private_data(0), _M_more_stuff(0), _M_helper(0);
      { }

      inline int 
      gribble::three_lines()
      {
      // doesn't fit in one line.
      }
      } // namespace std
    </literallayout>
  </sect2>
</sect1>  

<sect1 id="contrib.doc_style" xreflabel="Documentation Style">
  <?dbhtml filename="documentation_style.html"?>
  <title>Documentation Style</title>
  <sect2 id="doc_style.doxygen" xreflabel="doc_style.doxygen">
    <title>Doxygen</title>
    <sect3 id="doxygen.prereq" xreflabel="doxygen.prereq">
      <title>Prerequisites</title>
      <para>
	Prerequisite tools are Bash 2.x,
	<ulink url="http://www.doxygen.org/">Doxygen</ulink>, and
	the <ulink url="http://www.gnu.org/software/coreutils/">GNU
	coreutils</ulink>. (GNU versions of find, xargs, and possibly
	sed and grep are used, just because the GNU versions make
	things very easy.)
      </para>

      <para>
	To generate the pretty pictures and hierarchy
	graphs, the
	<ulink url="http://www.research.att.com/sw/tools/graphviz/download.html">Graphviz</ulink>
	package will need to be installed. 
      </para>
    </sect3>

    <sect3 id="doxygen.rules" xreflabel="doxygen.rules">
      <title>Generating the Doxygen Files</title>
      <para>
	The following Makefile rules run Doxygen to generate HTML
	docs, XML docs, and the man pages.
      </para>

      <para>
      <screen><userinput>make doc-html-doxygen</userinput></screen>
      </para>

      <para>
      <screen><userinput>make doc-xml-doxygen</userinput></screen>
      </para>

      <para>
      <screen><userinput>make doc-man-doxygen</userinput></screen>
      </para>

      <para>
	Careful observers will see that the Makefile rules simply call
	a script from the source tree, <filename>run_doxygen</filename>, which
	does the actual work of running Doxygen and then (most
	importantly) massaging the output files. If for some reason
	you prefer to not go through the Makefile, you can call this
	script directly. (Start by passing <literal>--help</literal>.)
      </para>

      <para>
	If you wish to tweak the Doxygen settings, do so by editing
	<filename>doc/doxygen/user.cfg.in</filename>. Notes to fellow
	library hackers are written in triple-# comments.
      </para>

    </sect3>

    <sect3 id="doxygen.markup" xreflabel="doxygen.markup">
      <title>Markup</title>

      <para>
	In general, libstdc++ files should be formatted according to
	the rules found in the
	<link linkend="contrib.coding_style">Coding Standard</link>. Before
	any doxygen-specific formatting tweaks are made, please try to
	make sure that the initial formatting is sound.
      </para>

      <para>
	Adding Doxygen markup to a file (informally called
	<quote>doxygenating</quote>) is very simple. The Doxygen manual can be
	found
	<ulink url="http://www.stack.nl/~dimitri/doxygen/download.html#latestman">here</ulink>.
	We try to use a very-recent version of Doxygen.
      </para>

      <para>
	For classes, use
	<classname>deque</classname>/<classname>vector</classname>/<classname>list</classname>
	and <classname>std::pair</classname> as examples.  For
	functions, see their member functions, and the free functions
	in <filename>stl_algobase.h</filename>. Member functions of
	other container-like types should read similarly to these
	member functions.
      </para>

      <para>
	These points accompany the first list in section 3.1 of the
	Doxygen manual:
      </para>

      <orderedlist>
	<listitem><para>Use the Javadoc style...</para></listitem>
	<listitem>
	  <para>
	    ...not the Qt style. The intermediate *'s are preferred.
	  </para>
	</listitem>
	<listitem>
	  <para>
	    Use the triple-slash style only for one-line comments (the
	    <quote>brief</quote> mode).  Very recent versions of Doxygen permit
	    full-mode comments in triple-slash blocks, but the
	    formatting still comes out wonky.
	  </para>
	</listitem>
	<listitem>
	  <para>
	    This is disgusting. Don't do this.
	  </para>
	</listitem>
      </orderedlist>

      <para>
	Use the @-style of commands, not the !-style. Please be
	careful about whitespace in your markup comments. Most of the
	time it doesn't matter; doxygen absorbs most whitespace, and
	both HTML and *roff are agnostic about whitespace. However,
	in &lt;pre&gt; blocks and @code/@endcode sections, spacing can
	have <quote>interesting</quote> effects.
      </para>

      <para>
	Use either kind of grouping, as
	appropriate. <filename>doxygroups.cc</filename> exists for this
	purpose. See <filename>stl_iterator.h</filename> for a good example
	of the <quote>other</quote> kind of grouping.
      </para>

      <para>
	Please use markup tags like @p and @a when referring to things
	such as the names of function parameters. Use @e for emphasis
	when necessary. Use @c to refer to other standard names.
	(Examples of all these abound in the present code.)
      </para>

    </sect3>

  </sect2>

  <sect2 id="doc_style.docbook" xreflabel="doc_style.docbook">
    <title>Docbook</title>

    <sect3 id="docbook.prereq" xreflabel="docbook.prereq">
      <title>Prerequisites</title>
      <para>
	Editing the DocBook sources requires an XML editor. Many
	exist: some notable options
	include <command>emacs</command>, <application>Kate</application>,
	or <application>Conglomerate</application>.
      </para>

      <para>
	Some editors support special <quote>XML Validation</quote>
	modes that can validate the file as it is
	produced. Recommended is the <command>nXML Mode</command>
	for <command>emacs</command>.
      </para>

      <para>
	Besides an editor, additional DocBook files and XML tools are
	also required.
      </para>

      <para>
	Access to the DocBook stylesheets and DTD is required. The
	stylesheets are usually packaged by vendor, in something
	like <filename>docbook-style-xsl</filename>. To exactly match
	generated output, please use a version of the stylesheets
	equivalent
	to <filename>docbook-style-xsl-1.74.0-5</filename>. The
	installation directory for this package corresponds to
	the <literal>XSL_STYLE_DIR</literal>
	in <filename>doc/Makefile.am</filename> and defaults
	to <filename class="directory">/usr/share/sgml/docbook/xsl-stylesheets</filename>.
      </para>

      <para>
	For processing XML, an XML processor and some style
	sheets are necessary. Defaults are <command>xsltproc</command>
	provided by <filename>libxslt</filename>.
      </para>

      <para>
	For validating the XML document, you'll need
	something like <command>xmllint</command> and access to the
	DocBook DTD. These are provided
	by a vendor package like <filename>lixml2</filename>.
      </para>

      <para>
	For PDF output, something that transforms valid XML to PDF is
	required. Possible solutions include <command>xmlto</command>,
	<ulink url="http://xmlgraphics.apache.org/fop/">Apache
	FOP</ulink>, or <command>prince</command>. Other options are
	listed on the DocBook web <ulink
	url="http://wiki.docbook.org/topic/DocBookPublishingTools">pages</ulink>. Please
	consult the <email>libstdc++@gcc.gnu.org</email> list when
	preparing printed manuals for current best practice and suggestions.
      </para>
  
      <para>
	Make sure that the XML documentation and markup is valid for
	any change. This can be done easily, with the validation rules
	in the <filename>Makefile</filename>, which is equivalent to doing: 
      </para>

	<screen>
	  <userinput>
xmllint --noout --valid <filename>xml/index.xml</filename>
	  </userinput>
	</screen>
    </sect3>

    <sect3 id="docbook.rules" xreflabel="docbook.rules">
      <title>Generating the DocBook Files</title>

      <para>
	The following Makefile rules generate (in order): an HTML
	version of all the documentation, a PDF version of the same, a
	single XML document, and the result of validating the entire XML
	document.
      </para>

      <para>
      <screen><userinput>make doc-html</userinput></screen>
      </para>

      <para>
      <screen><userinput>make doc-pdf</userinput></screen>
      </para>

      <para>
      <screen><userinput>make doc-xml-single</userinput></screen>
      </para>

      <para>
      <screen><userinput>make doc-xml-validate</userinput></screen>
      </para>

    </sect3>

    <sect3 id="docbook.examples" xreflabel="docbook.examples">
      <title>File Organization and Basics</title>

    <literallayout>
      <emphasis>Which files are important</emphasis>

      All Docbook files are in the directory
      libstdc++-v3/doc/xml

      Inside this directory, the files of importance:
      spine.xml  	- index to documentation set
      manual/spine.xml  - index to manual
      manual/*.xml  	- individual chapters and sections of the manual
      faq.xml  		- index to FAQ
      api.xml  		- index to source level / API 

      All *.txml files are template xml files, i.e., otherwise empty files with
      the correct structure, suitable for filling in with new information.

      <emphasis>Canonical Writing Style</emphasis>

      class template
      function template
      member function template
      (via C++ Templates, Vandevoorde)

      class in namespace std: allocator, not std::allocator

      header file: iostream, not &lt;iostream&gt;


      <emphasis>General structure</emphasis>

      &lt;set&gt;
      &lt;book&gt;
      &lt;/book&gt;

      &lt;book&gt;
      &lt;chapter&gt;
      &lt;/chapter&gt;
      &lt;/book&gt;

      &lt;book&gt;	
      &lt;part&gt;
      &lt;chapter&gt;
      &lt;section&gt;
      &lt;/section&gt;

      &lt;sect1&gt;
      &lt;/sect1&gt;

      &lt;sect1&gt;
      &lt;sect2&gt;
      &lt;/sect2&gt;
      &lt;/sect1&gt;
      &lt;/chapter&gt;

      &lt;chapter&gt;
      &lt;/chapter&gt;
      &lt;/part&gt;  
      &lt;/book&gt;

      &lt;/set&gt;
    </literallayout>
    </sect3>

    <sect3 id="docbook.markup" xreflabel="docbook.markup">
      <title>Markup By Example</title>

<para>
Complete details on Docbook markup can be found in the DocBook Element
Reference, <ulink url="http://www.docbook.org/tdg/en/html/part2.html">online</ulink>. An
incomplete reference for HTML to Docbook conversion is detailed in the
table below.
</para>

<table frame='all'>
<title>HTML to Docbook XML markup comparison</title>
<tgroup cols='2' align='left' colsep='1' rowsep='1'>
<colspec colname='c1'></colspec>
<colspec colname='c2'></colspec>

  <thead>
    <row>
      <entry>HTML</entry>
      <entry>XML</entry>
    </row>
  </thead>

  <tbody>
    <row>
      <entry>&lt;p&gt;</entry>
      <entry>&lt;para&gt;</entry>
    </row>
    <row>
      <entry>&lt;pre&gt;</entry>
      <entry>&lt;computeroutput&gt;, &lt;programlisting&gt;, 
	&lt;literallayout&gt;</entry>
    </row>
    <row>
      <entry>&lt;ul&gt;</entry>
      <entry>&lt;itemizedlist&gt;</entry>
    </row>
    <row>
      <entry>&lt;ol&gt;</entry>
      <entry>&lt;orderedlist&gt;</entry>
    </row>
    <row>
      <entry>&lt;il&gt;</entry>
      <entry>&lt;listitem&gt;</entry>
    </row>
    <row>
      <entry>&lt;dl&gt;</entry>
      <entry>&lt;variablelist&gt;</entry>
    </row>
    <row>
      <entry>&lt;dt&gt;</entry>
      <entry>&lt;term&gt;</entry>
    </row>
    <row>
      <entry>&lt;dd&gt;</entry>
      <entry>&lt;listitem&gt;</entry>
    </row>

    <row>
      <entry>&lt;a href=""&gt;</entry>
      <entry>&lt;ulink url=""&gt;</entry>
    </row>
    <row>
      <entry>&lt;code&gt;</entry>
      <entry>&lt;literal&gt;, &lt;programlisting&gt;</entry>
    </row>
    <row>
      <entry>&lt;strong&gt;</entry>
      <entry>&lt;emphasis&gt;</entry>
    </row>
    <row>
      <entry>&lt;em&gt;</entry>
      <entry>&lt;emphasis&gt;</entry>
    </row>
    <row>
      <entry>&quot;</entry>
      <entry>&lt;quote&gt;</entry>
    </row>
   </tbody>
</tgroup>
</table>

<para>
  And examples of detailed markup for which there are no real HTML
  equivalents are listed in the table below.
</para>

<table frame='all'>
<title>Docbook XML Element Use</title>
<tgroup cols='2' align='left' colsep='1' rowsep='1'>
<colspec colname='c1'></colspec>
<colspec colname='c2'></colspec>

  <thead>
    <row>
      <entry>Element</entry>
      <entry>Use</entry>
    </row>
  </thead>

  <tbody>
    <row>
      <entry>&lt;structname&gt;</entry>
      <entry>&lt;structname&gt;char_traits&lt;/structname&gt;</entry>
    </row>
    <row>
      <entry>&lt;classname&gt;</entry>
      <entry>&lt;classname&gt;string&lt;/classname&gt;</entry>
    </row>
    <row>
      <entry>&lt;function&gt;</entry>
      <entry>
	<para>&lt;function&gt;clear()&lt;/function&gt;</para>
	<para>&lt;function&gt;fs.clear()&lt;/function&gt;</para>
      </entry>
    </row>
    <row>
      <entry>&lt;type&gt;</entry>
      <entry>&lt;type&gt;long long&lt;/type&gt;</entry>
    </row>
    <row>
      <entry>&lt;varname&gt;</entry>
      <entry>&lt;varname&gt;fs&lt;/varname&gt;</entry>
    </row>
    <row>
      <entry>&lt;literal&gt;</entry>
      <entry>
	<para>&lt;literal&gt;-Weffc++&lt;/literal&gt;</para>
	<para>&lt;literal&gt;rel_ops&lt;/literal&gt;</para>
      </entry>
    </row>
    <row>
      <entry>&lt;constant&gt;</entry>
      <entry>
	<para>&lt;constant&gt;_GNU_SOURCE&lt;/constant&gt;</para>
	<para>&lt;constant&gt;3.0&lt;/constant&gt;</para>
      </entry>
    </row>
    <row>
      <entry>&lt;command&gt;</entry>
      <entry>&lt;command&gt;g++&lt;/command&gt;</entry>
    </row>
    <row>
      <entry>&lt;errortext&gt;</entry>
      <entry>&lt;errortext&gt;In instantiation of&lt;/errortext&gt;</entry>
    </row>
    <row>
      <entry>&lt;filename&gt;</entry>
      <entry>
	<para>&lt;filename class="headerfile"&gt;ctype.h&lt;/filename&gt;</para>
	<para>&lt;filename class="directory"&gt;/home/gcc/build&lt;/filename&gt;</para>
      </entry>
    </row>
   </tbody>
</tgroup>
</table>

    </sect3>
  </sect2>

</sect1>  

<sect1 id="contrib.design_notes" xreflabel="Design Notes">
  <?dbhtml filename="source_design_notes.html"?>
  <title>Design Notes</title>
  <para>
  </para>

  <literallayout>

    The Library
    -----------

    This paper is covers two major areas:

    - Features and policies not mentioned in the standard that
    the quality of the library implementation depends on, including
    extensions and "implementation-defined" features;

    - Plans for required but unimplemented library features and
    optimizations to them.

    Overhead
    --------

    The standard defines a large library, much larger than the standard
    C library. A naive implementation would suffer substantial overhead
    in compile time, executable size, and speed, rendering it unusable
    in many (particularly embedded) applications. The alternative demands
    care in construction, and some compiler support, but there is no
    need for library subsets.

    What are the sources of this overhead?  There are four main causes:

    - The library is specified almost entirely as templates, which
    with current compilers must be included in-line, resulting in
    very slow builds as tens or hundreds of thousands of lines
    of function definitions are read for each user source file.
    Indeed, the entire SGI STL, as well as the dos Reis valarray,
    are provided purely as header files, largely for simplicity in
    porting. Iostream/locale is (or will be) as large again.

    - The library is very flexible, specifying a multitude of hooks
    where users can insert their own code in place of defaults.
    When these hooks are not used, any time and code expended to
    support that flexibility is wasted.

    - Templates are often described as causing to "code bloat". In
    practice, this refers (when it refers to anything real) to several
    independent processes. First, when a class template is manually
    instantiated in its entirely, current compilers place the definitions
    for all members in a single object file, so that a program linking
    to one member gets definitions of all. Second, template functions
    which do not actually depend on the template argument are, under
    current compilers, generated anew for each instantiation, rather
    than being shared with other instantiations. Third, some of the
    flexibility mentioned above comes from virtual functions (both in
    regular classes and template classes) which current linkers add
    to the executable file even when they manifestly cannot be called.

    - The library is specified to use a language feature, exceptions,
    which in the current gcc compiler ABI imposes a run time and
    code space cost to handle the possibility of exceptions even when
    they are not used. Under the new ABI (accessed with -fnew-abi),
    there is a space overhead and a small reduction in code efficiency
    resulting from lost optimization opportunities associated with
    non-local branches associated with exceptions.

    What can be done to eliminate this overhead?  A variety of coding
    techniques, and compiler, linker and library improvements and
    extensions may be used, as covered below. Most are not difficult,
    and some are already implemented in varying degrees.

    Overhead: Compilation Time
    --------------------------

    Providing "ready-instantiated" template code in object code archives
    allows us to avoid generating and optimizing template instantiations
    in each compilation unit which uses them. However, the number of such
    instantiations that are useful to provide is limited, and anyway this
    is not enough, by itself, to minimize compilation time. In particular,
    it does not reduce time spent parsing conforming headers.

    Quicker header parsing will depend on library extensions and compiler
    improvements.  One approach is some variation on the techniques
    previously marketed as "pre-compiled headers", now standardized as
    support for the "export" keyword. "Exported" template definitions
    can be placed (once) in a "repository" -- really just a library, but
    of template definitions rather than object code -- to be drawn upon
    at link time when an instantiation is needed, rather than placed in
    header files to be parsed along with every compilation unit.

    Until "export" is implemented we can put some of the lengthy template
    definitions in #if guards or alternative headers so that users can skip
    over the full definitions when they need only the ready-instantiated
    specializations.

    To be precise, this means that certain headers which define
    templates which users normally use only for certain arguments
    can be instrumented to avoid exposing the template definitions
    to the compiler unless a macro is defined. For example, in
    &lt;string&gt;, we might have:

    template &lt;class _CharT, ... &gt; class basic_string {
    ... // member declarations
    };
    ... // operator declarations

    #ifdef _STRICT_ISO_
    # if _G_NO_TEMPLATE_EXPORT
    #   include &lt;bits/std_locale.h&gt;  // headers needed by definitions
    #   ...
    #   include &lt;bits/string.tcc&gt;  // member and global template definitions.
    # endif
    #endif

    Users who compile without specifying a strict-ISO-conforming flag
    would not see many of the template definitions they now see, and rely
    instead on ready-instantiated specializations in the library. This
    technique would be useful for the following substantial components:
    string, locale/iostreams, valarray. It would *not* be useful or
    usable with the following: containers, algorithms, iterators,
    allocator. Since these constitute a large (though decreasing)
    fraction of the library, the benefit the technique offers is
    limited.

    The language specifies the semantics of the "export" keyword, but
    the gcc compiler does not yet support it. When it does, problems
    with large template inclusions can largely disappear, given some
    minor library reorganization, along with the need for the apparatus
    described above.

    Overhead: Flexibility Cost
    --------------------------

    The library offers many places where users can specify operations
    to be performed by the library in place of defaults. Sometimes
    this seems to require that the library use a more-roundabout, and
    possibly slower, way to accomplish the default requirements than
    would be used otherwise.

    The primary protection against this overhead is thorough compiler
    optimization, to crush out layers of inline function interfaces.
    Kuck &amp; Associates has demonstrated the practicality of this kind
    of optimization.

    The second line of defense against this overhead is explicit
    specialization. By defining helper function templates, and writing
    specialized code for the default case, overhead can be eliminated
    for that case without sacrificing flexibility. This takes full
    advantage of any ability of the optimizer to crush out degenerate
    code.

    The library specifies many virtual functions which current linkers
    load even when they cannot be called. Some minor improvements to the
    compiler and to ld would eliminate any such overhead by simply
    omitting virtual functions that the complete program does not call.
    A prototype of this work has already been done. For targets where
    GNU ld is not used, a "pre-linker" could do the same job.

    The main areas in the standard interface where user flexibility
    can result in overhead are:

    - Allocators:  Containers are specified to use user-definable
    allocator types and objects, making tuning for the container
    characteristics tricky.

    - Locales: the standard specifies locale objects used to implement
    iostream operations, involving many virtual functions which use
    streambuf iterators.

    - Algorithms and containers: these may be instantiated on any type,
    frequently duplicating code for identical operations.

    - Iostreams and strings: users are permitted to use these on their
    own types, and specify the operations the stream must use on these
    types.

    Note that these sources of overhead are _avoidable_. The techniques
    to avoid them are covered below.

    Code Bloat
    ----------

    In the SGI STL, and in some other headers, many of the templates
    are defined "inline" -- either explicitly or by their placement
    in class definitions -- which should not be inline. This is a
    source of code bloat. Matt had remarked that he was relying on
    the compiler to recognize what was too big to benefit from inlining,
    and generate it out-of-line automatically. However, this also can
    result in code bloat except where the linker can eliminate the extra
    copies.

    Fixing these cases will require an audit of all inline functions
    defined in the library to determine which merit inlining, and moving
    the rest out of line. This is an issue mainly in chapters 23, 25, and
    27. Of course it can be done incrementally, and we should generally
    accept patches that move large functions out of line and into ".tcc"
    files, which can later be pulled into a repository. Compiler/linker
    improvements to recognize very large inline functions and move them
    out-of-line, but shared among compilation units, could make this
    work unnecessary.

    Pre-instantiating template specializations currently produces large
    amounts of dead code which bloats statically linked programs. The
    current state of the static library, libstdc++.a, is intolerable on
    this account, and will fuel further confused speculation about a need
    for a library "subset". A compiler improvement that treats each
    instantiated function as a separate object file, for linking purposes,
    would be one solution to this problem. An alternative would be to
    split up the manual instantiation files into dozens upon dozens of
    little files, each compiled separately, but an abortive attempt at
    this was done for &lt;string&gt; and, though it is far from complete, it
    is already a nuisance. A better interim solution (just until we have
    "export") is badly needed.

    When building a shared library, the current compiler/linker cannot
    automatically generate the instantiations needed. This creates a
    miserable situation; it means any time something is changed in the
    library, before a shared library can be built someone must manually
    copy the declarations of all templates that are needed by other parts
    of the library to an "instantiation" file, and add it to the build
    system to be compiled and linked to the library. This process is
    readily automated, and should be automated as soon as possible.
    Users building their own shared libraries experience identical
    frustrations.

    Sharing common aspects of template definitions among instantiations
    can radically reduce code bloat. The compiler could help a great
    deal here by recognizing when a function depends on nothing about
    a template parameter, or only on its size, and giving the resulting
    function a link-name "equate" that allows it to be shared with other
    instantiations. Implementation code could take advantage of the
    capability by factoring out code that does not depend on the template
    argument into separate functions to be merged by the compiler.

    Until such a compiler optimization is implemented, much can be done
    manually (if tediously) in this direction. One such optimization is
    to derive class templates from non-template classes, and move as much
    implementation as possible into the base class. Another is to partial-
    specialize certain common instantiations, such as vector&lt;T*&gt;, to share
    code for instantiations on all types T. While these techniques work,
    they are far from the complete solution that a compiler improvement
    would afford.

    Overhead: Expensive Language Features
    -------------------------------------

    The main "expensive" language feature used in the standard library
    is exception support, which requires compiling in cleanup code with
    static table data to locate it, and linking in library code to use
    the table. For small embedded programs the amount of such library
    code and table data is assumed by some to be excessive. Under the
    "new" ABI this perception is generally exaggerated, although in some
    cases it may actually be excessive.

    To implement a library which does not use exceptions directly is
    not difficult given minor compiler support (to "turn off" exceptions
    and ignore exception constructs), and results in no great library
    maintenance difficulties. To be precise, given "-fno-exceptions",
    the compiler should treat "try" blocks as ordinary blocks, and
    "catch" blocks as dead code to ignore or eliminate. Compiler
    support is not strictly necessary, except in the case of "function
    try blocks"; otherwise the following macros almost suffice:

    #define throw(X)
    #define try      if (true)
    #define catch(X) else if (false)

    However, there may be a need to use function try blocks in the
    library implementation, and use of macros in this way can make
    correct diagnostics impossible. Furthermore, use of this scheme
    would require the library to call a function to re-throw exceptions
    from a try block. Implementing the above semantics in the compiler
    is preferable.

    Given the support above (however implemented) it only remains to
    replace code that "throws" with a call to a well-documented "handler"
    function in a separate compilation unit which may be replaced by
    the user. The main source of exceptions that would be difficult
    for users to avoid is memory allocation failures, but users can
    define their own memory allocation primitives that never throw.
    Otherwise, the complete list of such handlers, and which library
    functions may call them, would be needed for users to be able to
    implement the necessary substitutes. (Fortunately, they have the
    source code.)

    Opportunities
    -------------

    The template capabilities of C++ offer enormous opportunities for
    optimizing common library operations, well beyond what would be
    considered "eliminating overhead". In particular, many operations
    done in Glibc with macros that depend on proprietary language
    extensions can be implemented in pristine Standard C++. For example,
    the chapter 25 algorithms, and even C library functions such as strchr,
    can be specialized for the case of static arrays of known (small) size.

    Detailed optimization opportunities are identified below where
    the component where they would appear is discussed. Of course new
    opportunities will be identified during implementation.

    Unimplemented Required Library Features
    ---------------------------------------

    The standard specifies hundreds of components, grouped broadly by
    chapter. These are listed in excruciating detail in the CHECKLIST
    file.

    17 general
    18 support
    19 diagnostics
    20 utilities
    21 string
    22 locale
    23 containers
    24 iterators
    25 algorithms
    26 numerics
    27 iostreams
    Annex D  backward compatibility

    Anyone participating in implementation of the library should obtain
    a copy of the standard, ISO 14882.  People in the U.S. can obtain an
    electronic copy for US$18 from ANSI's web site. Those from other
    countries should visit http://www.iso.ch/ to find out the location
    of their country's representation in ISO, in order to know who can
    sell them a copy.

    The emphasis in the following sections is on unimplemented features
    and optimization opportunities.

    Chapter 17  General
    -------------------

    Chapter 17 concerns overall library requirements.

    The standard doesn't mention threads. A multi-thread (MT) extension
    primarily affects operators new and delete (18), allocator (20),
    string (21), locale (22), and iostreams (27). The common underlying
    support needed for this is discussed under chapter 20.

    The standard requirements on names from the C headers create a
    lot of work, mostly done. Names in the C headers must be visible
    in the std:: and sometimes the global namespace; the names in the
    two scopes must refer to the same object. More stringent is that
    Koenig lookup implies that any types specified as defined in std::
    really are defined in std::. Names optionally implemented as
    macros in C cannot be macros in C++. (An overview may be read at
    &lt;http://www.cantrip.org/cheaders.html&gt;). The scripts "inclosure"
    and "mkcshadow", and the directories shadow/ and cshadow/, are the
    beginning of an effort to conform in this area.

    A correct conforming definition of C header names based on underlying
    C library headers, and practical linking of conforming namespaced
    customer code with third-party C libraries depends ultimately on
    an ABI change, allowing namespaced C type names to be mangled into
    type names as if they were global, somewhat as C function names in a
    namespace, or C++ global variable names, are left unmangled. Perhaps
    another "extern" mode, such as 'extern "C-global"' would be an
    appropriate place for such type definitions. Such a type would
    affect mangling as follows:

    namespace A {
    struct X {};
    extern "C-global" {  // or maybe just 'extern "C"'
    struct Y {};
    };
    }
    void f(A::X*);  // mangles to f__FPQ21A1X
    void f(A::Y*);  // mangles to f__FP1Y

    (It may be that this is really the appropriate semantics for regular
    'extern "C"', and 'extern "C-global"', as an extension, would not be
    necessary.) This would allow functions declared in non-standard C headers
    (and thus fixable by neither us nor users) to link properly with functions
    declared using C types defined in properly-namespaced headers. The
    problem this solves is that C headers (which C++ programmers do persist
    in using) frequently forward-declare C struct tags without including
    the header where the type is defined, as in

    struct tm;
    void munge(tm*);

    Without some compiler accommodation, munge cannot be called by correct
    C++ code using a pointer to a correctly-scoped tm* value.

    The current C headers use the preprocessor extension "#include_next",
    which the compiler complains about when run "-pedantic".
    (Incidentally, it appears that "-fpedantic" is currently ignored,
    probably a bug.)  The solution in the C compiler is to use
    "-isystem" rather than "-I", but unfortunately in g++ this seems
    also to wrap the whole header in an 'extern "C"' block, so it's
    unusable for C++ headers. The correct solution appears to be to
    allow the various special include-directory options, if not given
    an argument, to affect subsequent include-directory options additively,
    so that if one said

    -pedantic -iprefix $(prefix) \
    -idirafter -ino-pedantic -ino-extern-c -iwithprefix -I g++-v3 \
    -iwithprefix -I g++-v3/ext

    the compiler would search $(prefix)/g++-v3 and not report
    pedantic warnings for files found there, but treat files in
    $(prefix)/g++-v3/ext pedantically. (The undocumented semantics
    of "-isystem" in g++ stink. Can they be rescinded?  If not it
    must be replaced with something more rationally behaved.)

    All the C headers need the treatment above; in the standard these
    headers are mentioned in various chapters. Below, I have only
    mentioned those that present interesting implementation issues.

    The components identified as "mostly complete", below, have not been
    audited for conformance. In many cases where the library passes
    conformance tests we have non-conforming extensions that must be
    wrapped in #if guards for "pedantic" use, and in some cases renamed
    in a conforming way for continued use in the implementation regardless
    of conformance flags.

    The STL portion of the library still depends on a header
    stl/bits/stl_config.h full of #ifdef clauses. This apparatus
    should be replaced with autoconf/automake machinery.

    The SGI STL defines a type_traits&lt;&gt; template, specialized for
    many types in their code including the built-in numeric and
    pointer types and some library types, to direct optimizations of
    standard functions. The SGI compiler has been extended to generate
    specializations of this template automatically for user types,
    so that use of STL templates on user types can take advantage of
    these optimizations. Specializations for other, non-STL, types
    would make more optimizations possible, but extending the gcc
    compiler in the same way would be much better. Probably the next
    round of standardization will ratify this, but probably with
    changes, so it probably should be renamed to place it in the
    implementation namespace.

    The SGI STL also defines a large number of extensions visible in
    standard headers. (Other extensions that appear in separate headers
    have been sequestered in subdirectories ext/ and backward/.)  All
    these extensions should be moved to other headers where possible,
    and in any case wrapped in a namespace (not std!), and (where kept
    in a standard header) girded about with macro guards. Some cannot be
    moved out of standard headers because they are used to implement
    standard features.  The canonical method for accommodating these
    is to use a protected name, aliased in macro guards to a user-space
    name. Unfortunately C++ offers no satisfactory template typedef
    mechanism, so very ad-hoc and unsatisfactory aliasing must be used
    instead.

    Implementation of a template typedef mechanism should have the highest
    priority among possible extensions, on the same level as implementation
    of the template "export" feature.

    Chapter 18  Language support
    ----------------------------

    Headers: &lt;limits&gt; &lt;new&gt; &lt;typeinfo&gt; &lt;exception&gt;
    C headers: &lt;cstddef&gt; &lt;climits&gt; &lt;cfloat&gt;  &lt;cstdarg&gt; &lt;csetjmp&gt;
    &lt;ctime&gt;   &lt;csignal&gt; &lt;cstdlib&gt; (also 21, 25, 26)

    This defines the built-in exceptions, rtti, numeric_limits&lt;&gt;,
    operator new and delete. Much of this is provided by the
    compiler in its static runtime library.

    Work to do includes defining numeric_limits&lt;&gt; specializations in
    separate files for all target architectures. Values for integer types
    except for bool and wchar_t are readily obtained from the C header
    &lt;limits.h&gt;, but values for the remaining numeric types (bool, wchar_t,
    float, double, long double) must be entered manually. This is
    largely dog work except for those members whose values are not
    easily deduced from available documentation. Also, this involves
    some work in target configuration to identify the correct choice of
    file to build against and to install.

    The definitions of the various operators new and delete must be
    made thread-safe, which depends on a portable exclusion mechanism,
    discussed under chapter 20.  Of course there is always plenty of
    room for improvements to the speed of operators new and delete.

    &lt;cstdarg&gt;, in Glibc, defines some macros that gcc does not allow to
    be wrapped into an inline function. Probably this header will demand
    attention whenever a new target is chosen. The functions atexit(),
    exit(), and abort() in cstdlib have different semantics in C++, so
    must be re-implemented for C++.

    Chapter 19  Diagnostics
    -----------------------

    Headers: &lt;stdexcept&gt;
    C headers: &lt;cassert&gt; &lt;cerrno&gt;

    This defines the standard exception objects, which are "mostly complete".
    Cygnus has a version, and now SGI provides a slightly different one.
    It makes little difference which we use.

    The C global name "errno", which C allows to be a variable or a macro,
    is required in C++ to be a macro. For MT it must typically result in
    a function call.

    Chapter 20  Utilities
    ---------------------
    Headers: &lt;utility&gt; &lt;functional&gt; &lt;memory&gt;
    C header: &lt;ctime&gt; (also in 18)

    SGI STL provides "mostly complete" versions of all the components
    defined in this chapter. However, the auto_ptr&lt;&gt; implementation
    is known to be wrong. Furthermore, the standard definition of it
    is known to be unimplementable as written. A minor change to the
    standard would fix it, and auto_ptr&lt;&gt; should be adjusted to match.

    Multi-threading affects the allocator implementation, and there must
    be configuration/installation choices for different users' MT
    requirements. Anyway, users will want to tune allocator options
    to support different target conditions, MT or no.

    The primitives used for MT implementation should be exposed, as an
    extension, for users' own work. We need cross-CPU "mutex" support,
    multi-processor shared-memory atomic integer operations, and single-
    processor uninterruptible integer operations, and all three configurable
    to be stubbed out for non-MT use, or to use an appropriately-loaded
    dynamic library for the actual runtime environment, or statically
    compiled in for cases where the target architecture is known.

    Chapter 21  String
    ------------------
    Headers: &lt;string&gt;
    C headers: &lt;cctype&gt; &lt;cwctype&gt; &lt;cstring&gt; &lt;cwchar&gt; (also in 27)
    &lt;cstdlib&gt; (also in 18, 25, 26)

    We have "mostly-complete" char_traits&lt;&gt; implementations. Many of the
    char_traits&lt;char&gt; operations might be optimized further using existing
    proprietary language extensions.

    We have a "mostly-complete" basic_string&lt;&gt; implementation. The work
    to manually instantiate char and wchar_t specializations in object
    files to improve link-time behavior is extremely unsatisfactory,
    literally tripling library-build time with no commensurate improvement
    in static program link sizes. It must be redone. (Similar work is
    needed for some components in chapters 22 and 27.)

    Other work needed for strings is MT-safety, as discussed under the
    chapter 20 heading.

    The standard C type mbstate_t from &lt;cwchar&gt; and used in char_traits&lt;&gt;
    must be different in C++ than in C, because in C++ the default constructor
    value mbstate_t() must be the "base" or "ground" sequence state.
    (According to the likely resolution of a recently raised Core issue,
    this may become unnecessary. However, there are other reasons to
    use a state type not as limited as whatever the C library provides.)
    If we might want to provide conversions from (e.g.) internally-
    represented EUC-wide to externally-represented Unicode, or vice-
    versa, the mbstate_t we choose will need to be more accommodating
    than what might be provided by an underlying C library.

    There remain some basic_string template-member functions which do
    not overload properly with their non-template brethren. The infamous
    hack akin to what was done in vector&lt;&gt; is needed, to conform to
    23.1.1 para 10. The CHECKLIST items for basic_string marked 'X',
    or incomplete, are so marked for this reason.

    Replacing the string iterators, which currently are simple character
    pointers, with class objects would greatly increase the safety of the
    client interface, and also permit a "debug" mode in which range,
    ownership, and validity are rigorously checked. The current use of
    raw pointers as string iterators is evil. vector&lt;&gt; iterators need the
    same treatment. Note that the current implementation freely mixes
    pointers and iterators, and that must be fixed before safer iterators
    can be introduced.

    Some of the functions in &lt;cstring&gt; are different from the C version.
    generally overloaded on const and non-const argument pointers. For
    example, in &lt;cstring&gt; strchr is overloaded. The functions isupper
    etc. in &lt;cctype&gt; typically implemented as macros in C are functions
    in C++, because they are overloaded with others of the same name
    defined in &lt;locale&gt;.

    Many of the functions required in &lt;cwctype&gt; and &lt;cwchar&gt; cannot be
    implemented using underlying C facilities on intended targets because
    such facilities only partly exist.

    Chapter 22  Locale
    ------------------
    Headers: &lt;locale&gt;
    C headers: &lt;clocale&gt;

    We have a "mostly complete" class locale, with the exception of
    code for constructing, and handling the names of, named locales.
    The ways that locales are named (particularly when categories
    (e.g. LC_TIME, LC_COLLATE) are different) varies among all target
    environments. This code must be written in various versions and
    chosen by configuration parameters.

    Members of many of the facets defined in &lt;locale&gt; are stubs. Generally,
    there are two sets of facets: the base class facets (which are supposed
    to implement the "C" locale) and the "byname" facets, which are supposed
    to read files to determine their behavior. The base ctype&lt;&gt;, collate&lt;&gt;,
    and numpunct&lt;&gt; facets are "mostly complete", except that the table of
    bitmask values used for "is" operations, and corresponding mask values,
    are still defined in libio and just included/linked. (We will need to
    implement these tables independently, soon, but should take advantage
    of libio where possible.)  The num_put&lt;&gt;::put members for integer types
    are "mostly complete".

    A complete list of what has and has not been implemented may be
    found in CHECKLIST. However, note that the current definition of
    codecvt&lt;wchar_t,char,mbstate_t&gt; is wrong. It should simply write
    out the raw bytes representing the wide characters, rather than
    trying to convert each to a corresponding single "char" value.

    Some of the facets are more important than others. Specifically,
    the members of ctype&lt;&gt;, numpunct&lt;&gt;, num_put&lt;&gt;, and num_get&lt;&gt; facets
    are used by other library facilities defined in &lt;string&gt;, &lt;istream&gt;,
    and &lt;ostream&gt;, and the codecvt&lt;&gt; facet is used by basic_filebuf&lt;&gt;
    in &lt;fstream&gt;, so a conforming iostream implementation depends on
    these.

    The "long long" type eventually must be supported, but code mentioning
    it should be wrapped in #if guards to allow pedantic-mode compiling.

    Performance of num_put&lt;&gt; and num_get&lt;&gt; depend critically on
    caching computed values in ios_base objects, and on extensions
    to the interface with streambufs.

    Specifically: retrieving a copy of the locale object, extracting
    the needed facets, and gathering data from them, for each call to
    (e.g.) operator&lt;&lt; would be prohibitively slow.  To cache format
    data for use by num_put&lt;&gt; and num_get&lt;&gt; we have a _Format_cache&lt;&gt;
    object stored in the ios_base::pword() array. This is constructed
    and initialized lazily, and is organized purely for utility. It
    is discarded when a new locale with different facets is imbued.

    Using only the public interfaces of the iterator arguments to the
    facet functions would limit performance by forbidding "vector-style"
    character operations. The streambuf iterator optimizations are
    described under chapter 24, but facets can also bypass the streambuf
    iterators via explicit specializations and operate directly on the
    streambufs, and use extended interfaces to get direct access to the
    streambuf internal buffer arrays. These extensions are mentioned
    under chapter 27. These optimizations are particularly important
    for input parsing.

    Unused virtual members of locale facets can be omitted, as mentioned
    above, by a smart linker.

    Chapter 23  Containers
    ----------------------
    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;

    All the components in chapter 23 are implemented in the SGI STL.
    They are "mostly complete"; they include a large number of
    nonconforming extensions which must be wrapped. Some of these
    are used internally and must be renamed or duplicated.

    The SGI components are optimized for large-memory environments. For
    embedded targets, different criteria might be more appropriate. Users
    will want to be able to tune this behavior. We should provide
    ways for users to compile the library with different memory usage
    characteristics.

    A lot more work is needed on factoring out common code from different
    specializations to reduce code size here and in chapter 25. The
    easiest fix for this would be a compiler/ABI improvement that allows
    the compiler to recognize when a specialization depends only on the
    size (or other gross quality) of a template argument, and allow the
    linker to share the code with similar specializations. In its
    absence, many of the algorithms and containers can be partial-
    specialized, at least for the case of pointers, but this only solves
    a small part of the problem. Use of a type_traits-style template
    allows a few more optimization opportunities, more if the compiler
    can generate the specializations automatically.

    As an optimization, containers can specialize on the default allocator
    and bypass it, or take advantage of details of its implementation
    after it has been improved upon.

    Replacing the vector iterators, which currently are simple element
    pointers, with class objects would greatly increase the safety of the
    client interface, and also permit a "debug" mode in which range,
    ownership, and validity are rigorously checked. The current use of
    pointers for iterators is evil.

    As mentioned for chapter 24, the deque iterator is a good example of
    an opportunity to implement a "staged" iterator that would benefit
    from specializations of some algorithms.

    Chapter 24  Iterators
    ---------------------
    Headers: &lt;iterator&gt;

    Standard iterators are "mostly complete", with the exception of
    the stream iterators, which are not yet templatized on the
    stream type. Also, the base class template iterator&lt;&gt; appears
    to be wrong, so everything derived from it must also be wrong,
    currently.

    The streambuf iterators (currently located in stl/bits/std_iterator.h,
    but should be under bits/) can be rewritten to take advantage of
    friendship with the streambuf implementation.

    Matt Austern has identified opportunities where certain iterator
    types, particularly including streambuf iterators and deque
    iterators, have a "two-stage" quality, such that an intermediate
    limit can be checked much more quickly than the true limit on
    range operations. If identified with a member of iterator_traits,
    algorithms may be specialized for this case. Of course the
    iterators that have this quality can be identified by specializing
    a traits class.

    Many of the algorithms must be specialized for the streambuf
    iterators, to take advantage of block-mode operations, in order
    to allow iostream/locale operations' performance not to suffer.
    It may be that they could be treated as staged iterators and
    take advantage of those optimizations.

    Chapter 25  Algorithms
    ----------------------
    Headers: &lt;algorithm&gt;
    C headers: &lt;cstdlib&gt; (also in 18, 21, 26))

    The algorithms are "mostly complete". As mentioned above, they
    are optimized for speed at the expense of code and data size.

    Specializations of many of the algorithms for non-STL types would
    give performance improvements, but we must use great care not to
    interfere with fragile template overloading semantics for the
    standard interfaces. Conventionally the standard function template
    interface is an inline which delegates to a non-standard function
    which is then overloaded (this is already done in many places in
    the library). Particularly appealing opportunities for the sake of
    iostream performance are for copy and find applied to streambuf
    iterators or (as noted elsewhere) for staged iterators, of which
    the streambuf iterators are a good example.

    The bsearch and qsort functions cannot be overloaded properly as
    required by the standard because gcc does not yet allow overloading
    on the extern-"C"-ness of a function pointer.

    Chapter 26  Numerics
    --------------------
    Headers: &lt;complex&gt; &lt;valarray&gt; &lt;numeric&gt;
    C headers: &lt;cmath&gt;, &lt;cstdlib&gt; (also 18, 21, 25)

    Numeric components: Gabriel dos Reis's valarray, Drepper's complex,
    and the few algorithms from the STL are "mostly done".  Of course
    optimization opportunities abound for the numerically literate. It
    is not clear whether the valarray implementation really conforms
    fully, in the assumptions it makes about aliasing (and lack thereof)
    in its arguments.

    The C div() and ldiv() functions are interesting, because they are the
    only case where a C library function returns a class object by value.
    Since the C++ type div_t must be different from the underlying C type
    (which is in the wrong namespace) the underlying functions div() and
    ldiv() cannot be re-used efficiently. Fortunately they are trivial to
    re-implement.

    Chapter 27  Iostreams
    ---------------------
    Headers: &lt;iosfwd&gt; &lt;streambuf&gt; &lt;ios&gt; &lt;ostream&gt; &lt;istream&gt; &lt;iostream&gt;
    &lt;iomanip&gt; &lt;sstream&gt; &lt;fstream&gt;
    C headers: &lt;cstdio&gt; &lt;cwchar&gt; (also in 21)

    Iostream is currently in a very incomplete state. &lt;iosfwd&gt;, &lt;iomanip&gt;,
    ios_base, and basic_ios&lt;&gt; are "mostly complete". basic_streambuf&lt;&gt; and
    basic_ostream&lt;&gt; are well along, but basic_istream&lt;&gt; has had little work
    done. The standard stream objects, &lt;sstream&gt; and &lt;fstream&gt; have been
    started; basic_filebuf&lt;&gt; "write" functions have been implemented just
    enough to do "hello, world".

    Most of the istream and ostream operators &lt;&lt; and &gt;&gt; (with the exception
    of the op&lt;&lt;(integer) ones) have not been changed to use locale primitives,
    sentry objects, or char_traits members.

    All these templates should be manually instantiated for char and
    wchar_t in a way that links only used members into user programs.

    Streambuf is fertile ground for optimization extensions. An extended
    interface giving iterator access to its internal buffer would be very
    useful for other library components.

    Iostream operations (primarily operators &lt;&lt; and &gt;&gt;) can take advantage
    of the case where user code has not specified a locale, and bypass locale
    operations entirely. The current implementation of op&lt;&lt;/num_put&lt;&gt;::put,
    for the integer types, demonstrates how they can cache encoding details
    from the locale on each operation. There is lots more room for
    optimization in this area.

    The definition of the relationship between the standard streams
    cout et al. and stdout et al. requires something like a "stdiobuf".
    The SGI solution of using double-indirection to actually use a
    stdio FILE object for buffering is unsatisfactory, because it
    interferes with peephole loop optimizations.

    The &lt;sstream&gt; header work has begun. stringbuf can benefit from
    friendship with basic_string&lt;&gt; and basic_string&lt;&gt;::_Rep to use
    those objects directly as buffers, and avoid allocating and making
    copies.

    The basic_filebuf&lt;&gt; template is a complex beast. It is specified to
    use the locale facet codecvt&lt;&gt; to translate characters between native
    files and the locale character encoding. In general this involves
    two buffers, one of "char" representing the file and another of
    "char_type", for the stream, with codecvt&lt;&gt; translating. The process
    is complicated by the variable-length nature of the translation, and
    the need to seek to corresponding places in the two representations.
    For the case of basic_filebuf&lt;char&gt;, when no translation is needed,
    a single buffer suffices. A specialized filebuf can be used to reduce
    code space overhead when no locale has been imbued. Matt Austern's
    work at SGI will be useful, perhaps directly as a source of code, or
    at least as an example to draw on.

    Filebuf, almost uniquely (cf. operator new), depends heavily on
    underlying environmental facilities. In current releases iostream
    depends fairly heavily on libio constant definitions, but it should
    be made independent.  It also depends on operating system primitives
    for file operations. There is immense room for optimizations using
    (e.g.) mmap for reading. The shadow/ directory wraps, besides the
    standard C headers, the libio.h and unistd.h headers, for use mainly
    by filebuf. These wrappings have not been completed, though there
    is scaffolding in place.

    The encapsulation of certain C header &lt;cstdio&gt; names presents an
    interesting problem. It is possible to define an inline std::fprintf()
    implemented in terms of the 'extern "C"' vfprintf(), but there is no
    standard vfscanf() to use to implement std::fscanf(). It appears that
    vfscanf but be re-implemented in C++ for targets where no vfscanf
    extension has been defined. This is interesting in that it seems
    to be the only significant case in the C library where this kind of
    rewriting is necessary. (Of course Glibc provides the vfscanf()
    extension.)  (The functions related to exit() must be rewritten
    for other reasons.)


    Annex D
    -------
    Headers: &lt;strstream&gt;

    Annex D defines many non-library features, and many minor
    modifications to various headers, and a complete header.
    It is "mostly done", except that the libstdc++-2 &lt;strstream&gt;
    header has not been adopted into the library, or checked to
    verify that it matches the draft in those details that were
    clarified by the committee. Certainly it must at least be
    moved into the std namespace.

    We still need to wrap all the deprecated features in #if guards
    so that pedantic compile modes can detect their use.

    Nonstandard Extensions
    ----------------------
    Headers: &lt;iostream.h&gt; &lt;strstream.h&gt; &lt;hash&gt; &lt;rbtree&gt;
    &lt;pthread_alloc&gt; &lt;stdiobuf&gt; (etc.)

    User code has come to depend on a variety of nonstandard components
    that we must not omit. Much of this code can be adopted from
    libstdc++-v2 or from the SGI STL. This particularly includes
    &lt;iostream.h&gt;, &lt;strstream.h&gt;, and various SGI extensions such
    as &lt;hash_map.h&gt;. Many of these are already placed in the
    subdirectories ext/ and backward/. (Note that it is better to
    include them via "&lt;backward/hash_map.h&gt;" or "&lt;ext/hash_map&gt;" than
    to search the subdirectory itself via a "-I" directive.
  </literallayout>
</sect1>  

</appendix>
