PR78273 fix count to work with partitioning function
authorJonathan Wakely <jwakely@redhat.com>
Wed, 11 Jan 2017 14:44:04 +0000 (14:44 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 11 Jan 2017 14:44:04 +0000 (14:44 +0000)
PR libstdc++/78273
* include/bits/stl_map.h (map::count<_Kt>(const _Kt&)): Don't assume
the heterogeneous comparison can only find one match.
* include/bits/stl_set.h (set::count<_Kt>(const _Kt&)): Likewise.
* testsuite/23_containers/map/operations/2.cc: Test count works with
comparison function that just partitions rather than sorting.
* testsuite/23_containers/set/operations/2.cc: Likewise.

From-SVN: r244317

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_map.h
libstdc++-v3/include/bits/stl_set.h
libstdc++-v3/testsuite/23_containers/map/operations/2.cc
libstdc++-v3/testsuite/23_containers/set/operations/2.cc

index 82e6ef60f770ae8258137d295a5f3d008bb2e259..b52d6dfc8c7e45836dace79c9d0f5f55f5331063 100644 (file)
@@ -1,3 +1,13 @@
+2017-01-11  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/78273
+       * include/bits/stl_map.h (map::count<_Kt>(const _Kt&)): Don't assume
+       the heterogeneous comparison can only find one match.
+       * include/bits/stl_set.h (set::count<_Kt>(const _Kt&)): Likewise.
+       * testsuite/23_containers/map/operations/2.cc: Test count works with
+       comparison function that just partitions rather than sorting.
+       * testsuite/23_containers/set/operations/2.cc: Likewise.
+
 2017-01-11  Ville Voutilainen  <ville.voutilainen@gmail.com>
 
        Reduce the size of variant, it doesn't need an index of
index f2a0ffa04b71d9ea79a3bc002de18828e215115e..91b80d93e6b2ce8782f12fc71fa33649ad09bcea 100644 (file)
@@ -1194,7 +1194,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       template<typename _Kt>
        auto
        count(const _Kt& __x) const -> decltype(_M_t._M_count_tr(__x))
-       { return _M_t._M_find_tr(__x) == _M_t.end() ? 0 : 1; }
+       { return _M_t._M_count_tr(__x); }
 #endif
       //@}
 
index 66560a74533221fbd56174e8dd269e63532bef1a..ab960f18810aa03aa1c4148262cb59a4b86893bb 100644 (file)
@@ -739,7 +739,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        auto
        count(const _Kt& __x) const
        -> decltype(_M_t._M_count_tr(__x))
-       { return _M_t._M_find_tr(__x) == _M_t.end() ? 0 : 1; }
+       { return _M_t._M_count_tr(__x); }
 #endif
       //@}
 
index 650908486da06e52d560904be1c0b18482df9098..ef4e76b60e6fa447bada4f1b78a2b108e38628c8 100644 (file)
@@ -133,6 +133,27 @@ test05()
   VERIFY( Cmp::count == 0);
 }
 
+void
+test06()
+{
+  // PR libstdc++/78273
+
+  struct C {
+    bool operator()(int l, int r) const { return l < r; }
+
+    struct Partition { };
+
+    bool operator()(int l, Partition) const { return l < 2; }
+    bool operator()(Partition, int r) const { return 4 < r; }
+
+    using is_transparent = void;
+  };
+
+  std::map<int, int, C> m{ {1,0}, {2,0}, {3,0}, {4, 0}, {5, 0} };
+
+  auto n = m.count(C::Partition{});
+  VERIFY( n == 3 );
+}
 
 int
 main()
@@ -142,4 +163,5 @@ main()
   test03();
   test04();
   test05();
+  test06();
 }
index aa71ae5a8f6d9bef604d7147d82551870902b1bc..aef808d31b245653f6725d59c66d662298918434 100644 (file)
@@ -150,6 +150,28 @@ test06()
   s.find(i);
 }
 
+void
+test07()
+{
+  // PR libstdc++/78273
+
+  struct C {
+    bool operator()(int l, int r) const { return l < r; }
+
+    struct Partition { };
+
+    bool operator()(int l, Partition) const { return l < 2; }
+    bool operator()(Partition, int r) const { return 4 < r; }
+
+    using is_transparent = void;
+  };
+
+  std::set<int, C> s{ 1, 2, 3, 4, 5 };
+
+  auto n = s.count(C::Partition{});
+  VERIFY( n == 3 );
+}
+
 int
 main()
 {
@@ -159,4 +181,5 @@ main()
   test04();
   test05();
   test06();
+  test07();
 }