Index: libcxx/trunk/include/ext/__hash =================================================================== --- libcxx/trunk/include/ext/__hash +++ libcxx/trunk/include/ext/__hash @@ -19,8 +19,7 @@ namespace __gnu_cxx { using namespace std; -template struct _LIBCPP_TYPE_VIS_ONLY hash : public std::hash<_Tp> - { }; +template struct _LIBCPP_TYPE_VIS_ONLY hash { }; template <> struct _LIBCPP_TYPE_VIS_ONLY hash : public unary_function @@ -41,6 +40,96 @@ return __do_string_hash(__c, __c + strlen(__c)); } }; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(signed char __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned char __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(short __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned short __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(int __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned int __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(long __c) const _NOEXCEPT + { + return __c; + } +}; + +template <> struct _LIBCPP_TYPE_VIS_ONLY hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned long __c) const _NOEXCEPT + { + return __c; + } +}; } #endif // _LIBCPP_EXT_HASH Index: libcxx/trunk/test/extensions/hash/specializations.fail.cpp =================================================================== --- libcxx/trunk/test/extensions/hash/specializations.fail.cpp +++ libcxx/trunk/test/extensions/hash/specializations.fail.cpp @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include +#include +#include + +int main() +{ + assert(__gnu_cxx::hash()(std::string()) == 0); // error +} Index: libcxx/trunk/test/extensions/hash/specializations.pass.cpp =================================================================== --- libcxx/trunk/test/extensions/hash/specializations.pass.cpp +++ libcxx/trunk/test/extensions/hash/specializations.pass.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include +#include +#include + +int main() +{ + char str[] = "test"; + assert(__gnu_cxx::hash()("test") == + std::hash()("test")); + assert(__gnu_cxx::hash()(str) == std::hash()("test")); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); +} Index: libcxx/trunk/test/extensions/nothing_to_do.pass.cpp =================================================================== --- libcxx/trunk/test/extensions/nothing_to_do.pass.cpp +++ libcxx/trunk/test/extensions/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +}