diff options
author | François Dumont <fdumont@gcc.gnu.org> | 2012-08-13 19:43:19 +0000 |
---|---|---|
committer | François Dumont <fdumont@gcc.gnu.org> | 2012-08-13 19:43:19 +0000 |
commit | 181a5a136f5b7e1690e94591d608c851bca19451 (patch) | |
tree | 0dc575864cfe869f2d5cba5d2728a0ccc9f3ce3a /libstdc++-v3/testsuite | |
parent | a327112f68b8e92ef04582002180fa5d8f715276 (diff) | |
download | gcc-181a5a136f5b7e1690e94591d608c851bca19451.zip gcc-181a5a136f5b7e1690e94591d608c851bca19451.tar.gz gcc-181a5a136f5b7e1690e94591d608c851bca19451.tar.bz2 |
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
Diffstat (limited to 'libstdc++-v3/testsuite')
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/unordered_map/operators/2.cc | 91 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/util/testsuite_counter_type.h | 122 |
2 files changed, 213 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/operators/2.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/operators/2.cc new file mode 100644 index 0000000..8c32824 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/operators/2.cc @@ -0,0 +1,91 @@ +// 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; +} diff --git a/libstdc++-v3/testsuite/util/testsuite_counter_type.h b/libstdc++-v3/testsuite/util/testsuite_counter_type.h new file mode 100644 index 0000000..2b7063d --- /dev/null +++ b/libstdc++-v3/testsuite/util/testsuite_counter_type.h @@ -0,0 +1,122 @@ +// -*- 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 |