From patchwork Thu Feb 17 01:26:20 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 83420 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 3034DB7093 for ; Thu, 17 Feb 2011 12:26:37 +1100 (EST) Received: (qmail 31944 invoked by alias); 17 Feb 2011 01:26:33 -0000 Received: (qmail 31925 invoked by uid 22791); 17 Feb 2011 01:26:31 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from smtp206.alice.it (HELO smtp206.alice.it) (82.57.200.102) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 17 Feb 2011 01:26:24 +0000 Received: from [192.168.1.4] (79.45.212.9) by smtp206.alice.it (8.5.124.08) id 4D49918D013D26ED; Thu, 17 Feb 2011 02:26:20 +0100 Message-ID: <4D5C793C.4090009@oracle.com> Date: Thu, 17 Feb 2011 02:26:20 +0100 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20101125 SUSE/3.0.11 Thunderbird/3.0.11 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: libstdc++ Subject: [v3] libstdc++/47773 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, tested x86_64-linux, committed to mainline. Paolo. ////////////////////////// 2011-02-16 Paolo Carlini 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. Index: include/ext/vstring.h =================================================================== --- include/ext/vstring.h (revision 170209) +++ include/ext/vstring.h (working copy) @@ -2731,6 +2731,66 @@ #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + +#include + +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 + 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 + 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 + 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 + 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 */ Index: testsuite/ext/vstring/hash/wchar_t/1.cc =================================================================== --- testsuite/ext/vstring/hash/wchar_t/1.cc (revision 0) +++ testsuite/ext/vstring/hash/wchar_t/1.cc (revision 0) @@ -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 +// . + +#include +#include +#include + +// libstdc++/47773 +void test01() +{ + bool test __attribute__((unused)) = true; + + typedef __gnu_cxx::__wvstring vstring_t; + typedef std::unordered_map 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; +} Index: testsuite/ext/vstring/hash/char/1.cc =================================================================== --- testsuite/ext/vstring/hash/char/1.cc (revision 0) +++ testsuite/ext/vstring/hash/char/1.cc (revision 0) @@ -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 +// . + +#include +#include +#include + +// libstdc++/47773 +void test01() +{ + bool test __attribute__((unused)) = true; + + typedef __gnu_cxx::__vstring vstring_t; + typedef std::unordered_map 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; +}