Commit 181a5a13 by François Dumont

2012-08-10 François Dumont <fdumont@gcc.gnu.org>

	    Ollie Wild  <aaw@google.com>

	* include/bits/hashtable.h
	(_Hashtable<>_M_insert_multi_node(hash_code, node_type*)): New.
	(_Hashtable<>_M_insert(_Args&&, false_type)): Use latter.
	(_Hashtable<>::_M_emplace(false_type, _Args&&...)): Likewise.
	(_Hashtable<>::_M_insert_bucket): Replace by ...
	(_Hashtable<>::_M_insert_unique_node(size_type, hash_code, node_type*)):
	... this, new.
	(_Hashtable<>::_M_insert(_Args&&, true_type)): Use latter.
	(_Hashtable<>::_M_emplace(true_type, _Args&&...)): Likewise.
	* include/bits/hashtable_policy.h (_Map_base<>::operator[]): Use
	latter, emplace the value_type rather than insert.
	* include/std/unordered_map: Include tuple.
	* include/std/unordered_set: Likewise.
	* testsuite/util/testsuite_counter_type.h: New.
	* testsuite/23_containers/unordered_map/operators/2.cc: New.

Co-Authored-By: Ollie Wild <aaw@google.com>

From-SVN: r190355
parent a327112f
2012-08-13 François Dumont <fdumont@gcc.gnu.org>
Ollie Wild <aaw@google.com>
* include/bits/hashtable.h
(_Hashtable<>_M_insert_multi_node(hash_code, node_type*)): New.
(_Hashtable<>_M_insert(_Args&&, false_type)): Use latter.
(_Hashtable<>::_M_emplace(false_type, _Args&&...)): Likewise.
(_Hashtable<>::_M_insert_bucket): Replace by ...
(_Hashtable<>::_M_insert_unique_node(size_type, hash_code, node_type*)):
... this, new.
(_Hashtable<>::_M_insert(_Args&&, true_type)): Use latter.
(_Hashtable<>::_M_emplace(true_type, _Args&&...)): Likewise.
* include/bits/hashtable_policy.h (_Map_base<>::operator[]): Use
latter, emplace the value_type rather than insert.
* include/std/unordered_map: Include tuple.
* include/std/unordered_set: Likewise.
* testsuite/util/testsuite_counter_type.h: New.
* testsuite/23_containers/unordered_map/operators/2.cc: New.
2012-08-13 Marc Glisse <marc.glisse@inria.fr>
PR libstdc++/54112
......
......@@ -577,8 +577,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__node_type* __p = __h->_M_find_node(__n, __k, __code);
if (!__p)
return __h->_M_insert_bucket(std::make_pair(__k, mapped_type()),
__n, __code)->second;
{
__p = __h->_M_allocate_node(std::piecewise_construct,
std::tuple<const key_type&>(__k),
std::tuple<>());
return __h->_M_insert_unique_node(__n, __code, __p)->second;
}
return (__p->_M_v).second;
}
......@@ -598,9 +603,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__node_type* __p = __h->_M_find_node(__n, __k, __code);
if (!__p)
return __h->_M_insert_bucket(std::make_pair(std::move(__k),
mapped_type()),
__n, __code)->second;
{
__p = __h->_M_allocate_node(std::piecewise_construct,
std::forward_as_tuple(std::move(__k)),
std::tuple<>());
return __h->_M_insert_unique_node(__n, __code, __p)->second;
}
return (__p->_M_v).second;
}
......
......@@ -38,6 +38,7 @@
#include <utility>
#include <type_traits>
#include <initializer_list>
#include <tuple>
#include <bits/stl_algobase.h>
#include <bits/allocator.h>
#include <bits/stl_function.h> // equal_to, _Identity, _Select1st
......
......@@ -38,6 +38,7 @@
#include <utility>
#include <type_traits>
#include <initializer_list>
#include <tuple>
#include <bits/stl_algobase.h>
#include <bits/allocator.h>
#include <bits/stl_function.h> // equal_to, _Identity, _Select1st
......
// Copyright (C) 2012 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 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 COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// 23.5.4 template class unordered_map
// This test verifies that the value type of a unordered_map need not be
// default copyable.
// { dg-options "-std=gnu++11" }
#include <unordered_map>
#include <testsuite_hooks.h>
#include <testsuite_rvalref.h>
#include <testsuite_counter_type.h>
struct Mapped
{
Mapped() = default;
explicit Mapped(const Mapped&) = default;
};
struct DefaultConstructibleType
{
int val;
DefaultConstructibleType() : val(123)
{}
DefaultConstructibleType(const DefaultConstructibleType&) = delete;
DefaultConstructibleType(DefaultConstructibleType&&) = delete;
DefaultConstructibleType& operator=(int x)
{
val = x;
return *this;
}
};
void test01()
{
bool test __attribute__((unused)) = true;
using __gnu_test::rvalstruct;
using __gnu_test::counter_type;
std::unordered_map<int, Mapped> m1;
m1[0] = Mapped();
std::unordered_map<int, rvalstruct> m2;
m2[0] = rvalstruct(13);
std::unordered_map<int, DefaultConstructibleType> m3;
VERIFY( m3[0].val == 123 );
VERIFY( m3.size() == 1 );
m3[0] = 2;
VERIFY( m3[0].val == 2 );
std::unordered_map<counter_type, int,
__gnu_test::counter_type_hasher> m4;
VERIFY( m4[counter_type(1)] == 0 );
VERIFY( counter_type::specialize_count == 1 );
VERIFY( counter_type::copy_count == 0 );
VERIFY( counter_type::move_count == 1 );
counter_type k(2);
counter_type::reset();
VERIFY( m4[k] == 0 );
VERIFY( counter_type::copy_count == 1 );
VERIFY( counter_type::move_count == 0 );
}
int main()
{
test01();
return 0;
}
// -*- C++ -*-
//
// Copyright (C) 2012 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 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 COPYING3. If not see
// <http://www.gnu.org/licenses/>.
//
#ifndef _TESTSUITE_COUNTER_TYPE_H
#define _TESTSUITE_COUNTER_TYPE_H 1
namespace __gnu_test
{
// Type counting how many constructors or assign operators are invoked.
struct counter_type
{
// Constructor counters:
static int default_count;
static int specialize_count;
static int copy_count;
static int copy_assign_count;
static int less_compare_count;
#ifdef __GXX_EXPERIMENTAL_CXX0X__
static int move_count;
static int move_assign_count;
#endif
int val;
counter_type() : val(0)
{
++default_count;
}
counter_type(int inval) : val(inval)
{
++specialize_count;
}
counter_type(const counter_type& in) : val(in.val)
{
++copy_count;
}
counter_type&
operator=(const counter_type& in)
{
val = in.val;
++copy_assign_count;
return *this;
}
#ifdef __GXX_EXPERIMENTAL_CXX0X__
counter_type(counter_type&& in) noexcept
{
val = in.val;
++move_count;
}
counter_type&
operator=(counter_type&& rhs)
{
val = rhs.val;
++move_assign_count;
return *this;
}
#endif
static void
reset()
{
default_count = 0;
specialize_count = 0;
copy_count = 0;
copy_assign_count = 0;
less_compare_count = 0;
#ifdef __GXX_EXPERIMENTAL_CXX0X__
move_count = 0;
move_assign_count = 0;
#endif
}
bool operator==(const counter_type& rhs) const
{ return val == rhs.val; }
bool operator<(const counter_type& rhs) const
{ return val < rhs.val; }
};
int counter_type::default_count = 0;
int counter_type::specialize_count = 0;
int counter_type::copy_count = 0;
int counter_type::copy_assign_count = 0;
int counter_type::less_compare_count = 0;
#ifdef __GXX_EXPERIMENTAL_CXX0X__
int counter_type::move_count = 0;
int counter_type::move_assign_count = 0;
#endif
struct counter_type_hasher
{
std::size_t operator()(const counter_type& c) const
{
return c.val;
}
};
} // namespace __gnu_test
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment