/*============================================================================= Copyright (c) 2011-2014 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout 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 SPROUT_FUNCTIONAL_HASH_HASH_HPP #define SPROUT_FUNCTIONAL_HASH_HASH_HPP #include #include #include #include #include namespace sprout { // // hash // template struct hash { public: typedef T argument_type; typedef std::size_t result_type; public: SPROUT_CONSTEXPR std::size_t operator()(T const& v) const { return sprout::to_hash(v); } }; template struct hash : public sprout::hash {}; template struct hash : public sprout::hash {}; template struct hash : public sprout::hash {}; template<> struct hash { public: typedef std::size_t result_type; public: template SPROUT_CONSTEXPR std::size_t operator()(T&& v) const SPROUT_NOEXCEPT_IF_EXPR(sprout::to_hash(SPROUT_FORWARD(T, v))) { return sprout::to_hash(SPROUT_FORWARD(T, v)); } }; #define SPROUT_HASH_SPECIALIZE(TYPE) \ template<> \ struct hash { \ public: \ typedef TYPE argument_type; \ typedef std::size_t result_type; \ public: \ SPROUT_CONSTEXPR std::size_t operator()(TYPE v) const { \ return sprout::to_hash(v); \ } \ } #define SPROUT_HASH_SPECIALIZE_REF(TYPE) \ template<> \ struct hash { \ public: \ typedef TYPE argument_type; \ typedef std::size_t result_type; \ public: \ SPROUT_CONSTEXPR std::size_t operator()(TYPE const& v) const { \ return sprout::to_hash(v); \ } \ } SPROUT_HASH_SPECIALIZE(bool); SPROUT_HASH_SPECIALIZE(char); SPROUT_HASH_SPECIALIZE(signed char); SPROUT_HASH_SPECIALIZE(unsigned char); SPROUT_HASH_SPECIALIZE(char16_t); SPROUT_HASH_SPECIALIZE(char32_t); SPROUT_HASH_SPECIALIZE(wchar_t); SPROUT_HASH_SPECIALIZE(short); SPROUT_HASH_SPECIALIZE(unsigned short); SPROUT_HASH_SPECIALIZE(int); SPROUT_HASH_SPECIALIZE(unsigned int); SPROUT_HASH_SPECIALIZE(long); SPROUT_HASH_SPECIALIZE(unsigned long); SPROUT_HASH_SPECIALIZE(long long); SPROUT_HASH_SPECIALIZE(unsigned long long); #undef SPROUT_HASH_SPECIALIZE #undef SPROUT_HASH_SPECIALIZE_REF template struct hash { public: typedef T* argument_type; typedef std::size_t result_type; public: std::size_t operator()(T* v) const { return sprout::to_hash(v); } }; } // namespace sprout #endif // #ifndef SPROUT_FUNCTIONAL_HASH_HASH_HPP