// Copyright (C) 2005-2009 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/config.hpp> | |
#include <boost/type_traits/remove_const.hpp> | |
#include <boost/unordered/detail/fwd.hpp> | |
namespace boost { | |
namespace unordered_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 <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(); | |
} | |
#if defined(BOOST_UNORDERED_STD_FORWARD) | |
template <class... Args> | |
static no_key extract(Args const&...) | |
{ | |
return no_key(); | |
} | |
#else | |
template <class Arg> | |
static no_key extract(Arg const&) | |
{ | |
return no_key(); | |
} | |
template <class Arg> | |
static no_key extract(Arg const&, Arg const&) | |
{ | |
return no_key(); | |
} | |
#endif | |
static bool compare_mapped(value_type const&, value_type const&) | |
{ | |
return true; | |
} | |
}; | |
template <class Key, class ValueType> | |
struct map_extractor | |
{ | |
typedef ValueType value_type; | |
typedef BOOST_DEDUCED_TYPENAME boost::remove_const<Key>::type key_type; | |
static key_type const& extract(value_type const& v) | |
{ | |
return v.first; | |
} | |
static key_type const& extract(key_type const& v) | |
{ | |
return v; | |
} | |
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; | |
} | |
#if defined(BOOST_UNORDERED_STD_FORWARD) | |
template <class Arg1, class... Args> | |
static key_type const& extract(key_type const& k, | |
Arg1 const&, Args const&...) | |
{ | |
return k; | |
} | |
template <class... Args> | |
static no_key extract(Args const&...) | |
{ | |
return no_key(); | |
} | |
#else | |
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 Arg, class Arg1> | |
static no_key extract(Arg const&, Arg1 const&) | |
{ | |
return no_key(); | |
} | |
#endif | |
static bool compare_mapped(value_type const& x, value_type const& y) | |
{ | |
return x.second == y.second; | |
} | |
}; | |
}} | |
#endif |