This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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.

Tested powerpc64le-linux, committed to trunk.


commit c38607c44696e07f44f56abf339f5453b04a5e70
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Jul 4 19:15:11 2018 +0100

    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.

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<typename _Kt>
+	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<typename _Kt>
+	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<typename _Kt>
+	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<typename _Kt>
+	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<typename _Cmp, typename _SfinaeType, typename = __void_t<>>
     struct __has_is_transparent
     { };
@@ -432,6 +432,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __has_is_transparent<_Cmp, _SfinaeType,
 				__void_t<typename _Cmp::is_transparent>>
     { typedef void type; };
+
+  template<typename _Cmp, typename _SfinaeType>
+    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<const_iterator, const_iterator>
       equal_range(const key_type& __k) const;
 
-#if __cplusplus > 201103L
+#if __cplusplus >= 201402L
       template<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::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<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::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<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::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<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::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<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::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<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::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<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::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<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::type>
+	       typename _Req = __has_is_transparent_t<_Compare, _Kt>>
 	pair<iterator, iterator>
 	_M_equal_range_tr(const _Kt& __k)
 	{
@@ -1354,8 +1350,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	}
 
       template<typename _Kt,
-	       typename _Req =
-		 typename __has_is_transparent<_Compare, _Kt>::type>
+	       typename _Req = __has_is_transparent_t<_Compare, _Kt>>
 	pair<const_iterator, const_iterator>
 	_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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <map>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::map<int, void*> 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<int, void*, std::less<>> 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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <map>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::multimap<int, void*> 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<int, void*, std::less<>> 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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <set>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::multiset<int> 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<int, std::less<>> 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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <set>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::set<int> 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<int, std::less<>> 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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <unordered_map>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::unordered_map<int, void*> 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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <unordered_map>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::unordered_multimap<int, void*> 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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <unordered_set>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::unordered_multiset<int> 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
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <unordered_set>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::unordered_set<int> 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();
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]