DryChem 1.0.0
A generic, compile-time C++ toolbox with no dependencies for the modern computational chemistry project.
Loading...
Searching...
No Matches
testContainerTraits.hpp
Go to the documentation of this file.
1// Copyright (c) 2020-2025 Cody R. Drisko. All rights reserved.
2// Licensed under the MIT License. See the LICENSE file in the project root for more information.
3//
4// Name: testContainerTraits.hpp
5// Author: crdrisko
6// Date: 09/22/2020-13:02:50
7// Description: Provides ~100% unit test coverage over all type traits relating to the classification of containers
8
9#ifndef DRYCHEM_COMMON_UTILITIES_LIBS_UTILITIES_TESTS_TESTTRAITS_TESTCONTAINERTRAITS_HPP
10#define DRYCHEM_COMMON_UTILITIES_LIBS_UTILITIES_TESTS_TESTTRAITS_TESTCONTAINERTRAITS_HPP
11
12#include <array>
13#include <deque>
14#include <forward_list>
15#include <list>
16#include <map>
17#include <queue>
18#include <set>
19#include <stack>
20#include <string>
21#include <unordered_map>
22#include <unordered_set>
23#include <vector>
24
25#include <common-utils/meta.hpp>
26#include <gtest/gtest.h>
27
28GTEST_TEST(testContainerTraits, allContainersButStdArrayAreAllocatorAwareContainers)
29{
30 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::deque<int>>::value));
31 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::forward_list<int>>::value));
32 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::list<int>>::value));
33 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::map<int, int>>::value));
34 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::multimap<int, int>>::value));
35 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::multiset<int>>::value));
36 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::set<int>>::value));
37 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::string>::value));
38 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::unordered_map<int, int>>::value));
39 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::unordered_multimap<int, int>>::value));
40 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::unordered_multiset<int>>::value));
41 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::unordered_set<int>>::value));
42 ASSERT_TRUE((DryChem::is_allocator_aware_container<std::vector<int>>::value));
43
44 ASSERT_FALSE((DryChem::is_allocator_aware_container<std::array<int, 3>>::value));
45 ASSERT_FALSE((DryChem::is_allocator_aware_container<std::priority_queue<int>>::value));
46 ASSERT_FALSE((DryChem::is_allocator_aware_container<std::queue<int>>::value));
47 ASSERT_FALSE((DryChem::is_allocator_aware_container<std::stack<int>>::value));
48}
49
50GTEST_TEST(testContainerTraits, onlyOrderedMapsAndSetsAreAssociativeContainers)
51{
52 ASSERT_TRUE((DryChem::is_associative_container<std::map<int, int>>::value));
53 ASSERT_TRUE((DryChem::is_associative_container<std::multimap<int, int>>::value));
54 ASSERT_TRUE((DryChem::is_associative_container<std::multiset<int>>::value));
55 ASSERT_TRUE((DryChem::is_associative_container<std::set<int>>::value));
56
57 ASSERT_FALSE((DryChem::is_associative_container<std::array<int, 3>>::value));
58 ASSERT_FALSE((DryChem::is_associative_container<std::deque<int>>::value));
59 ASSERT_FALSE((DryChem::is_associative_container<std::forward_list<int>>::value));
60 ASSERT_FALSE((DryChem::is_associative_container<std::list<int>>::value));
61 ASSERT_FALSE((DryChem::is_associative_container<std::priority_queue<int>>::value));
62 ASSERT_FALSE((DryChem::is_associative_container<std::queue<int>>::value));
63 ASSERT_FALSE((DryChem::is_associative_container<std::stack<int>>::value));
64 ASSERT_FALSE((DryChem::is_associative_container<std::string>::value));
65 ASSERT_FALSE((DryChem::is_associative_container<std::unordered_map<int, int>>::value));
66 ASSERT_FALSE((DryChem::is_associative_container<std::unordered_multimap<int, int>>::value));
67 ASSERT_FALSE((DryChem::is_associative_container<std::unordered_multiset<int>>::value));
68 ASSERT_FALSE((DryChem::is_associative_container<std::unordered_set<int>>::value));
69 ASSERT_FALSE((DryChem::is_associative_container<std::vector<int>>::value));
70}
71
72GTEST_TEST(testContainerTraits, allStdContainersAreContainers)
73{
74 ASSERT_TRUE((DryChem::is_container<std::array<int, 3>>::value));
75 ASSERT_TRUE((DryChem::is_container<std::deque<int>>::value));
76 ASSERT_TRUE((DryChem::is_container<std::forward_list<int>>::value));
77 ASSERT_TRUE((DryChem::is_container<std::list<int>>::value));
78 ASSERT_TRUE((DryChem::is_container<std::map<int, int>>::value));
79 ASSERT_TRUE((DryChem::is_container<std::multimap<int, int>>::value));
80 ASSERT_TRUE((DryChem::is_container<std::multiset<int>>::value));
81 ASSERT_TRUE((DryChem::is_container<std::set<int>>::value));
82 ASSERT_TRUE((DryChem::is_container<std::string>::value));
83 ASSERT_TRUE((DryChem::is_container<std::unordered_map<int, int>>::value));
84 ASSERT_TRUE((DryChem::is_container<std::unordered_multimap<int, int>>::value));
85 ASSERT_TRUE((DryChem::is_container<std::unordered_multiset<int>>::value));
86 ASSERT_TRUE((DryChem::is_container<std::unordered_set<int>>::value));
87 ASSERT_TRUE((DryChem::is_container<std::vector<int>>::value));
88
89 ASSERT_FALSE((DryChem::is_container<std::priority_queue<int>>::value));
90 ASSERT_FALSE((DryChem::is_container<std::queue<int>>::value));
91 ASSERT_FALSE((DryChem::is_container<std::stack<int>>::value));
92}
93
94GTEST_TEST(testContainerTraits, containerAdaptersRequireAWrappedContainerType)
95{
96 ASSERT_TRUE((DryChem::is_container_adapter<std::priority_queue<int>>::value));
97 ASSERT_TRUE((DryChem::is_container_adapter<std::queue<int>>::value));
98 ASSERT_TRUE((DryChem::is_container_adapter<std::stack<int>>::value));
99
100 ASSERT_FALSE((DryChem::is_container_adapter<std::array<int, 3>>::value));
101 ASSERT_FALSE((DryChem::is_container_adapter<std::deque<int>>::value));
102 ASSERT_FALSE((DryChem::is_container_adapter<std::forward_list<int>>::value));
103 ASSERT_FALSE((DryChem::is_container_adapter<std::list<int>>::value));
104 ASSERT_FALSE((DryChem::is_container_adapter<std::map<int, int>>::value));
105 ASSERT_FALSE((DryChem::is_container_adapter<std::multimap<int, int>>::value));
106 ASSERT_FALSE((DryChem::is_container_adapter<std::multiset<int>>::value));
107 ASSERT_FALSE((DryChem::is_container_adapter<std::set<int>>::value));
108 ASSERT_FALSE((DryChem::is_container_adapter<std::string>::value));
109 ASSERT_FALSE((DryChem::is_container_adapter<std::unordered_map<int, int>>::value));
110 ASSERT_FALSE((DryChem::is_container_adapter<std::unordered_multimap<int, int>>::value));
111 ASSERT_FALSE((DryChem::is_container_adapter<std::unordered_multiset<int>>::value));
112 ASSERT_FALSE((DryChem::is_container_adapter<std::unordered_set<int>>::value));
113 ASSERT_FALSE((DryChem::is_container_adapter<std::vector<int>>::value));
114}
115
116GTEST_TEST(testContainerTraits, almostAllStandardContainersAreReversible)
117{
118 ASSERT_TRUE((DryChem::is_reversible_container<std::array<int, 3>>::value));
119 ASSERT_TRUE((DryChem::is_reversible_container<std::deque<int>>::value));
120 ASSERT_TRUE((DryChem::is_reversible_container<std::list<int>>::value));
121 ASSERT_TRUE((DryChem::is_reversible_container<std::map<int, int>>::value));
122 ASSERT_TRUE((DryChem::is_reversible_container<std::multimap<int, int>>::value));
123 ASSERT_TRUE((DryChem::is_reversible_container<std::multiset<int>>::value));
124 ASSERT_TRUE((DryChem::is_reversible_container<std::set<int>>::value));
125 ASSERT_TRUE((DryChem::is_reversible_container<std::string>::value));
126 ASSERT_TRUE((DryChem::is_reversible_container<std::vector<int>>::value));
127
128 ASSERT_FALSE((DryChem::is_reversible_container<std::forward_list<int>>::value));
129 ASSERT_FALSE((DryChem::is_reversible_container<std::priority_queue<int>>::value));
130 ASSERT_FALSE((DryChem::is_reversible_container<std::queue<int>>::value));
131 ASSERT_FALSE((DryChem::is_reversible_container<std::stack<int>>::value));
132 ASSERT_FALSE((DryChem::is_reversible_container<std::unordered_map<int, int>>::value));
133 ASSERT_FALSE((DryChem::is_reversible_container<std::unordered_multimap<int, int>>::value));
134 ASSERT_FALSE((DryChem::is_reversible_container<std::unordered_multiset<int>>::value));
135 ASSERT_FALSE((DryChem::is_reversible_container<std::unordered_set<int>>::value));
136}
137
138GTEST_TEST(testContainerTraits, ifContainerIsNotAssociativeOrUnorderedItsASequenceContainer)
139{
140 ASSERT_TRUE((DryChem::is_sequence_container<std::array<int, 3>>::value));
141 ASSERT_TRUE((DryChem::is_sequence_container<std::deque<int>>::value));
142 ASSERT_TRUE((DryChem::is_sequence_container<std::forward_list<int>>::value));
143 ASSERT_TRUE((DryChem::is_sequence_container<std::list<int>>::value));
144 ASSERT_TRUE((DryChem::is_sequence_container<std::string>::value));
145 ASSERT_TRUE((DryChem::is_sequence_container<std::vector<int>>::value));
146
147 ASSERT_FALSE((DryChem::is_sequence_container<std::map<int, int>>::value));
148 ASSERT_FALSE((DryChem::is_sequence_container<std::multimap<int, int>>::value));
149 ASSERT_FALSE((DryChem::is_sequence_container<std::multiset<int>>::value));
150 ASSERT_FALSE((DryChem::is_sequence_container<std::priority_queue<int>>::value));
151 ASSERT_FALSE((DryChem::is_sequence_container<std::queue<int>>::value));
152 ASSERT_FALSE((DryChem::is_sequence_container<std::set<int>>::value));
153 ASSERT_FALSE((DryChem::is_sequence_container<std::stack<int>>::value));
154 ASSERT_FALSE((DryChem::is_sequence_container<std::unordered_map<int, int>>::value));
155 ASSERT_FALSE((DryChem::is_sequence_container<std::unordered_multimap<int, int>>::value));
156 ASSERT_FALSE((DryChem::is_sequence_container<std::unordered_multiset<int>>::value));
157 ASSERT_FALSE((DryChem::is_sequence_container<std::unordered_set<int>>::value));
158}
159
160GTEST_TEST(testContainerTraits, unorderedMapsAndSetsAreTheOnlyUnorderedAssociativeContainers)
161{
162 ASSERT_TRUE((DryChem::is_unordered_associative_container<std::unordered_map<int, int>>::value));
163 ASSERT_TRUE((DryChem::is_unordered_associative_container<std::unordered_multimap<int, int>>::value));
164 ASSERT_TRUE((DryChem::is_unordered_associative_container<std::unordered_multiset<int>>::value));
165 ASSERT_TRUE((DryChem::is_unordered_associative_container<std::unordered_set<int>>::value));
166
167 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::array<int, 3>>::value));
168 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::deque<int>>::value));
169 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::forward_list<int>>::value));
170 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::list<int>>::value));
171 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::map<int, int>>::value));
172 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::multimap<int, int>>::value));
173 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::multiset<int>>::value));
174 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::priority_queue<int>>::value));
175 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::queue<int>>::value));
176 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::set<int>>::value));
177 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::stack<int>>::value));
178 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::string>::value));
179 ASSERT_FALSE((DryChem::is_unordered_associative_container<std::vector<int>>::value));
180}
181
182GTEST_TEST(testContainerTraits, convenienceVariableTemplatesAreInFactConvenient)
183{
184 ASSERT_FALSE((DryChem::is_allocator_aware_container_v<std::array<int, 3>>));
185 ASSERT_FALSE((DryChem::is_associative_container_v<std::array<int, 3>>));
186 ASSERT_TRUE((DryChem::is_container_v<std::array<int, 3>>));
187 ASSERT_FALSE((DryChem::is_container_adapter_v<std::array<int, 3>>));
188 ASSERT_TRUE((DryChem::is_reversible_container_v<std::array<int, 3>>));
189 ASSERT_TRUE((DryChem::is_sequence_container_v<std::array<int, 3>>));
190 ASSERT_FALSE((DryChem::is_unordered_associative_container_v<std::array<int, 3>>));
191}
192
193#endif
GTEST_TEST(testContainerTraits, allContainersButStdArrayAreAllocatorAwareContainers)
Definition testContainerTraits.hpp:28