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