forked from boostorg/unordered
Merged revisions 55470,55877-55878,55901-55902,55921-55922,55990-55992,56009-56010,56329,56346-56349,56362-56363,56374 via svnmerge from https://svn.boost.org/svn/boost/trunk ........ r55470 | danieljames | 2009-08-08 19:50:00 +0100 (Sat, 08 Aug 2009) | 1 line Remove empty svn:mergeinfo properties. This should reduce the amount of differences between trunk and release. ........ r55877 | danieljames | 2009-08-30 17:33:42 +0100 (Sun, 30 Aug 2009) | 1 line Remove allocator_constructor since it's never used. ........ r55878 | danieljames | 2009-08-30 17:42:28 +0100 (Sun, 30 Aug 2009) | 6 lines Initial checkin of new version of Boost.Unordered. - More template use, less preprocessor use. - Removed some of the Visual C++ 6 workarounds. - Reduced memory use of the main object. - Split into smaller headers. ........ r55901 | danieljames | 2009-08-31 11:39:25 +0100 (Mon, 31 Aug 2009) | 1 line Detab. ........ r55902 | danieljames | 2009-08-31 11:39:40 +0100 (Mon, 31 Aug 2009) | 1 line Remove unnecessary BOOST_DEDUCED_TYPENAMEs ........ r55921 | danieljames | 2009-08-31 16:33:28 +0100 (Mon, 31 Aug 2009) | 1 line Remove a few unused parameters. ........ r55922 | danieljames | 2009-08-31 16:33:49 +0100 (Mon, 31 Aug 2009) | 1 line Remove 'static' from next_node and node_count. Will hopefully make vacpp happy. ........ r55990 | danieljames | 2009-09-03 08:36:21 +0100 (Thu, 03 Sep 2009) | 1 line Combine hash_structure and hash_table_manager. ........ r55991 | danieljames | 2009-09-03 08:37:14 +0100 (Thu, 03 Sep 2009) | 1 line Remove some old Visual C++ workarounds. ........ r55992 | danieljames | 2009-09-03 08:37:30 +0100 (Thu, 03 Sep 2009) | 1 line Add a small test to see if the tested compilers support out of line template methods. ........ r56009 | danieljames | 2009-09-04 08:02:28 +0100 (Fri, 04 Sep 2009) | 1 line Fix link to n2691. ........ r56010 | danieljames | 2009-09-04 08:03:04 +0100 (Fri, 04 Sep 2009) | 1 line Move size_ and cached_begin_bucket_ into table, rename hash_table_manager hash_buckets. ........ r56329 | danieljames | 2009-09-20 22:55:15 +0100 (Sun, 20 Sep 2009) | 2 lines Since all the compilers support out of line template members use them and lots of other things. ........ r56346 | danieljames | 2009-09-21 22:17:19 +0100 (Mon, 21 Sep 2009) | 1 line Slightly more consistent variable names. In detail 'n' is now always a node pointer. ........ r56347 | danieljames | 2009-09-21 22:17:40 +0100 (Mon, 21 Sep 2009) | 1 line Fix bug where container was reducing the number of buckets. ........ r56348 | danieljames | 2009-09-21 22:18:01 +0100 (Mon, 21 Sep 2009) | 1 line Fix a bug that was causing unnecessary rehahes. ........ r56349 | danieljames | 2009-09-21 22:18:21 +0100 (Mon, 21 Sep 2009) | 1 line Use std::max. ........ r56362 | danieljames | 2009-09-22 23:39:00 +0100 (Tue, 22 Sep 2009) | 1 line Another std::max. ........ r56363 | danieljames | 2009-09-22 23:39:17 +0100 (Tue, 22 Sep 2009) | 1 line Remove the emplace_hint implementation for unique containers as it isn't really used and seems to be causing sun 5.7 problems. ........ r56374 | danieljames | 2009-09-24 21:42:19 +0100 (Thu, 24 Sep 2009) | 1 line Remove temporary test. ........ [SVN r56375]
172 lines
4.4 KiB
C++
172 lines
4.4 KiB
C++
|
|
// 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&) {}
|
|
};
|
|
|
|
struct set_extractor
|
|
{
|
|
template <class ValueType>
|
|
struct apply
|
|
{
|
|
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;
|
|
}
|
|
};
|
|
};
|
|
|
|
struct map_extractor
|
|
{
|
|
template <class ValueType>
|
|
struct apply
|
|
{
|
|
typedef ValueType value_type;
|
|
typedef BOOST_DEDUCED_TYPENAME
|
|
remove_const<BOOST_DEDUCED_TYPENAME ValueType::first_type>::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;
|
|
}
|
|
/*
|
|
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
|