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