testsuite_container_traits.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. // -*- C++ -*-
  2. // Copyright (C) 2009-2022 Free Software Foundation, Inc.
  3. //
  4. // This file is part of the GNU ISO C++ Library. This library is free
  5. // software; you can redistribute it and/or modify it under the terms
  6. // of the GNU General Public License as published by the Free Software
  7. // Foundation; either version 3, or (at your option) any later
  8. // version.
  9. // This library is distributed in the hope that it will be useful, but
  10. // WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. // General Public License for more details.
  13. // You should have received a copy of the GNU General Public License along
  14. // with this library; see the file COPYING3. If not see
  15. // <http://www.gnu.org/licenses/>.
  16. #ifndef _GLIBCXX_TESTSUITE_CONTAINER_TRAITS_H
  17. #define _GLIBCXX_TESTSUITE_CONTAINER_TRAITS_H
  18. #include <bits/stdc++.h>
  19. #include <ext/vstring.h>
  20. #include <debug/string>
  21. namespace __gnu_test
  22. {
  23. // Container traits.
  24. // Base class with default false values for all traits.
  25. struct traits_base
  26. {
  27. // Type, nested type, and typedef related traits.
  28. typedef std::false_type is_container;
  29. typedef std::false_type is_adaptor;
  30. typedef std::false_type is_reversible;
  31. typedef std::false_type is_allocator_aware;
  32. typedef std::false_type is_associative;
  33. typedef std::false_type is_unordered;
  34. typedef std::false_type is_mapped;
  35. typedef std::false_type has_erase;
  36. typedef std::false_type has_erase_after;
  37. typedef std::false_type has_throwing_erase;
  38. typedef std::false_type has_insert;
  39. typedef std::false_type has_insert_after;
  40. typedef std::false_type has_emplace;
  41. typedef std::false_type has_push_pop;
  42. typedef std::false_type has_size_type_constructor;
  43. };
  44. // Primary template does nothing. Specialize on each type under
  45. // test, derive off of traits_base and just add the true traits.
  46. template<typename _Tp>
  47. struct traits;
  48. // Specialize for each container.
  49. template<typename _Tp, size_t _Np>
  50. struct traits<std::array<_Tp, _Np>> : public traits_base
  51. {
  52. typedef std::true_type is_container;
  53. typedef std::true_type is_reversible;
  54. };
  55. template<typename _Tp1, typename _Tp2>
  56. struct traits<std::deque<_Tp1, _Tp2>> : public traits_base
  57. {
  58. typedef std::true_type is_container;
  59. typedef std::true_type is_reversible;
  60. typedef std::true_type is_allocator_aware;
  61. typedef std::true_type has_erase;
  62. typedef std::true_type has_throwing_erase;
  63. typedef std::true_type has_insert;
  64. typedef std::true_type has_push_pop;
  65. typedef std::true_type has_size_type_constructor;
  66. typedef std::true_type has_emplace;
  67. };
  68. template<typename _Tp1, typename _Tp2>
  69. struct traits<std::forward_list<_Tp1, _Tp2>> : public traits_base
  70. {
  71. typedef std::true_type is_container;
  72. typedef std::true_type is_allocator_aware;
  73. typedef std::true_type has_erase_after;
  74. typedef std::true_type has_insert_after;
  75. typedef std::true_type has_push_pop;
  76. typedef std::true_type has_size_type_constructor;
  77. typedef std::true_type has_emplace;
  78. };
  79. template<typename _Tp1, typename _Tp2>
  80. struct traits<std::list<_Tp1, _Tp2>> : public traits_base
  81. {
  82. typedef std::true_type is_container;
  83. typedef std::true_type is_reversible;
  84. typedef std::true_type is_allocator_aware;
  85. typedef std::true_type has_erase;
  86. typedef std::true_type has_insert;
  87. typedef std::true_type has_push_pop;
  88. typedef std::true_type has_size_type_constructor;
  89. typedef std::true_type has_emplace;
  90. };
  91. template<typename _Tp1, typename _Tp2>
  92. struct traits<std::vector<_Tp1, _Tp2>> : public traits_base
  93. {
  94. typedef std::true_type is_container;
  95. typedef std::true_type is_reversible;
  96. typedef std::true_type is_allocator_aware;
  97. typedef std::true_type has_erase;
  98. typedef std::true_type has_throwing_erase;
  99. typedef std::true_type has_insert;
  100. typedef std::true_type has_size_type_constructor;
  101. typedef std::true_type has_emplace;
  102. };
  103. template<typename _Tp1, typename _Tp2, typename _Tp3>
  104. struct traits<std::basic_string<_Tp1, _Tp2, _Tp3>> : public traits_base
  105. {
  106. typedef std::true_type is_container;
  107. typedef std::true_type is_reversible;
  108. typedef std::true_type is_allocator_aware;
  109. typedef std::true_type has_erase;
  110. typedef std::true_type has_insert;
  111. };
  112. template<typename _Tp1, typename _Tp2, typename _Tp3>
  113. struct traits<__gnu_debug::basic_string<_Tp1, _Tp2, _Tp3>> : public traits_base
  114. {
  115. typedef std::true_type is_container;
  116. typedef std::true_type is_reversible;
  117. typedef std::true_type is_allocator_aware;
  118. typedef std::true_type has_erase;
  119. typedef std::true_type has_insert;
  120. };
  121. template<typename _Tp1, typename _Tp2, typename _Tp3,
  122. template <typename, typename, typename> class _Tp4>
  123. struct traits<__gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>>
  124. : public traits_base
  125. {
  126. typedef std::true_type is_container;
  127. typedef std::true_type is_reversible;
  128. typedef std::true_type is_allocator_aware;
  129. typedef std::true_type has_erase;
  130. typedef std::true_type has_insert;
  131. };
  132. template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
  133. struct traits<std::map<_Tp1, _Tp2, _Tp3, _Tp4>> : public traits_base
  134. {
  135. typedef std::true_type is_container;
  136. typedef std::true_type is_reversible;
  137. typedef std::true_type is_allocator_aware;
  138. typedef std::true_type is_associative;
  139. typedef std::true_type is_mapped;
  140. typedef std::true_type has_erase;
  141. typedef std::true_type has_insert;
  142. typedef std::true_type has_emplace;
  143. };
  144. template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
  145. struct traits<std::multimap<_Tp1, _Tp2, _Tp3, _Tp4>> : public traits_base
  146. {
  147. typedef std::true_type is_container;
  148. typedef std::true_type is_reversible;
  149. typedef std::true_type is_allocator_aware;
  150. typedef std::true_type is_associative;
  151. typedef std::true_type is_mapped;
  152. typedef std::true_type has_erase;
  153. typedef std::true_type has_insert;
  154. typedef std::true_type has_emplace;
  155. };
  156. template<typename _Tp1, typename _Tp2, typename _Tp3>
  157. struct traits<std::set<_Tp1, _Tp2, _Tp3>> : public traits_base
  158. {
  159. typedef std::true_type is_container;
  160. typedef std::true_type is_reversible;
  161. typedef std::true_type is_allocator_aware;
  162. typedef std::true_type is_associative;
  163. typedef std::true_type has_erase;
  164. typedef std::true_type has_insert;
  165. typedef std::true_type has_emplace;
  166. };
  167. template<typename _Tp1, typename _Tp2, typename _Tp3>
  168. struct traits<std::multiset<_Tp1, _Tp2, _Tp3>> : public traits_base
  169. {
  170. typedef std::true_type is_container;
  171. typedef std::true_type is_reversible;
  172. typedef std::true_type is_allocator_aware;
  173. typedef std::true_type is_associative;
  174. typedef std::true_type has_erase;
  175. typedef std::true_type has_insert;
  176. typedef std::true_type has_emplace;
  177. };
  178. template<typename _Tp1, typename _Tp2>
  179. struct traits<std::priority_queue<_Tp1, _Tp2>> : public traits_base
  180. {
  181. typedef std::true_type is_adaptor;
  182. };
  183. template<typename _Tp1, typename _Tp2>
  184. struct traits<std::queue<_Tp1, _Tp2>> : public traits_base
  185. {
  186. typedef std::true_type is_adaptor;
  187. };
  188. template<typename _Tp1, typename _Tp2>
  189. struct traits<std::stack<_Tp1, _Tp2> > : public traits_base
  190. {
  191. typedef std::true_type is_adaptor;
  192. };
  193. template<typename _Tp1, typename _Tp2, typename _Tp3,
  194. typename _Tp4, typename _Tp5>
  195. struct traits<std::unordered_map<_Tp1, _Tp2, _Tp3, _Tp4, _Tp5>>
  196. : public traits_base
  197. {
  198. typedef std::true_type is_container;
  199. typedef std::true_type is_allocator_aware;
  200. typedef std::true_type is_unordered;
  201. typedef std::true_type is_mapped;
  202. typedef std::true_type has_erase;
  203. typedef std::true_type has_insert;
  204. typedef std::true_type has_emplace;
  205. };
  206. template<typename _Tp1, typename _Tp2, typename _Tp3,
  207. typename _Tp4, typename _Tp5>
  208. struct traits<std::unordered_multimap<_Tp1, _Tp2, _Tp3, _Tp4, _Tp5>>
  209. : public traits_base
  210. {
  211. typedef std::true_type is_container;
  212. typedef std::true_type is_allocator_aware;
  213. typedef std::true_type is_unordered;
  214. typedef std::true_type is_mapped;
  215. typedef std::true_type has_erase;
  216. typedef std::true_type has_insert;
  217. typedef std::true_type has_emplace;
  218. };
  219. template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
  220. struct traits<std::unordered_multiset<_Tp1, _Tp2, _Tp3, _Tp4>>
  221. : public traits_base
  222. {
  223. typedef std::true_type is_container;
  224. typedef std::true_type is_allocator_aware;
  225. typedef std::true_type is_unordered;
  226. typedef std::true_type has_erase;
  227. typedef std::true_type has_insert;
  228. typedef std::true_type has_emplace;
  229. };
  230. template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
  231. struct traits<std::unordered_set<_Tp1, _Tp2, _Tp3, _Tp4>>
  232. : public traits_base
  233. {
  234. typedef std::true_type is_container;
  235. typedef std::true_type is_allocator_aware;
  236. typedef std::true_type is_unordered;
  237. typedef std::true_type has_erase;
  238. typedef std::true_type has_insert;
  239. typedef std::true_type has_emplace;
  240. };
  241. } // namespace __gnu_test
  242. #endif