[libcxx-commits] [libcxx] 56c8ad2 - [libcxx][NFC] Add tests for associative containers key_comp and value_comp

Ruslan Arutyunyan via libcxx-commits libcxx-commits at lists.llvm.org
Fri Nov 26 14:50:02 PST 2021


Author: Konstantin Boyarinov
Date: 2021-11-27T01:46:22+03:00
New Revision: 56c8ad237aa4088e61be09ca30830ee704f10018

URL: https://github.com/llvm/llvm-project/commit/56c8ad237aa4088e61be09ca30830ee704f10018
DIFF: https://github.com/llvm/llvm-project/commit/56c8ad237aa4088e61be09ca30830ee704f10018.diff

LOG: [libcxx][NFC] Add tests for associative containers key_comp and value_comp

Add missing tests to improve associative containers code coverage:
 - Tests for key_comp() and value_comp() observers
 - Tests for std::map and std::multimap value_compare member class

Reviewed by: ldionne, rarutyun, #libc

Differential Revision: https://reviews.llvm.org/D113998

Added: 
    libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp
    libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp
    libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp
    libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp
    libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp
    libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp
    libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp
    libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp
    libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp
    libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp

Modified: 
    libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp
    libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp
    libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp
    libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp
index 4e55490ebc663..04702f319771e 100644
--- a/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp
+++ b/libcxx/test/std/containers/associative/map/map.cons/compare.pass.cpp
@@ -12,8 +12,6 @@
 
 // explicit map(const key_compare& comp);
 
-// key_compare key_comp() const;
-
 #include <map>
 #include <cassert>
 

diff  --git a/libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp b/libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp
new file mode 100644
index 0000000000000..f44e78fd283ed
--- /dev/null
+++ b/libcxx/test/std/containers/associative/map/map.observers/key_comp.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// key_compare key_comp() const;
+
+#include <map>
+#include <cassert>
+#include <string>
+
+int main(int, char**) {
+    typedef std::map<int, std::string> map_type;
+
+    map_type m;
+    std::pair<map_type::iterator, bool> p1 = m.insert(map_type::value_type(1, "abc"));
+    std::pair<map_type::iterator, bool> p2 = m.insert(map_type::value_type(2, "abc"));
+
+    const map_type& cm = m;
+
+    assert(cm.key_comp()(p1.first->first, p2.first->first));
+    assert(!cm.key_comp()(p2.first->first, p1.first->first));
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp b/libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp
new file mode 100644
index 0000000000000..02b9659649833
--- /dev/null
+++ b/libcxx/test/std/containers/associative/map/map.observers/value_comp.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// value_compare value_comp() const;
+
+#include <map>
+#include <cassert>
+#include <string>
+
+int main(int, char**) {
+    typedef std::map<int, std::string> map_type;
+
+    map_type m;
+    std::pair<map_type::iterator, bool> p1 = m.insert(map_type::value_type(1, "abc"));
+    std::pair<map_type::iterator, bool> p2 = m.insert(map_type::value_type(2, "abc"));
+
+    const map_type& cm = m;
+
+    assert(cm.value_comp()(*p1.first, *p2.first));
+    assert(!cm.value_comp()(*p2.first, *p1.first));
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp b/libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp
new file mode 100644
index 0000000000000..2cfbb2ad5c2b2
--- /dev/null
+++ b/libcxx/test/std/containers/associative/map/map.value_compare/invoke.pass.cpp
@@ -0,0 +1,47 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// class value_compare
+
+// bool operator()( const value_type& lhs, const value_type& rhs ) const;
+
+#include <map>
+#include <cassert>
+#include <string>
+#include <utility>
+
+template <typename Map>
+struct CallCompMember : Map::value_compare {
+    CallCompMember(const typename Map::value_compare& vc) : Map::value_compare(vc) {}
+
+    typedef typename Map::value_type value_type;
+    bool operator()(const value_type& value1, const value_type& value2) const {
+        return this->comp(value1.first, value2.first);
+    }
+};
+
+int main(int, char**) {
+    typedef std::map<int, std::string> map_type;
+
+    map_type m;
+    std::pair<map_type::iterator, bool> p1 = m.insert(map_type::value_type(1, "abc"));
+    std::pair<map_type::iterator, bool> p2 = m.insert(map_type::value_type(2, "abc"));
+
+    const map_type::value_compare vc = m.value_comp();
+    CallCompMember<map_type> call_comp = m.value_comp();
+
+    assert(vc(*p1.first, *p2.first));
+    assert(call_comp(*p1.first, *p2.first));
+
+    assert(!vc(*p2.first, *p1.first));
+    assert(!call_comp(*p2.first, *p1.first));
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp b/libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp
new file mode 100644
index 0000000000000..1d6069933eead
--- /dev/null
+++ b/libcxx/test/std/containers/associative/map/map.value_compare/types.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// class value_compare
+
+// REQUIRES: c++98 || c++03 || c++11 || c++14
+
+#include <map>
+#include <string>
+
+#include "test_macros.h"
+
+int main(int, char**) {
+    typedef std::map<int, std::string> map_type;
+    typedef map_type::value_compare value_compare;
+    typedef map_type::value_type value_type;
+
+    ASSERT_SAME_TYPE(value_compare::result_type, bool);
+    ASSERT_SAME_TYPE(value_compare::first_argument_type, value_type);
+    ASSERT_SAME_TYPE(value_compare::second_argument_type, value_type);
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp
index 5cf4b5d8c8736..ebe1c9d6c7237 100644
--- a/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp
+++ b/libcxx/test/std/containers/associative/multimap/multimap.cons/compare.pass.cpp
@@ -12,8 +12,6 @@
 
 // explicit multimap(const key_compare& comp);
 
-// key_compare key_comp() const;
-
 #include <map>
 #include <cassert>
 

diff  --git a/libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp
new file mode 100644
index 0000000000000..cc6b18c1b0e01
--- /dev/null
+++ b/libcxx/test/std/containers/associative/multimap/multimap.observers/key_comp.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// key_compare key_comp() const;
+
+#include <map>
+#include <cassert>
+#include <string>
+
+int main(int, char**) {
+    typedef std::multimap<int, std::string> map_type;
+
+    map_type m;
+    map_type::iterator i1 = m.insert(map_type::value_type(1, "abc"));
+    map_type::iterator i2 = m.insert(map_type::value_type(2, "abc"));
+
+    const map_type& cm = m;
+
+    assert(cm.key_comp()(i1->first, i2->first));
+    assert(!cm.key_comp()(i2->first, i1->first));
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp
new file mode 100644
index 0000000000000..3b9ed80598c46
--- /dev/null
+++ b/libcxx/test/std/containers/associative/multimap/multimap.observers/value_comp.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// value_compare value_comp() const;
+
+#include <map>
+#include <cassert>
+#include <string>
+
+int main(int, char**) {
+    typedef std::multimap<int, std::string> map_type;
+
+    map_type m;
+    map_type::iterator i1 = m.insert(map_type::value_type(1, "abc"));
+    map_type::iterator i2 = m.insert(map_type::value_type(2, "abc"));
+
+    const map_type& cm = m;
+
+    assert(cm.value_comp()(*i1, *i2));
+    assert(!cm.value_comp()(*i2, *i1));
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp
new file mode 100644
index 0000000000000..75a1114ed5e09
--- /dev/null
+++ b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/invoke.pass.cpp
@@ -0,0 +1,47 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// class value_compare
+
+// bool operator()( const value_type& lhs, const value_type& rhs ) const;
+
+#include <map>
+#include <cassert>
+#include <string>
+#include <utility>
+
+template <typename MMap>
+struct CallCompMember : MMap::value_compare {
+    CallCompMember(const typename MMap::value_compare& vc) : MMap::value_compare(vc) {}
+
+    typedef typename MMap::value_type value_type;
+    bool operator()(const value_type& value1, const value_type& value2) const {
+        return this->comp(value1.first, value2.first);
+    }
+};
+
+int main(int, char**) {
+    typedef std::multimap<int, std::string> map_type;
+
+    map_type m;
+    map_type::iterator i1 = m.insert(map_type::value_type(1, "abc"));
+    map_type::iterator i2 = m.insert(map_type::value_type(2, "abc"));
+
+    const map_type::value_compare vc = m.value_comp();
+    CallCompMember<map_type> call_comp = m.value_comp();
+
+    assert(vc(*i1, *i2));
+    assert(call_comp(*i1, *i2));
+
+    assert(!vc(*i2, *i1));
+    assert(!call_comp(*i2, *i1));
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp
new file mode 100644
index 0000000000000..6ecaf9247ebe4
--- /dev/null
+++ b/libcxx/test/std/containers/associative/multimap/multimap.value_compare/types.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <map>
+
+// class value_compare
+
+// REQUIRES: c++98 || c++03 || c++11 || c++14
+
+#include <map>
+#include <string>
+
+#include "test_macros.h"
+
+int main(int, char**) {
+    typedef std::multimap<int, std::string> map_type;
+    typedef map_type::value_compare value_compare;
+    typedef map_type::value_type value_type;
+
+    ASSERT_SAME_TYPE(value_compare::result_type, bool);
+    ASSERT_SAME_TYPE(value_compare::first_argument_type, value_type);
+    ASSERT_SAME_TYPE(value_compare::second_argument_type, value_type);
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp
index e9a78b642dfcc..6debbd6d3d852 100644
--- a/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp
+++ b/libcxx/test/std/containers/associative/multiset/multiset.cons/compare.pass.cpp
@@ -10,11 +10,7 @@
 
 // class multiset
 
-// explicit multiset(const value_compare& comp);
-// value_compare and key_compare are the same type for set/multiset
-
-// key_compare    key_comp() const;
-// value_compare value_comp() const;
+// explicit multiset(const key_compare& comp);
 
 #include <set>
 #include <cassert>

diff  --git a/libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp b/libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp
new file mode 100644
index 0000000000000..ad2a304be703b
--- /dev/null
+++ b/libcxx/test/std/containers/associative/multiset/multiset.observers/comp.pass.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <set>
+
+// key_compare key_comp() const;
+// value_compare value_comp() const;
+
+#include <set>
+#include <cassert>
+
+int main(int, char**) {
+    typedef std::multiset<int> set_type;
+
+    set_type s;
+    set_type::iterator i1 = s.insert(1);
+    set_type::iterator i2 = s.insert(2);
+
+    const set_type& cs = s;
+
+    assert(cs.key_comp()(*i1, *i2));
+    assert(!cs.key_comp()(*i2, *i1));
+
+    assert(cs.value_comp()(*i1, *i2));
+    assert(!cs.value_comp()(*i2, *i1));
+
+    return 0;
+}

diff  --git a/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp b/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp
index 2db093a9b5c8e..4cd3f3067c841 100644
--- a/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp
+++ b/libcxx/test/std/containers/associative/set/set.cons/compare.pass.cpp
@@ -10,11 +10,7 @@
 
 // class set
 
-// explicit set(const value_compare& comp) const;
-// value_compare and key_compare are the same type for set/multiset
-
-// key_compare    key_comp() const;
-// value_compare value_comp() const;
+// explicit set(const key_compare& comp) const;
 
 #include <set>
 #include <cassert>

diff  --git a/libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp b/libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp
new file mode 100644
index 0000000000000..6f573a50df3d8
--- /dev/null
+++ b/libcxx/test/std/containers/associative/set/set.observers/comp.pass.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <set>
+
+// key_compare key_comp() const;
+// value_compare value_comp() const;
+
+#include <set>
+#include <cassert>
+
+int main(int, char**) {
+    typedef std::set<int> set_type;
+
+    set_type s;
+    std::pair<set_type::iterator, bool> p1 = s.insert(1);
+    std::pair<set_type::iterator, bool> p2 = s.insert(2);
+
+    const set_type& cs = s;
+
+    assert(cs.key_comp()(*p1.first, *p2.first));
+    assert(!cs.key_comp()(*p2.first, *p1.first));
+
+    assert(cs.value_comp()(*p1.first, *p2.first));
+    assert(!cs.value_comp()(*p2.first, *p1.first));
+
+    return 0;
+}


        


More information about the libcxx-commits mailing list