GCC Code Coverage Report


Directory: ./
File: TestPointerMap.cpp
Date: 2026-03-21 20:51:59
Exec Total Coverage
Lines: 60 60 100.0%
Functions: 16 16 100.0%
Branches: 90 220 40.9%

Line Branch Exec Source
1 #include "PointerMap.hpp"
2 #include "Verbose.hpp"
3 #include "compat/gsl14.hpp"
4 #include <gmock/gmock.h>
5
6 using namespace testing;
7 using namespace testing::internal;
8
9 // Anonymous namespace for definitions that are local to this file.
10 namespace {
11 // Print the elements of a PointerMap.
12 5 void print([[maybe_unused]] const RawPointerMap<std::string, Verbose<>>& container) {
13
6/10
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 9 taken 14 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 14 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 19 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 14 times.
✓ Branch 18 taken 5 times.
33 for (const auto& elem : container) {
14 14 std::cout << gsl::czstring{__func__} << ": key=" << elem.first
15
6/12
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 14 times.
✗ Branch 18 not taken.
✓ Branch 23 taken 14 times.
✗ Branch 24 not taken.
14 << " value=" << elem.second << std::endl;
16 14 const auto& name = elem.second.name();
17
5/16
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 14 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 14 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
14 EXPECT_THAT(name, Not(HasSubstr("copy")));
18
5/16
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 14 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 14 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
14 EXPECT_THAT(name, Not(HasSubstr("move")));
19 5 }
20 5 }
21
22 #if __cplusplus >= 202002L // since C++20
23
24 using std::erase_if;
25
26 #else // until C++20
27
28 template <typename M, typename Predicate>
29 typename M::size_type erase_if(M& m, Predicate p) {
30 auto size = m.size();
31 for (auto i = m.begin(); i != m.end();) {
32 if (p(*i)) { i = m.erase(i); }
33 else { ++i; }
34 }
35 return size - m.size();
36 }
37
38 #endif // C++20
39
40 } // anonymous namespace
41
42 8 TEST(SharedPointerMap, emplace) {
43 // Place elements into container as pointers.
44 2 auto container = SharedPointerMap<std::string, Verbose<>>{};
45 2 auto& base = container.base;
46
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("one", std::make_shared<Verbose<>>("one"));
47
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("two", std::make_shared<Verbose<>>("two"));
48
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("three", std::make_shared<Verbose<>>("three"));
49
50
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 print(reference(container));
51 4 }
52
53 8 TEST(SharedPointerMap, insert) {
54 // Place elements into container as pointers.
55 2 auto container = SharedPointerMap<std::string, Verbose<>>{};
56 2 auto& base = container.base;
57
3/6
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
2 base.insert({"one", std::make_shared<Verbose<>>("one")});
58
3/6
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
2 base.insert({"two", std::make_shared<Verbose<>>("two")});
59
3/6
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
2 base.insert({"three", std::make_shared<Verbose<>>("three")});
60
61
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 print(reference(container));
62 4 }
63
64 8 TEST(SharedPointerMap, shallow_copy) {
65 // Place elements into container as pointers.
66 2 auto container = SharedPointerMap<std::string, Verbose<>>{};
67 2 auto& base = container.base;
68
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("one", std::make_shared<Verbose<>>("one"));
69
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("two", std::make_shared<Verbose<>>("two"));
70
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("three", std::make_shared<Verbose<>>("three"));
71
72 // Copying a container of pointers does not copy the referenced objects.
73
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 auto container_copy = container;
74
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 print(reference(container_copy));
75
76
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
6 container_copy["one"].name() = "alfa";
77
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
6 container_copy["two"].name() = "bravo";
78
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
6 container_copy["three"].name() = "charlie";
79
80
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 print(reference(container));
81
82
2/10
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
2 EXPECT_EQ(container, container_copy); // shallow copy
83
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
6 EXPECT_NE("one", container["one"].name());
84
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
6 EXPECT_NE("two", container["two"].name());
85 4 }
86
87 8 TEST(SharedPointerMap, erase_if) {
88 2 auto container = SharedPointerMap<std::string, Verbose<>>{};
89 2 auto& base = container.base;
90
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("one", std::make_shared<Verbose<>>("one"));
91
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("two", std::make_shared<Verbose<>>("two"));
92
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("three", std::make_shared<Verbose<>>("three"));
93
94 // In order to avoid copying/moving values,
95 // use the base vector of pointers for erase-remove.
96 5 auto predicate = [](const auto& elem) {
97 3 return elem.second->name() == "two";
98 };
99
3/12
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
2 EXPECT_EQ(1, erase_if(base, predicate));
100
2/10
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
2 EXPECT_EQ(2, container.size());
101
102
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 print(reference(container));
103 4 }
104
105 8 TEST(UniquePointerMap, uncopyable) {
106 2 auto container = UniquePointerMap<std::string, Verbose<>>{};
107 2 auto& base = container.base;
108
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("one", std::make_unique<Verbose<>>("one"));
109
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("two", std::make_unique<Verbose<>>("two"));
110
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 base.emplace("three", std::make_unique<Verbose<>>("three"));
111
112 // auto container_copy = container; // compile time error
113 4 }
114