unordered_map_adaptor.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Boost.Bimap
  2. //
  3. // Copyright (c) 2006-2007 Matias Capeletto
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. /// \file container_adaptor/unordered_map_adaptor.hpp
  9. /// \brief Container adaptor to easily build a std::unordered_map signature compatible container.
  10. #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP
  11. #define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP
  12. #if defined(_MSC_VER)
  13. #pragma once
  14. #endif
  15. #include <boost/config.hpp>
  16. #include <boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp>
  17. #include <boost/mpl/aux_/na.hpp>
  18. #include <boost/mpl/vector.hpp>
  19. #include <boost/call_traits.hpp>
  20. namespace boost {
  21. namespace bimaps {
  22. namespace container_adaptor {
  23. /// \brief Container adaptor to easily build a std::unordered_map signature compatible container.
  24. template
  25. <
  26. class Base,
  27. class Iterator,
  28. class ConstIterator,
  29. class LocalIterator,
  30. class ConstLocalIterator,
  31. class IteratorToBaseConverter = ::boost::mpl::na,
  32. class IteratorFromBaseConverter = ::boost::mpl::na,
  33. class LocalIteratorFromBaseConverter = ::boost::mpl::na,
  34. class ValueToBaseConverter = ::boost::mpl::na,
  35. class ValueFromBaseConverter = ::boost::mpl::na,
  36. class KeyToBaseConverter = ::boost::mpl::na,
  37. class FunctorsFromDerivedClasses = mpl::vector<>
  38. >
  39. class unordered_map_adaptor :
  40. public ::boost::bimaps::container_adaptor::
  41. unordered_associative_container_adaptor
  42. <
  43. Base,
  44. Iterator, ConstIterator, LocalIterator, ConstLocalIterator,
  45. BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type,
  46. IteratorToBaseConverter, IteratorFromBaseConverter,
  47. LocalIteratorFromBaseConverter,
  48. ValueToBaseConverter, ValueFromBaseConverter,
  49. KeyToBaseConverter,
  50. FunctorsFromDerivedClasses
  51. >
  52. {
  53. typedef ::boost::bimaps::container_adaptor::
  54. unordered_associative_container_adaptor
  55. <
  56. Base,
  57. Iterator, ConstIterator, LocalIterator, ConstLocalIterator,
  58. BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type,
  59. IteratorToBaseConverter, IteratorFromBaseConverter,
  60. LocalIteratorFromBaseConverter,
  61. ValueToBaseConverter, ValueFromBaseConverter,
  62. KeyToBaseConverter,
  63. FunctorsFromDerivedClasses
  64. > base_;
  65. // MetaData -------------------------------------------------------------
  66. public:
  67. typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
  68. typedef data_type mapped_type;
  69. // Access -----------------------------------------------------------------
  70. public:
  71. explicit unordered_map_adaptor(Base & c) :
  72. base_(c) {}
  73. protected:
  74. typedef unordered_map_adaptor unordered_map_adaptor_;
  75. // Interface --------------------------------------------------------------
  76. public:
  77. template< class CompatibleKey >
  78. data_type& operator[](const CompatibleKey & k)
  79. {
  80. return this->base()
  81. [this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)];
  82. }
  83. template< class CompatibleKey >
  84. data_type& at(const CompatibleKey & k)
  85. {
  86. return this->base().
  87. at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k));
  88. }
  89. template< class CompatibleKey >
  90. const data_type& at(const CompatibleKey & k) const
  91. {
  92. return this->base().
  93. at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k));
  94. }
  95. };
  96. } // namespace container_adaptor
  97. } // namespace bimaps
  98. } // namespace boost
  99. #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP