mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-02 08:53:44 +08:00
re PR libstdc++/47773 (Versatile string lacks a default hash function)
2011-02-16 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/47773 * include/ext/vstring.h (hash<__gnu_cxx::__vstring>, hash<__gnu_cxx::__wvstring>, hash<__gnu_cxx::__u16vstring>, hash<__gnu_cxx::__u32vstring>): Add. * testsuite/ext/vstring/hash/char/1.cc: New. * testsuite/ext/vstring/hash/wchar_t/1.cc: Likewise. From-SVN: r170235
This commit is contained in:
parent
a3daf81795
commit
bde8d7f701
@ -1,3 +1,12 @@
|
||||
2011-02-16 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR libstdc++/47773
|
||||
* include/ext/vstring.h (hash<__gnu_cxx::__vstring>,
|
||||
hash<__gnu_cxx::__wvstring>, hash<__gnu_cxx::__u16vstring>,
|
||||
hash<__gnu_cxx::__u32vstring>): Add.
|
||||
* testsuite/ext/vstring/hash/char/1.cc: New.
|
||||
* testsuite/ext/vstring/hash/wchar_t/1.cc: Likewise.
|
||||
|
||||
2011-02-16 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||
|
||||
* include/bits/regex.h (match_results::format): Use char_traits.
|
||||
|
@ -2731,6 +2731,66 @@ _GLIBCXX_END_NAMESPACE_VERSION
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
||||
#include <bits/functional_hash.h>
|
||||
|
||||
namespace std _GLIBCXX_VISIBILITY(default)
|
||||
{
|
||||
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
/// std::hash specialization for __vstring.
|
||||
template<>
|
||||
struct hash<__gnu_cxx::__vstring>
|
||||
: public __hash_base<size_t, __gnu_cxx::__vstring>
|
||||
{
|
||||
size_t
|
||||
operator()(const __gnu_cxx::__vstring& __s) const
|
||||
{ return std::_Hash_impl::hash(__s.data(), __s.length()); }
|
||||
};
|
||||
|
||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||
/// std::hash specialization for __wvstring.
|
||||
template<>
|
||||
struct hash<__gnu_cxx::__wvstring>
|
||||
: public __hash_base<size_t, __gnu_cxx::__wvstring>
|
||||
{
|
||||
size_t
|
||||
operator()(const __gnu_cxx::__wvstring& __s) const
|
||||
{ return std::_Hash_impl::hash(__s.data(),
|
||||
__s.length() * sizeof(wchar_t)); }
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef _GLIBCXX_USE_C99_STDINT_TR1
|
||||
/// std::hash specialization for __u16vstring.
|
||||
template<>
|
||||
struct hash<__gnu_cxx::__u16vstring>
|
||||
: public __hash_base<size_t, __gnu_cxx::__u16vstring>
|
||||
{
|
||||
size_t
|
||||
operator()(const __gnu_cxx::__u16vstring& __s) const
|
||||
{ return std::_Hash_impl::hash(__s.data(),
|
||||
__s.length() * sizeof(char16_t)); }
|
||||
};
|
||||
|
||||
/// std::hash specialization for __u32vstring.
|
||||
template<>
|
||||
struct hash<__gnu_cxx::__u32vstring>
|
||||
: public __hash_base<size_t, __gnu_cxx::__u32vstring>
|
||||
{
|
||||
size_t
|
||||
operator()(const __gnu_cxx::__u32vstring& __s) const
|
||||
{ return std::_Hash_impl::hash(__s.data(),
|
||||
__s.length() * sizeof(char32_t)); }
|
||||
};
|
||||
#endif
|
||||
|
||||
_GLIBCXX_END_NAMESPACE_VERSION
|
||||
} // namespace
|
||||
|
||||
#endif /* __GXX_EXPERIMENTAL_CXX0X__ */
|
||||
|
||||
#include "vstring.tcc"
|
||||
|
||||
#endif /* _VSTRING_H */
|
||||
|
55
libstdc++-v3/testsuite/ext/vstring/hash/char/1.cc
Normal file
55
libstdc++-v3/testsuite/ext/vstring/hash/char/1.cc
Normal file
@ -0,0 +1,55 @@
|
||||
// { dg-options "-std=gnu++0x" }
|
||||
// { dg-require-string-conversions "" }
|
||||
|
||||
// Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without Pred the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <ext/vstring.h>
|
||||
#include <unordered_map>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
// libstdc++/47773
|
||||
void test01()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
typedef __gnu_cxx::__vstring vstring_t;
|
||||
typedef std::unordered_map<vstring_t, int> map_t;
|
||||
|
||||
map_t mymap;
|
||||
|
||||
mymap.insert(std::make_pair("hello", 10));
|
||||
mymap.insert(std::make_pair("hi", 20));
|
||||
|
||||
VERIFY( mymap.size() == 2 );
|
||||
|
||||
map_t::const_iterator imap = mymap.begin();
|
||||
|
||||
VERIFY( vstring_t(imap->first.c_str()) == "hi" );
|
||||
VERIFY( imap->second == 20 );
|
||||
|
||||
++imap;
|
||||
|
||||
VERIFY( vstring_t(imap->first.c_str()) == "hello" );
|
||||
VERIFY( imap->second == 10 );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
return 0;
|
||||
}
|
55
libstdc++-v3/testsuite/ext/vstring/hash/wchar_t/1.cc
Normal file
55
libstdc++-v3/testsuite/ext/vstring/hash/wchar_t/1.cc
Normal file
@ -0,0 +1,55 @@
|
||||
// { dg-options "-std=gnu++0x" }
|
||||
// { dg-require-string-conversions "" }
|
||||
|
||||
// Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without Pred the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <ext/vstring.h>
|
||||
#include <unordered_map>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
// libstdc++/47773
|
||||
void test01()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
typedef __gnu_cxx::__wvstring vstring_t;
|
||||
typedef std::unordered_map<vstring_t, int> map_t;
|
||||
|
||||
map_t mymap;
|
||||
|
||||
mymap.insert(std::make_pair(L"hello", 10));
|
||||
mymap.insert(std::make_pair(L"hi", 20));
|
||||
|
||||
VERIFY( mymap.size() == 2 );
|
||||
|
||||
map_t::const_iterator imap = mymap.begin();
|
||||
|
||||
VERIFY( vstring_t(imap->first.c_str()) == L"hi" );
|
||||
VERIFY( imap->second == 20 );
|
||||
|
||||
++imap;
|
||||
|
||||
VERIFY( vstring_t(imap->first.c_str()) == L"hello" );
|
||||
VERIFY( imap->second == 10 );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user