From 3adea09eea448dde8d2c41807845cca6c4f30e89 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 4 Jul 2018 19:16:26 +0100 Subject: [PATCH] P0458R2 Checking for Existence of an Element in Associative Containers * include/bits/stl_map.h (map::contains): Add for C++2a. * include/bits/stl_multimap.h (multimap::contains): Likewise. * include/bits/stl_multiset.h (multiset::contains): Likewise. * include/bits/stl_set.h (set::contains): Likewise. * include/bits/stl_tree.h (__has_is_transparent_t): Define alias. (_Rb_tree::_M_find_tr, _Rb_tree::_M_count_tr) (_Rb_tree::_M_lower_bound_tr, _Rb_tree::_M_upper_bound_tr) (_Rb_tree::_M_equal_range_tr): Use __has_is_transparent_t. * include/bits/unordered_map.h (unordered_map::contains) (unordered_multimap::contains): Add for C++2a. * include/bits/unordered_set.h (unordered_set::contains) (unordered_multiset::contains): Likewise. * testsuite/23_containers/map/operations/contains.cc: New. * testsuite/23_containers/multimap/operations/contains.cc: New. * testsuite/23_containers/multiset/operations/contains.cc: New. * testsuite/23_containers/set/operations/contains.cc: New. * testsuite/23_containers/unordered_map/operations/contains.cc: New. * testsuite/23_containers/unordered_multimap/operations/contains.cc: New. * testsuite/23_containers/unordered_multiset/operations/contains.cc: New. * testsuite/23_containers/unordered_set/operations/contains.cc: New. From-SVN: r262418 --- libstdc++-v3/ChangeLog | 26 +++++++ libstdc++-v3/include/bits/stl_map.h | 19 +++++ libstdc++-v3/include/bits/stl_multimap.h | 19 +++++ libstdc++-v3/include/bits/stl_multiset.h | 19 +++++ libstdc++-v3/include/bits/stl_set.h | 19 +++++ libstdc++-v3/include/bits/stl_tree.h | 35 ++++----- libstdc++-v3/include/bits/unordered_map.h | 22 ++++++ libstdc++-v3/include/bits/unordered_set.h | 22 ++++++ .../23_containers/map/operations/contains.cc | 65 +++++++++++++++++ .../multimap/operations/contains.cc | 71 +++++++++++++++++++ .../multiset/operations/contains.cc | 71 +++++++++++++++++++ .../23_containers/set/operations/contains.cc | 65 +++++++++++++++++ .../unordered_map/operations/contains.cc | 42 +++++++++++ .../unordered_multimap/operations/contains.cc | 45 ++++++++++++ .../unordered_multiset/operations/contains.cc | 45 ++++++++++++ .../unordered_set/operations/contains.cc | 42 +++++++++++ 16 files changed, 607 insertions(+), 20 deletions(-) create mode 100644 libstdc++-v3/testsuite/23_containers/map/operations/contains.cc create mode 100644 libstdc++-v3/testsuite/23_containers/multimap/operations/contains.cc create mode 100644 libstdc++-v3/testsuite/23_containers/multiset/operations/contains.cc create mode 100644 libstdc++-v3/testsuite/23_containers/set/operations/contains.cc create mode 100644 libstdc++-v3/testsuite/23_containers/unordered_map/operations/contains.cc create mode 100644 libstdc++-v3/testsuite/23_containers/unordered_multimap/operations/contains.cc create mode 100644 libstdc++-v3/testsuite/23_containers/unordered_multiset/operations/contains.cc create mode 100644 libstdc++-v3/testsuite/23_containers/unordered_set/operations/contains.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 94db3f2ee17..0f46565a3eb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,29 @@ +2018-07-04 Jonathan Wakely + + P0458R2 Checking for Existence of an Element in Associative Containers + * include/bits/stl_map.h (map::contains): Add for C++2a. + * include/bits/stl_multimap.h (multimap::contains): Likewise. + * include/bits/stl_multiset.h (multiset::contains): Likewise. + * include/bits/stl_set.h (set::contains): Likewise. + * include/bits/stl_tree.h (__has_is_transparent_t): Define alias. + (_Rb_tree::_M_find_tr, _Rb_tree::_M_count_tr) + (_Rb_tree::_M_lower_bound_tr, _Rb_tree::_M_upper_bound_tr) + (_Rb_tree::_M_equal_range_tr): Use __has_is_transparent_t. + * include/bits/unordered_map.h (unordered_map::contains) + (unordered_multimap::contains): Add for C++2a. + * include/bits/unordered_set.h (unordered_set::contains) + (unordered_multiset::contains): Likewise. + * testsuite/23_containers/map/operations/contains.cc: New. + * testsuite/23_containers/multimap/operations/contains.cc: New. + * testsuite/23_containers/multiset/operations/contains.cc: New. + * testsuite/23_containers/set/operations/contains.cc: New. + * testsuite/23_containers/unordered_map/operations/contains.cc: New. + * testsuite/23_containers/unordered_multimap/operations/contains.cc: + New. + * testsuite/23_containers/unordered_multiset/operations/contains.cc: + New. + * testsuite/23_containers/unordered_set/operations/contains.cc: New. + 2018-07-03 François Dumont * include/debug/string diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index b81a2c4b7fc..fdd058b060d 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -1223,6 +1223,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #endif //@} +#if __cplusplus > 201703L + //@{ + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of (key, value) pairs to be located. + * @return True if there is an element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_t.find(__x) != _M_t.end(); } + + template + auto + contains(const _Kt& __x) const + -> decltype(_M_t._M_find_tr(__x), void(), true) + { return _M_t._M_find_tr(__x) != _M_t.end(); } + //@} +#endif + //@{ /** * @brief Finds the beginning of a subsequence matching given key. diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h index 23332ee53f8..9357d1db6aa 100644 --- a/libstdc++-v3/include/bits/stl_multimap.h +++ b/libstdc++-v3/include/bits/stl_multimap.h @@ -893,6 +893,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #endif //@} +#if __cplusplus > 201703L + //@{ + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of (key, value) pairs to be located. + * @return True if there is any element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_t.find(__x) != _M_t.end(); } + + template + auto + contains(const _Kt& __x) const + -> decltype(_M_t._M_find_tr(__x), void(), true) + { return _M_t._M_find_tr(__x) != _M_t.end(); } + //@} +#endif + //@{ /** * @brief Finds the beginning of a subsequence matching given key. diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index 829bc96e8b2..ebac76731ed 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -738,6 +738,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #endif //@} +#if __cplusplus > 201703L + //@{ + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of elements to be located. + * @return True if there is any element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_t.find(__x) != _M_t.end(); } + + template + auto + contains(const _Kt& __x) const + -> decltype(_M_t._M_find_tr(__x), void(), true) + { return _M_t._M_find_tr(__x) != _M_t.end(); } + //@} +#endif + // _GLIBCXX_RESOLVE_LIB_DEFECTS // 214. set::find() missing const overload //@{ diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index 41925265025..ee959d5fc1e 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -757,6 +757,25 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #endif //@} +#if __cplusplus > 201703L + //@{ + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of elements to be located. + * @return True if there is an element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_t.find(__x) != _M_t.end(); } + + template + auto + contains(const _Kt& __x) const + -> decltype(_M_t._M_find_tr(__x), void(), true) + { return _M_t._M_find_tr(__x) != _M_t.end(); } + //@} +#endif + // _GLIBCXX_RESOLVE_LIB_DEFECTS // 214. set::find() missing const overload //@{ diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index 2403eba8eb3..0544f99f9ab 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -423,7 +423,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z, _Rb_tree_node_base& __header) throw (); -#if __cplusplus > 201103L +#if __cplusplus >= 201402L template> struct __has_is_transparent { }; @@ -432,6 +432,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __has_is_transparent<_Cmp, _SfinaeType, __void_t> { typedef void type; }; + + template + using __has_is_transparent_t + = typename __has_is_transparent<_Cmp, _SfinaeType>::type; #endif #if __cplusplus > 201402L @@ -1251,10 +1255,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION pair equal_range(const key_type& __k) const; -#if __cplusplus > 201103L +#if __cplusplus >= 201402L template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> iterator _M_find_tr(const _Kt& __k) { @@ -1263,8 +1266,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> const_iterator _M_find_tr(const _Kt& __k) const { @@ -1275,8 +1277,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> size_type _M_count_tr(const _Kt& __k) const { @@ -1285,8 +1286,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> iterator _M_lower_bound_tr(const _Kt& __k) { @@ -1295,8 +1295,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> const_iterator _M_lower_bound_tr(const _Kt& __k) const { @@ -1314,8 +1313,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> iterator _M_upper_bound_tr(const _Kt& __k) { @@ -1324,8 +1322,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> const_iterator _M_upper_bound_tr(const _Kt& __k) const { @@ -1343,8 +1340,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> pair _M_equal_range_tr(const _Kt& __k) { @@ -1354,8 +1350,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template::type> + typename _Req = __has_is_transparent_t<_Compare, _Kt>> pair _M_equal_range_tr(const _Kt& __k) const { diff --git a/libstdc++-v3/include/bits/unordered_map.h b/libstdc++-v3/include/bits/unordered_map.h index 07aad9e5e19..9a9332f0305 100644 --- a/libstdc++-v3/include/bits/unordered_map.h +++ b/libstdc++-v3/include/bits/unordered_map.h @@ -941,6 +941,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER count(const key_type& __x) const { return _M_h.count(__x); } +#if __cplusplus > 201703L + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of elements to be located. + * @return True if there is any element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_h.find(__x) != _M_h.end(); } +#endif + //@{ /** * @brief Finds a subsequence matching given key. @@ -1819,6 +1830,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER count(const key_type& __x) const { return _M_h.count(__x); } +#if __cplusplus > 201703L + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of elements to be located. + * @return True if there is any element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_h.find(__x) != _M_h.end(); } +#endif + //@{ /** * @brief Finds a subsequence matching given key. diff --git a/libstdc++-v3/include/bits/unordered_set.h b/libstdc++-v3/include/bits/unordered_set.h index c9ac4ad57e3..4c49ae945fc 100644 --- a/libstdc++-v3/include/bits/unordered_set.h +++ b/libstdc++-v3/include/bits/unordered_set.h @@ -667,6 +667,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER count(const key_type& __x) const { return _M_h.count(__x); } +#if __cplusplus > 201703L + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of elements to be located. + * @return True if there is any element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_h.find(__x) != _M_h.end(); } +#endif + //@{ /** * @brief Finds a subsequence matching given key. @@ -1445,6 +1456,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER count(const key_type& __x) const { return _M_h.count(__x); } +#if __cplusplus > 201703L + /** + * @brief Finds whether an element with the given key exists. + * @param __x Key of elements to be located. + * @return True if there is any element with the specified key. + */ + bool + contains(const key_type& __x) const + { return _M_h.find(__x) != _M_h.end(); } +#endif + //@{ /** * @brief Finds a subsequence matching given key. diff --git a/libstdc++-v3/testsuite/23_containers/map/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/map/operations/contains.cc new file mode 100644 index 00000000000..a994fa51246 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/map/operations/contains.cc @@ -0,0 +1,65 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::map m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m[0] = nullptr; + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m[1] = nullptr; + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +struct Zero { }; +bool operator<(Zero, int i) { return 0 < i; } +bool operator<(int i, Zero) { return i < 0; } + +struct One { }; +bool operator<(One, int i) { return 1 < i; } +bool operator<(int i, One) { return i < 1; } + +void +test02() +{ + std::map> m; + VERIFY( ! m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m[0] = nullptr; + VERIFY( m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m[1] = nullptr; + VERIFY( m.contains( Zero{} ) ); + VERIFY( m.contains( One{} ) ); +} + +int +main() +{ + test01(); + test02(); +} diff --git a/libstdc++-v3/testsuite/23_containers/multimap/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/multimap/operations/contains.cc new file mode 100644 index 00000000000..1f0617db662 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/multimap/operations/contains.cc @@ -0,0 +1,71 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::multimap m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0, nullptr); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0, nullptr); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(1, nullptr); + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +struct Zero { }; +bool operator<(Zero, int i) { return 0 < i; } +bool operator<(int i, Zero) { return i < 0; } + +struct One { }; +bool operator<(One, int i) { return 1 < i; } +bool operator<(int i, One) { return i < 1; } + +void +test02() +{ + std::multimap> m; + VERIFY( ! m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.emplace(0, nullptr); + VERIFY( m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.emplace(0, nullptr); + VERIFY( m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.emplace(1, nullptr); + VERIFY( m.contains( Zero{} ) ); + VERIFY( m.contains( One{} ) ); +} + +int +main() +{ + test01(); + test02(); +} diff --git a/libstdc++-v3/testsuite/23_containers/multiset/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/multiset/operations/contains.cc new file mode 100644 index 00000000000..09c08112b60 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/multiset/operations/contains.cc @@ -0,0 +1,71 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::multiset m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(1); + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +struct Zero { }; +bool operator<(Zero, int i) { return 0 < i; } +bool operator<(int i, Zero) { return i < 0; } + +struct One { }; +bool operator<(One, int i) { return 1 < i; } +bool operator<(int i, One) { return i < 1; } + +void +test02() +{ + std::multiset> m; + VERIFY( ! m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.emplace(0); + VERIFY( m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.emplace(0); + VERIFY( m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.emplace(1); + VERIFY( m.contains( Zero{} ) ); + VERIFY( m.contains( One{} ) ); +} + +int +main() +{ + test01(); + test02(); +} diff --git a/libstdc++-v3/testsuite/23_containers/set/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/set/operations/contains.cc new file mode 100644 index 00000000000..a69701bcbb3 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/set/operations/contains.cc @@ -0,0 +1,65 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::set m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.insert(0); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.insert(1); + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +struct Zero { }; +bool operator<(Zero, int i) { return 0 < i; } +bool operator<(int i, Zero) { return i < 0; } + +struct One { }; +bool operator<(One, int i) { return 1 < i; } +bool operator<(int i, One) { return i < 1; } + +void +test02() +{ + std::set> m; + VERIFY( ! m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.insert(0); + VERIFY( m.contains( Zero{} ) ); + VERIFY( ! m.contains( One{} ) ); + m.insert(1); + VERIFY( m.contains( Zero{} ) ); + VERIFY( m.contains( One{} ) ); +} + +int +main() +{ + test01(); + test02(); +} diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/operations/contains.cc new file mode 100644 index 00000000000..a3b38205085 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/operations/contains.cc @@ -0,0 +1,42 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::unordered_map m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m[0] = nullptr; + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m[1] = nullptr; + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/operations/contains.cc new file mode 100644 index 00000000000..2e2f383e490 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/operations/contains.cc @@ -0,0 +1,45 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::unordered_multimap m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0, nullptr); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0, nullptr); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(1, nullptr); + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/operations/contains.cc new file mode 100644 index 00000000000..9c32e2d5d3f --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/operations/contains.cc @@ -0,0 +1,45 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::unordered_multiset m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(0); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.emplace(1); + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/operations/contains.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/operations/contains.cc new file mode 100644 index 00000000000..b6e2d0e580a --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/operations/contains.cc @@ -0,0 +1,42 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do run { target c++2a } } + +#include +#include + +void +test01() +{ + std::unordered_set m; + VERIFY( ! m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.insert(0); + VERIFY( m.contains( 0 ) ); + VERIFY( ! m.contains( 1 ) ); + m.insert(1); + VERIFY( m.contains( 0 ) ); + VERIFY( m.contains( 1 ) ); +} + +int +main() +{ + test01(); +} -- 2.30.2