diff options
| author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-01-16 09:20:34 +0000 |
|---|---|---|
| committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-01-16 09:20:34 +0000 |
| commit | 17ae7f11546e1ce8bec4e4ec71ccb59891ad19cc (patch) | |
| tree | 09d17ad81858e565dc037a69cf4b591e41101256 /libstdc++-v3/include | |
| parent | 31fd081da3d7a8b1184013bf5f9ad06e1ee02462 (diff) | |
| download | ppe42-gcc-17ae7f11546e1ce8bec4e4ec71ccb59891ad19cc.tar.gz ppe42-gcc-17ae7f11546e1ce8bec4e4ec71ccb59891ad19cc.zip | |
PR libstdc++/55043
* include/std/unordered_map: Include alloc_traits.h
* include/std/unordered_set: Likewise.
* include/bits/alloc_traits.h: Define __is_copy_insertable.
* include/bits/unordered_map.h: Use it.
* include/bits/unordered_set.h: Likewise.
* include/debug/unordered_map.h: Likewise.
* include/debug/unordered_set.h: Likewise.
* include/profile/unordered_map.h: Likewise.
* include/profile/unordered_set.h: Likewise.
* include/bits/hashtable.h: Fix comment typos.
* testsuite/23_containers/unordered_map/55043.cc: New.
* testsuite/23_containers/unordered_multimap/55043.cc: New.
* testsuite/23_containers/unordered_multiset/55043.cc: New.
* testsuite/23_containers/unordered_set/55043.cc: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195231 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include')
| -rw-r--r-- | libstdc++-v3/include/bits/alloc_traits.h | 40 | ||||
| -rw-r--r-- | libstdc++-v3/include/bits/hashtable.h | 4 | ||||
| -rw-r--r-- | libstdc++-v3/include/bits/unordered_map.h | 20 | ||||
| -rw-r--r-- | libstdc++-v3/include/bits/unordered_set.h | 19 | ||||
| -rw-r--r-- | libstdc++-v3/include/debug/unordered_map | 27 | ||||
| -rw-r--r-- | libstdc++-v3/include/debug/unordered_set | 24 | ||||
| -rw-r--r-- | libstdc++-v3/include/profile/unordered_map | 28 | ||||
| -rw-r--r-- | libstdc++-v3/include/profile/unordered_set | 25 | ||||
| -rw-r--r-- | libstdc++-v3/include/std/unordered_map | 3 | ||||
| -rw-r--r-- | libstdc++-v3/include/std/unordered_set | 3 |
10 files changed, 181 insertions, 12 deletions
diff --git a/libstdc++-v3/include/bits/alloc_traits.h b/libstdc++-v3/include/bits/alloc_traits.h index 9abadbb77ce..c6259a1d014 100644 --- a/libstdc++-v3/include/bits/alloc_traits.h +++ b/libstdc++-v3/include/bits/alloc_traits.h @@ -1,6 +1,6 @@ // Allocator traits -*- C++ -*- -// Copyright (C) 2011-2012 Free Software Foundation, Inc. +// Copyright (C) 2011-2013 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 @@ -39,6 +39,9 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION + template<typename _Tp> + class allocator; + template<typename _Alloc, typename _Tp> class __alloctr_rebind_helper { @@ -506,6 +509,41 @@ _GLIBCXX_ALLOC_TR_NESTED_TYPE(propagate_on_container_swap, __do_alloc_on_swap(__one, __two, __pocs()); } + template<typename _Alloc> + class __is_copy_insertable_impl + { + typedef allocator_traits<_Alloc> _Traits; + + template<typename _Up, typename + = decltype(_Traits::construct(std::declval<_Alloc&>(), + std::declval<_Up*>(), + std::declval<const _Up&>()))> + static true_type + _M_select(int); + + template<typename _Up> + static false_type + _M_select(...); + + public: + typedef decltype(_M_select<typename _Alloc::value_type>(0)) type; + }; + + template<typename _Alloc> + struct __is_copy_insertable + : __is_copy_insertable_impl<_Alloc>::type + { }; + + // std::allocator<_Tp> just requires CopyConstructible + template<typename _Tp> + struct __is_copy_insertable<allocator<_Tp>> + : is_copy_constructible<_Tp> + { }; + + template<typename _Container> + using __has_copy_insertable_val + = __is_copy_insertable<typename _Container::allocator_type>; + _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index fab6c7cb98e..49cb4db9723 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -370,7 +370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Hashtable(_Hashtable&&); - // Use delegating construtors. + // Use delegating constructors. explicit _Hashtable(size_type __n = 10, const _H1& __hf = _H1(), @@ -914,7 +914,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_element_count(__ht._M_element_count), _M_rehash_policy(__ht._M_rehash_policy) { - // Update, if necessary, bucket pointing to before begin that hasn't move. + // Update, if necessary, bucket pointing to before begin that hasn't moved. if (_M_begin()) _M_buckets[_M_bucket_index(_M_begin())] = &_M_before_begin(); __ht._M_rehash_policy = _RehashPolicy(); diff --git a/libstdc++-v3/include/bits/unordered_map.h b/libstdc++-v3/include/bits/unordered_map.h index 9fa0553f211..0235a99e970 100644 --- a/libstdc++-v3/include/bits/unordered_map.h +++ b/libstdc++-v3/include/bits/unordered_map.h @@ -1408,6 +1408,26 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { return !(__x == __y); } _GLIBCXX_END_NAMESPACE_CONTAINER + + template<typename _Key, typename _Tp, typename _Hash, typename _Pred, + typename _Alloc> + struct + is_copy_constructible<_GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, + _Pred, _Alloc>> + : __has_copy_insertable_val<_GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, + _Pred, _Alloc>> + { }; + + template<typename _Key, typename _Tp, typename _Hash, typename _Pred, + typename _Alloc> + struct + is_copy_constructible<_GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, + _Pred, _Alloc>> + : __has_copy_insertable_val<_GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, + _Hash, _Pred, + _Alloc>> + { }; + } // namespace std #endif /* _UNORDERED_MAP_H */ diff --git a/libstdc++-v3/include/bits/unordered_set.h b/libstdc++-v3/include/bits/unordered_set.h index c3eaa48f5da..2ada63dcde6 100644 --- a/libstdc++-v3/include/bits/unordered_set.h +++ b/libstdc++-v3/include/bits/unordered_set.h @@ -1,6 +1,6 @@ // unordered_set implementation -*- C++ -*- -// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. +// Copyright (C) 2010-2013 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 @@ -1291,6 +1291,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { return !(__x == __y); } _GLIBCXX_END_NAMESPACE_CONTAINER + + template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> + struct is_copy_constructible<_GLIBCXX_STD_C::unordered_set<_Key, _Hash, + _Pred, _Alloc>> + : __has_copy_insertable_val<_GLIBCXX_STD_C::unordered_set<_Key, _Hash, + _Pred, _Alloc>> + { }; + + template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> + struct + is_copy_constructible<_GLIBCXX_STD_C::unordered_multiset<_Key, _Hash, + _Pred, _Alloc>> + : __has_copy_insertable_val<_GLIBCXX_STD_C::unordered_multiset<_Key, _Hash, + _Pred, + _Alloc>> + { }; + } // namespace std #endif /* _UNORDERED_SET_H */ diff --git a/libstdc++-v3/include/debug/unordered_map b/libstdc++-v3/include/debug/unordered_map index 1c99ac842b6..115abb58865 100644 --- a/libstdc++-v3/include/debug/unordered_map +++ b/libstdc++-v3/include/debug/unordered_map @@ -1,7 +1,6 @@ // Debugging unordered_map/unordered_multimap implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -// Free Software Foundation, Inc. +// Copyright (C) 2003-2013 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 @@ -939,6 +938,30 @@ namespace __debug { return !(__x == __y); } } // namespace __debug + +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + template<typename _Key, typename _Tp, typename _Hash, typename _Pred, + typename _Alloc> + struct + is_copy_constructible<__debug::unordered_map<_Key, _Tp, _Hash, _Pred, + _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_C::unordered_map<_Key, _Tp, + _Hash, _Pred, + _Alloc> > + { }; + + template<typename _Key, typename _Tp, typename _Hash, typename _Pred, + typename _Alloc> + struct + is_copy_constructible<__debug::unordered_multimap<_Key, _Tp, _Hash, _Pred, + _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, + _Hash, _Pred, + _Alloc> > + { }; + +_GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++11 diff --git a/libstdc++-v3/include/debug/unordered_set b/libstdc++-v3/include/debug/unordered_set index d270ecc96d3..895c9439f6e 100644 --- a/libstdc++-v3/include/debug/unordered_set +++ b/libstdc++-v3/include/debug/unordered_set @@ -1,7 +1,6 @@ // Debugging unordered_set/unordered_multiset implementation -*- C++ -*- -// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -// Free Software Foundation, Inc. +// Copyright (C) 2003-2013 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 @@ -921,6 +920,27 @@ namespace __debug { return !(__x == __y); } } // namespace __debug + +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> + struct + is_copy_constructible<__debug::unordered_set<_Key, _Hash, _Pred, _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_C::unordered_set<_Key, + _Hash, _Pred, + _Alloc> > + { }; + + template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> + struct + is_copy_constructible<__debug::unordered_multiset<_Key, _Hash, _Pred, + _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_C::unordered_multiset<_Key, + _Hash, _Pred, + _Alloc> > + { }; + +_GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++11 diff --git a/libstdc++-v3/include/profile/unordered_map b/libstdc++-v3/include/profile/unordered_map index e7b4c379ac4..5ebcbf60fcb 100644 --- a/libstdc++-v3/include/profile/unordered_map +++ b/libstdc++-v3/include/profile/unordered_map @@ -1,6 +1,6 @@ // Profiling unordered_map/unordered_multimap implementation -*- C++ -*- -// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +// Copyright (C) 2009-2013 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 @@ -339,11 +339,25 @@ namespace __profile const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) { return !(__x == __y); } +} // namespace __profile + +_GLIBCXX_BEGIN_NAMESPACE_VERSION + template<typename _Key, typename _Tp, typename _Hash, typename _Pred, + typename _Alloc> + struct + is_copy_constructible<__profile::unordered_map<_Key, _Tp, _Hash, + _Pred, _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_BASE > + { }; +_GLIBCXX_END_NAMESPACE_VERSION + #undef _GLIBCXX_BASE #undef _GLIBCXX_STD_BASE #define _GLIBCXX_BASE unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc> #define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE +namespace __profile +{ /// Class std::unordered_multimap wrapper with performance instrumentation. template<typename _Key, typename _Tp, typename _Hash = std::hash<_Key>, @@ -609,6 +623,18 @@ namespace __profile { return !(__x == __y); } } // namespace __profile + +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + template<typename _Key, typename _Tp, typename _Hash, typename _Pred, + typename _Alloc> + struct + is_copy_constructible<__profile::unordered_multimap<_Key, _Tp, _Hash, + _Pred, _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_BASE > + { }; + +_GLIBCXX_END_NAMESPACE_VERSION } // namespace std #undef _GLIBCXX_BASE diff --git a/libstdc++-v3/include/profile/unordered_set b/libstdc++-v3/include/profile/unordered_set index 357c073feaa..ebe1c7d6f12 100644 --- a/libstdc++-v3/include/profile/unordered_set +++ b/libstdc++-v3/include/profile/unordered_set @@ -1,6 +1,6 @@ // Profiling unordered_set/unordered_multiset implementation -*- C++ -*- -// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2009-2013 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 @@ -305,11 +305,23 @@ namespace __profile const unordered_set<_Key, _Hash, _Pred, _Alloc>& __y) { return !(__x == __y); } +} // namespace __profile + +_GLIBCXX_BEGIN_NAMESPACE_VERSION + template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> + struct + is_copy_constructible<__profile::unordered_set<_Key, _Hash, _Pred, _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_BASE > + { }; +_GLIBCXX_END_NAMESPACE_VERSION + #undef _GLIBCXX_BASE #undef _GLIBCXX_STD_BASE #define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE #define _GLIBCXX_BASE unordered_multiset<_Value, _Hash, _Pred, _Alloc> +namespace __profile +{ /** @brief Unordered_multiset wrapper with performance instrumentation. */ template<typename _Value, typename _Hash = std::hash<_Value>, @@ -568,6 +580,17 @@ namespace __profile { return !(__x == __y); } } // namespace __profile + +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + template<typename _Value, typename _Hash, typename _Pred, typename _Alloc> + struct + is_copy_constructible<__profile::unordered_multiset<_Value, _Hash, + _Pred, _Alloc>> + : is_copy_constructible< _GLIBCXX_STD_BASE > + { }; + +_GLIBCXX_END_NAMESPACE_VERSION } // namespace std #undef _GLIBCXX_BASE diff --git a/libstdc++-v3/include/std/unordered_map b/libstdc++-v3/include/std/unordered_map index 35142034298..7c10173f9b1 100644 --- a/libstdc++-v3/include/std/unordered_map +++ b/libstdc++-v3/include/std/unordered_map @@ -1,6 +1,6 @@ // <unordered_map> -*- C++ -*- -// Copyright (C) 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc. +// Copyright (C) 2007-2013 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 @@ -41,6 +41,7 @@ #include <tuple> #include <bits/stl_algobase.h> #include <bits/allocator.h> +#include <bits/alloc_traits.h> #include <bits/stl_function.h> // equal_to, _Identity, _Select1st #include <bits/functional_hash.h> #include <bits/hashtable.h> diff --git a/libstdc++-v3/include/std/unordered_set b/libstdc++-v3/include/std/unordered_set index af6f624ef8b..cfe91ad3d91 100644 --- a/libstdc++-v3/include/std/unordered_set +++ b/libstdc++-v3/include/std/unordered_set @@ -1,6 +1,6 @@ // <unordered_set> -*- C++ -*- -// Copyright (C) 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc. +// Copyright (C) 2007-2013 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 @@ -41,6 +41,7 @@ #include <tuple> #include <bits/stl_algobase.h> #include <bits/allocator.h> +#include <bits/alloc_traits.h> #include <bits/stl_function.h> // equal_to, _Identity, _Select1st #include <bits/functional_hash.h> #include <bits/hashtable.h> |

