# Crash Course: User provided STL # Table of Contents * [Introduction](#introduction) * [The required tools](#the-required-tools) * [STL injection](#stl-injection) * [Discoverability](#discoverability) * [Importability](#importability) * [Final note](#final-note) # Introduction `EnTT` internally _decouples_ the standard template library from the `std` namespace. It does this by introducing the internal `stl` namespace into which the necessary tools are _imported_ from `std`.
This import process is also configurable, and the end user can replace all or some of the standard template library includes by providing their own implementations. # The required tools The list of _what_ is imported from `std` is not fixed and stable over time, but changes as the library evolves. At any time, users can easily know what is required and what is not.
The easiest way to avoid errors is to provide everything a standard header provides. However, it's also a good idea to look at its counterpart in the `stl` folder and implement only the tools actually used by `EnTT`.
There's no guarantee that these won't change over time. Therefore, the first approach is the safest way to avoid surprises. # STL injection Includes from the standard template library can be _injected_ into `EnTT` in bulk or individually. As long as the API and guarantees remain the same, there will be no problem using different sources or mixing different implementations.
However, there are two fundamental requirements for the library to be able to _find_ the user files and use them correctly. ## Discoverability To begin with, the files to inject must be discoverable via `__has_include` in the `entt/ext/stl/` path, and have the extension `.hpp`.
For example, to replace ``, users need to provide a resolvable file such as ``. This is fairly simple to do on the command line and can be easily automated with tools like `CMake`.
The `EnTT` test suite provides an example of how to proceed, also designed to avoid future regressions. ## Importability Having all the required files is not enough, since `EnTT` does not know the namespace in which the user defined their tools. Therefore, anyone providing the new headers must also import all the tools into the `entt::stl` namespace.
Importing from outside into this namespace is accepted and, in a sense, expected by the library itself, unlike what happens with the standard C++ library. The easiest solution is to include a custom implementation and _import_ it into the required namespace via the files indicated.
An `using namespace my_stl;` directive should get the job done, but users can also import the tools one by one if they prefer to. # Final note `EnTT` is designed to work with the API, guarantees, and pros and cons of the standard template library.
The flexibility afforded by the ability to _import_ a custom implementation does not compromise this requirement. Therefore, in the event of an incompatible API (not _different_, but _incompatible_) or broken requirements, there is no guarantee that `EnTT` will: * Compile correctly * Perform correctly Obviously, any errors due to incorrect implementations or broken guarantees are not attributable to the library, and no follow-up will be given to any issues arising from these types of problems.