123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- // Copyright (C) 2005-2011 Daniel James
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_UNORDERED_DETAIL_EXTRACT_KEY_HPP_INCLUDED
- #define BOOST_UNORDERED_DETAIL_EXTRACT_KEY_HPP_INCLUDED
- #include <boost/unordered/detail/table.hpp>
- namespace boost {
- namespace unordered {
- namespace detail {
- // key extractors
- //
- // no throw
- //
- // 'extract_key' is called with the emplace parameters to return a
- // key if available or 'no_key' is one isn't and will need to be
- // constructed. This could be done by overloading the emplace implementation
- // for the different cases, but that's a bit tricky on compilers without
- // variadic templates.
- struct no_key {
- no_key() {}
- template <class T> no_key(T const&) {}
- };
- template <typename Key, typename T>
- struct is_key {
- template <typename T2>
- static choice1::type test(T2 const&);
- static choice2::type test(Key const&);
-
- enum { value = sizeof(test(boost::unordered::detail::make<T>())) ==
- sizeof(choice2::type) };
-
- typedef typename boost::detail::if_true<value>::
- BOOST_NESTED_TEMPLATE then<Key const&, no_key>::type type;
- };
- template <class ValueType>
- struct set_extractor
- {
- typedef ValueType value_type;
- typedef ValueType key_type;
- static key_type const& extract(key_type const& v)
- {
- return v;
- }
- static no_key extract()
- {
- return no_key();
- }
-
- template <class Arg>
- static no_key extract(Arg const&)
- {
- return no_key();
- }
- #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- template <class Arg1, class Arg2, class... Args>
- static no_key extract(Arg1 const&, Arg2 const&, Args const&...)
- {
- return no_key();
- }
- #else
- template <class Arg1, class Arg2>
- static no_key extract(Arg1 const&, Arg2 const&)
- {
- return no_key();
- }
- #endif
- };
- template <class Key, class ValueType>
- struct map_extractor
- {
- typedef ValueType value_type;
- typedef typename boost::remove_const<Key>::type key_type;
- static key_type const& extract(value_type const& v)
- {
- return v.first;
- }
-
- template <class Second>
- static key_type const& extract(std::pair<key_type, Second> const& v)
- {
- return v.first;
- }
- template <class Second>
- static key_type const& extract(
- std::pair<key_type const, Second> const& v)
- {
- return v.first;
- }
- template <class Arg1>
- static key_type const& extract(key_type const& k, Arg1 const&)
- {
- return k;
- }
- static no_key extract()
- {
- return no_key();
- }
- template <class Arg>
- static no_key extract(Arg const&)
- {
- return no_key();
- }
- template <class Arg1, class Arg2>
- static no_key extract(Arg1 const&, Arg2 const&)
- {
- return no_key();
- }
- #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- template <class Arg1, class Arg2, class Arg3, class... Args>
- static no_key extract(Arg1 const&, Arg2 const&, Arg3 const&,
- Args const&...)
- {
- return no_key();
- }
- #endif
- #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- #define BOOST_UNORDERED_KEY_FROM_TUPLE(namespace_) \
- template <typename T2> \
- static no_key extract(boost::unordered::piecewise_construct_t, \
- namespace_ tuple<> const&, T2 const&) \
- { \
- return no_key(); \
- } \
- \
- template <typename T, typename T2> \
- static typename is_key<key_type, T>::type \
- extract(boost::unordered::piecewise_construct_t, \
- namespace_ tuple<T> const& k, T2 const&) \
- { \
- return typename is_key<key_type, T>::type( \
- namespace_ get<0>(k)); \
- }
- #else
- #define BOOST_UNORDERED_KEY_FROM_TUPLE(namespace_) \
- static no_key extract(boost::unordered::piecewise_construct_t, \
- namespace_ tuple<> const&) \
- { \
- return no_key(); \
- } \
- \
- template <typename T> \
- static typename is_key<key_type, T>::type \
- extract(boost::unordered::piecewise_construct_t, \
- namespace_ tuple<T> const& k) \
- { \
- return typename is_key<key_type, T>::type( \
- namespace_ get<0>(k)); \
- }
- #endif
- BOOST_UNORDERED_KEY_FROM_TUPLE(boost::)
- #if !defined(BOOST_NO_CXX11_HDR_TUPLE)
- BOOST_UNORDERED_KEY_FROM_TUPLE(std::)
- #endif
- };
- }}}
- #endif
|