189 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 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/config.hpp>
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_HAS_PRAGMA_ONCE)
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#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(value_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
							 |