Generic Programming and the STL: Using and Extending the C++ Standard Template Library