hashtable_policy.h (_Map_base<,, [...]): Add per DR 761.
2008-05-22 Paolo Carlini <paolo.carlini@oracle.com> * include/tr1_impl/hashtable_policy.h (_Map_base<,, std::_Select1st<_Pair>, true,>::at): Add per DR 761. * testsuite/23_containers/unordered_map/dr761.cc: New. * doc/xml/manual/intro.xml: Add an entry for DR 761. From-SVN: r135787
This commit is contained in:
parent
c63cac4791
commit
2aa5c17ce5
4 changed files with 143 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2008-05-22 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
|
* include/tr1_impl/hashtable_policy.h (_Map_base<,,
|
||||||
|
std::_Select1st<_Pair>, true,>::at): Add per DR 761.
|
||||||
|
* testsuite/23_containers/unordered_map/dr761.cc: New.
|
||||||
|
* doc/xml/manual/intro.xml: Add an entry for DR 761.
|
||||||
|
|
||||||
2008-05-22 Paolo Carlini <paolo.carlini@oracle.com>
|
2008-05-22 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
* testsuite/26_numerics/complex/dr781.cc: Add test variable.
|
* testsuite/26_numerics/complex/dr781.cc: Add test variable.
|
||||||
|
|
|
@ -629,6 +629,12 @@
|
||||||
<listitem><para>Make the member functions table and classic_table public.
|
<listitem><para>Make the member functions table and classic_table public.
|
||||||
</para></listitem></varlistentry>
|
</para></listitem></varlistentry>
|
||||||
|
|
||||||
|
<varlistentry><term><ulink url="lwg-active.html#761">761</ulink>:
|
||||||
|
<emphasis>unordered_map needs an at() member function</emphasis>
|
||||||
|
</term>
|
||||||
|
<listitem><para>In C++0x mode, add at() and at() const.
|
||||||
|
</para></listitem></varlistentry>
|
||||||
|
|
||||||
<varlistentry><term><ulink url="lwg-active.html#778">778</ulink>:
|
<varlistentry><term><ulink url="lwg-active.html#778">778</ulink>:
|
||||||
<emphasis>std::bitset does not have any constructor taking a string literal</emphasis>
|
<emphasis>std::bitset does not have any constructor taking a string literal</emphasis>
|
||||||
</term>
|
</term>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Internal policy header for TR1 unordered_set and unordered_map -*- C++ -*-
|
// Internal policy header for TR1 unordered_set and unordered_map -*- C++ -*-
|
||||||
|
|
||||||
// Copyright (C) 2007 Free Software Foundation, Inc.
|
// Copyright (C) 2007, 2008 Free Software Foundation, Inc.
|
||||||
//
|
//
|
||||||
// This file is part of the GNU ISO C++ Library. This library is free
|
// 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
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
@ -530,12 +530,22 @@ namespace __detail
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename _Key, typename _Pair, typename _Hashtable>
|
template<typename _Key, typename _Pair, typename _Hashtable>
|
||||||
struct _Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>
|
struct _Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>
|
||||||
{
|
{
|
||||||
typedef typename _Pair::second_type mapped_type;
|
typedef typename _Pair::second_type mapped_type;
|
||||||
|
|
||||||
mapped_type&
|
mapped_type&
|
||||||
operator[](const _Key& __k);
|
operator[](const _Key& __k);
|
||||||
|
|
||||||
|
#ifdef _GLIBCXX_INCLUDE_AS_CXX0X
|
||||||
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
|
// DR 761. unordered_map needs an at() member function.
|
||||||
|
mapped_type&
|
||||||
|
at(const _Key& __k);
|
||||||
|
|
||||||
|
const mapped_type&
|
||||||
|
at(const _Key& __k) const;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename _Key, typename _Pair, typename _Hashtable>
|
template<typename _Key, typename _Pair, typename _Hashtable>
|
||||||
|
@ -557,6 +567,44 @@ namespace __detail
|
||||||
return (__p->_M_v).second;
|
return (__p->_M_v).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _GLIBCXX_INCLUDE_AS_CXX0X
|
||||||
|
template<typename _Key, typename _Pair, typename _Hashtable>
|
||||||
|
typename _Map_base<_Key, _Pair, std::_Select1st<_Pair>,
|
||||||
|
true, _Hashtable>::mapped_type&
|
||||||
|
_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::
|
||||||
|
at(const _Key& __k)
|
||||||
|
{
|
||||||
|
_Hashtable* __h = static_cast<_Hashtable*>(this);
|
||||||
|
typename _Hashtable::_Hash_code_type __code = __h->_M_hash_code(__k);
|
||||||
|
std::size_t __n = __h->_M_bucket_index(__k, __code,
|
||||||
|
__h->_M_bucket_count);
|
||||||
|
|
||||||
|
typename _Hashtable::_Node* __p =
|
||||||
|
__h->_M_find_node(__h->_M_buckets[__n], __k, __code);
|
||||||
|
if (!__p)
|
||||||
|
__throw_out_of_range(__N("_Map_base::at"));
|
||||||
|
return (__p->_M_v).second;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename _Key, typename _Pair, typename _Hashtable>
|
||||||
|
const typename _Map_base<_Key, _Pair, std::_Select1st<_Pair>,
|
||||||
|
true, _Hashtable>::mapped_type&
|
||||||
|
_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::
|
||||||
|
at(const _Key& __k) const
|
||||||
|
{
|
||||||
|
const _Hashtable* __h = static_cast<const _Hashtable*>(this);
|
||||||
|
typename _Hashtable::_Hash_code_type __code = __h->_M_hash_code(__k);
|
||||||
|
std::size_t __n = __h->_M_bucket_index(__k, __code,
|
||||||
|
__h->_M_bucket_count);
|
||||||
|
|
||||||
|
typename _Hashtable::_Node* __p =
|
||||||
|
__h->_M_find_node(__h->_M_buckets[__n], __k, __code);
|
||||||
|
if (!__p)
|
||||||
|
__throw_out_of_range(__N("_Map_base::at"));
|
||||||
|
return (__p->_M_v).second;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// class template _Rehash_base. Give hashtable the max_load_factor
|
// class template _Rehash_base. Give hashtable the max_load_factor
|
||||||
// functions iff the rehash policy is _Prime_rehash_policy.
|
// functions iff the rehash policy is _Prime_rehash_policy.
|
||||||
template<typename _RehashPolicy, typename _Hashtable>
|
template<typename _RehashPolicy, typename _Hashtable>
|
||||||
|
|
80
libstdc++-v3/testsuite/23_containers/unordered_map/dr761.cc
Normal file
80
libstdc++-v3/testsuite/23_containers/unordered_map/dr761.cc
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
// 2008-05-22 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
//
|
||||||
|
// Copyright (C) 2008 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 2, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even 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 COPYING. If not, write to the Free
|
||||||
|
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
// USA.
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
// DR 761. unordered_map needs an at() member function.
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
typedef std::unordered_map<int, double> map_type;
|
||||||
|
|
||||||
|
{
|
||||||
|
map_type m;
|
||||||
|
m[0] = 1.5;
|
||||||
|
|
||||||
|
double& rd = m.at(0);
|
||||||
|
VERIFY( rd == 1.5 );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m.at(1);
|
||||||
|
}
|
||||||
|
catch(std::out_of_range& obj)
|
||||||
|
{
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
// Failed.
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
map_type m;
|
||||||
|
m[1] = 2.5;
|
||||||
|
const map_type cm(m);
|
||||||
|
|
||||||
|
const double& crd = cm.at(1);
|
||||||
|
VERIFY( crd == 2.5 );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cm.at(0);
|
||||||
|
}
|
||||||
|
catch(std::out_of_range& obj)
|
||||||
|
{
|
||||||
|
// Expected.
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
// Failed.
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue