This document present the STLport namespace schema and give additionnal
information about how STLport replace the native C++ Standard library
coming with your compiler.

1. What is the STLport namespace ?

  As STLport is a C++ Standard library implementation the STLport namespace
is 'std'. In normal use this is all you need to know and you can stop reading
here.

2. How does STLport replace native C++ Standard library ?

  STLport defines a macro 'std' that replaces all references of std in the
user code by a different name. This technique has has some drawback but also
advantages. The drawback is that you cannot declared Standard component like
that:


//foo.h
namespace std
{
  template <class _Tp>
  class allocator;
}

void f1(const std::allocator<int>&);


//foo.cpp
#include "foo.h"
#include <memory>

void f1(const std::allocator<int>& alloc)
{
  //implementation
}

//bar.cpp
#include "foo.h"
#include <memory>

int main(int, char**)
{
  std::allocator<int> alloc;
  f1(alloc);
}

  If you build this code you will surely have a compilation error as f1 is declared
as taking a std::allocator parameter but you are calling it using an STLport allocator
instance that is not in the std namespace. The good news is that this drawback is easy
to detect as it will generate compilation error or at least link time error. The only
workaround is to include an arbitrary Standard header before the allocator declaration.
Good candidates for that are <utility> or <cerrno> as they are small headers. Including
those headers will replace std with the STLport namespace.

  The advantage of this macro replacement is that we can customize the STLport namespace
depending on the compilation options. For instance the STLport safe mode you can use by
defining _STLP_DEBUG is not binary compatible with a normal debug build. To ensure that
no one will ever build code without _STLP_DEBUG and link with STLport library built with
this option the namespace is different so that it will generate link time error rather
than random crashes during application execution.

3. Why not having use namespace injection ?

  An other way to replace native Standard C++ library implementation would have been to
use namespace injection:

namespace std
{
  using namespace stlport;
}

  This solution has a first major drawback which is that STLport would be much more sensible
to native headers. If you include a C++ native headers that indirectly define for instance
the vector class it is going to conflict with the STLport vector definition.

  Moreover this solution just does not work for a very simple reason. The C++ Standard 
allows users to specialized some of the Standard algorithms. This specialization has to 
be done in the same namespace as the main template declaration:

//In an STLport header:
namespace stlport
{
  template <class _Tp>
  struct less
  {
    bool operator () (const _Tp& x, const _Tp& y) const;
  };
}

//User code:

struct MyStruct;

namespace std
{
  template <>
  struct less<MyStruct>
  {
  };
}

As you can see the specialization is not in the STLport less namespace and it
won't be used in associative containers for instance.

4. What is the STLport specific namespace ?

  The official STLport namespace is: stlport. Once again this is not the real namespace
where all the Standard stuff are. As the real STLport namespace change depending on compilation
options you cannot use it directly. So stlport is an alias of the real STLport namespace.

5. What are the other STLport namespaces ?

  Those names are given for information purpose and should never be used in any user code. The
default STLport namespace is: stlp_std. Here is the list of the customized namespaces:

  - stlpd_std : when _STLP_DEBUG is defined
  - stlpx_std : when you use STLport as a shared library linked to the static version of the native
    runtime or when you build the static STLport library linked with the dynamic version. This option
    is only supported by a limited number of compilers.
  - stlpmtx_std : when building STLport as not thread safe.

  You can also have combination of those extension like stlpdxmtx_std or stlpdmtx_std...

  There is also an other STLport namespace for STLport internal functions or struct/class: priv.

namespace stlport
{
  namespace priv
  {
  }
}
 
