Boost C++ Libraries Boost.Bimap Home Libraries People FAQ More

PrevUpHomeNext

unordered_map_adaptor.hpp

Go to the documentation of this file.
00001 // Boost.Bimap
00002 //
00003 // Copyright (c) 2006-2007 Matias Capeletto
00004 //
00005 // Distributed under the Boost Software License, Version 1.0.
00006 // (See accompanying file LICENSE_1_0.txt or copy at
00007 // http://www.boost.org/LICENSE_1_0.txt)
00008 
00009 /// \file container_adaptor/unordered_map_adaptor.hpp
00010 /// \brief Container adaptor to easily build a std::unordered_map signature compatible container.
00011 
00012 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP
00013 #define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP
00014 
00015 #if defined(_MSC_VER) && (_MSC_VER>=1200)
00016 #pragma once
00017 #endif
00018 
00019 #include <boost/config.hpp>
00020 
00021 #include <boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp>
00022 #include <boost/mpl/aux_/na.hpp>
00023 #include <boost/mpl/vector.hpp>
00024 #include <boost/call_traits.hpp>
00025 
00026 namespace boost {
00027 namespace bimaps {
00028 namespace container_adaptor {
00029 
00030 /// \brief Container adaptor to easily build a std::unordered_map signature compatible container.
00031 
00032 template
00033 <
00034     class Base,
00035 
00036     class Iterator,
00037     class ConstIterator,
00038     class LocalIterator,
00039     class ConstLocalIterator,
00040 
00041     class IteratorToBaseConverter        = ::boost::mpl::na,
00042     class IteratorFromBaseConverter      = ::boost::mpl::na,
00043     class LocalIteratorFromBaseConverter = ::boost::mpl::na,
00044     class ValueToBaseConverter           = ::boost::mpl::na,
00045     class ValueFromBaseConverter         = ::boost::mpl::na,
00046     class KeyToBaseConverter             = ::boost::mpl::na,
00047 
00048     class FunctorsFromDerivedClasses = mpl::vector<>
00049 >
00050 class unordered_map_adaptor :
00051 
00052     public ::boost::bimaps::container_adaptor::
00053                 unordered_associative_container_adaptor
00054     <
00055         Base,
00056         Iterator, ConstIterator, LocalIterator, ConstLocalIterator,
00057         BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type,
00058         IteratorToBaseConverter, IteratorFromBaseConverter,
00059         LocalIteratorFromBaseConverter,
00060         ValueToBaseConverter, ValueFromBaseConverter,
00061         KeyToBaseConverter,
00062         FunctorsFromDerivedClasses
00063     >
00064 {
00065 
00066     typedef ::boost::bimaps::container_adaptor::
00067                 unordered_associative_container_adaptor
00068     <
00069         Base,
00070         Iterator, ConstIterator, LocalIterator, ConstLocalIterator,
00071         BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type,
00072         IteratorToBaseConverter, IteratorFromBaseConverter,
00073         LocalIteratorFromBaseConverter,
00074         ValueToBaseConverter, ValueFromBaseConverter,
00075         KeyToBaseConverter,
00076         FunctorsFromDerivedClasses
00077 
00078     > base_;
00079 
00080     // MetaData -------------------------------------------------------------
00081 
00082     public:
00083 
00084     typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
00085 
00086     // Access -----------------------------------------------------------------
00087 
00088     public:
00089 
00090     explicit unordered_map_adaptor(Base & c) :
00091         base_(c) {}
00092 
00093     protected:
00094 
00095     typedef unordered_map_adaptor unordered_map_adaptor_;
00096 
00097     // Interface --------------------------------------------------------------
00098 
00099     public:
00100 
00101     template< class CompatibleKey >
00102     data_type& operator[](const CompatibleKey & k)
00103     {
00104         return this->base()
00105             [this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)];
00106     }
00107 
00108     template< class CompatibleKey >
00109     data_type& at(const CompatibleKey & k)
00110     {
00111         return this->base().
00112             at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k));
00113     }
00114 
00115     template< class CompatibleKey >
00116     const data_type& at(const CompatibleKey & k) const
00117     {
00118         return this->base().
00119             at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k));
00120     }
00121 
00122 };
00123 
00124 
00125 
00126 } // namespace container_adaptor
00127 } // namespace bimaps
00128 } // namespace boost
00129 
00130 
00131 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP
00132 
Copyright 2006 Matias Capeletto

PrevUpHomeNext