]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/util/regression/trait/assoc/trait.hpp
trait.hpp: Format.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / util / regression / trait / assoc / trait.hpp
CommitLineData
4569a895
AT
1// -*- C++ -*-
2
3// Copyright (C) 2005, 2006 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 2, 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
17// along with this library; see the file COPYING. If not, write to
18// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19// MA 02111-1307, USA.
20
21// As a special exception, you may use this file as part of a free
22// software library without restriction. Specifically, if other files
23// instantiate templates or use macros or inline functions from this
24// file, or you compile this file and link it with other files to
25// produce an executable, this file does not by itself cause the
26// resulting executable to be covered by the GNU General Public
27// License. This exception does not however invalidate any other
28// reasons why the executable file might be covered by the GNU General
29// Public License.
30
31// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32
33// Permission to use, copy, modify, sell, and distribute this software
34// is hereby granted without fee, provided that the above copyright
35// notice appears in all copies, and that both that copyright notice
36// and this permission notice appear in supporting documentation. None
37// of the above authors, nor IBM Haifa Research Laboratories, make any
38// representation about the suitability of this software for any
39// purpose. It is provided "as is" without express or implied
40// warranty.
41
42/**
43 * @file trait.hpp
44 * Containsert traits for a random regression test
45 * for a specific container type.
46 */
47
48#ifndef PB_DS_REGRESSION_TEST_TRAIT_HPP
49#define PB_DS_REGRESSION_TEST_TRAIT_HPP
50
51#include <regression/trait/assoc/to_string.hpp>
52#include <regression/trait/assoc/type_trait.hpp>
53#include <regression/trait/assoc/native_type_trait.hpp>
54#include <regression/trait/assoc/resize_trait.hpp>
55#include <regression/trait/assoc/get_set_loads_trait.hpp>
56#include <regression/trait/assoc/get_set_load_trait.hpp>
57#include <regression/trait/assoc/node_update_trait.hpp>
58#include <regression/trait/erase_if_fn.hpp>
59
60namespace pb_ds
61{
55a4c999
BK
62namespace test
63{
64namespace detail
65{
4569a895 66
55a4c999
BK
67#define PB_DS_CLASS_T_DEC \
68 template<typename Cntnr>
4569a895 69
55a4c999
BK
70#define PB_DS_CLASS_C_DEC \
71 regression_test_traits<Cntnr>
4569a895 72
55a4c999
BK
73#define PB_DS_TYPE_TRAITS_C_DEC \
74 regression_test_type_traits<Cntnr>
4569a895 75
55a4c999
BK
76#define PB_DS_NATIVE_TYPE_TRAITS_C_DEC \
77 native_type_traits<typename PB_DS_TYPE_TRAITS_C_DEC::key_type, \
78 typename PB_DS_TYPE_TRAITS_C_DEC::mapped_type, \
79 typename Cntnr::allocator>
4569a895 80
55a4c999
BK
81#define PB_DS_RESIZE_TRAITS_C_DEC \
82 regression_test_resize_traits<Cntnr, typename Cntnr::container_category>
4569a895 83
55a4c999
BK
84#define PB_DS_SET_LOADS_TRAITS_C_DEC \
85 regression_test_get_set_loacontainer_traits<Cntnr, \
86 typename Cntnr::container_category>
4569a895 87
55a4c999
BK
88#define PB_DS_SET_LOAD_TRAITS_C_DEC \
89 regression_test_get_set_load_traits<Cntnr,typename Cntnr::container_category>
4569a895 90
55a4c999
BK
91#define PB_DS_NODE_UPDATOR_TRAITS_C_DEC \
92 regression_test_node_update_traits<Cntnr, typename Cntnr::container_category>
4569a895 93
55a4c999
BK
94 template<typename Cntnr>
95 struct regression_test_traits : private PB_DS_TYPE_TRAITS_C_DEC,
96 private PB_DS_NATIVE_TYPE_TRAITS_C_DEC,
97 private PB_DS_RESIZE_TRAITS_C_DEC,
98 private PB_DS_NODE_UPDATOR_TRAITS_C_DEC,
99 private PB_DS_SET_LOADS_TRAITS_C_DEC,
100 private PB_DS_SET_LOAD_TRAITS_C_DEC
101 {
102 private:
103 typedef PB_DS_NATIVE_TYPE_TRAITS_C_DEC native_type_traits_base;
4569a895 104
55a4c999 105 typedef PB_DS_TYPE_TRAITS_C_DEC type_traits_base;
4569a895 106
55a4c999
BK
107 public:
108 typedef typename Cntnr::key_type key_type;
4569a895 109
55a4c999 110 typedef typename Cntnr::const_key_reference const_key_reference;
4569a895 111
55a4c999 112 typedef typename Cntnr::value_type value_type;
4569a895 113
55a4c999 114 typedef typename Cntnr::const_reference const_reference;
4569a895 115
55a4c999
BK
116 typedef typename PB_DS_NATIVE_TYPE_TRAITS_C_DEC::type native_type;
117
118 typedef typename native_type::key_type native_key_type;
119
120 typedef typename native_type::value_type native_value_type;
121
122 enum
123 {
124 resize = PB_DS_RESIZE_TRAITS_C_DEC::value,
125 get_set_loads = PB_DS_SET_LOADS_TRAITS_C_DEC::value,
126 get_set_load = PB_DS_SET_LOAD_TRAITS_C_DEC::value,
127 order_statistics = PB_DS_NODE_UPDATOR_TRAITS_C_DEC::order_statistics,
128 prefix_search = PB_DS_NODE_UPDATOR_TRAITS_C_DEC::prefix_search
4569a895
AT
129 };
130
55a4c999
BK
131 template<typename T>
132 struct erase_if_fn : public regression_test_erase_if_fn<T>
133 { };
4569a895 134
55a4c999
BK
135 static size_t
136 erase_if(native_type& r_native_c)
137 {
138 typedef regression_test_erase_if_fn<typename native_type::value_type> erase_if_fn;
4569a895 139
55a4c999
BK
140 typename native_type::iterator it = r_native_c.begin();
141 size_t num_ersd = 0;
142 while (it != r_native_c.end())
143 if (erase_if_fn()(*it))
144 {
145 ++num_ersd;
146 r_native_c.erase(it);
147 it = r_native_c.begin();
148 }
149 else
150 ++it;
151 return num_ersd;
152 }
153
154 static void
155 print_container(const Cntnr& r_c, std::ostream& r_os)
156 {
157 PB_DS_TYPE_TRAITS_C_DEC::print_container(r_c, r_os);
158 }
4569a895 159
55a4c999 160 public:
4569a895 161
55a4c999
BK
162 template<typename Gen>
163 static key_type
164 generate_key(Gen& r_gen, size_t max)
165 {
166 return PB_DS_TYPE_TRAITS_C_DEC::generate_key(r_gen, max);
167 }
4569a895 168
55a4c999
BK
169 template<typename Gen>
170 static value_type
171 generate_value(Gen& r_gen, size_t max)
172 {
173 return PB_DS_TYPE_TRAITS_C_DEC::generate_value(r_gen, max);
174 }
4569a895 175
55a4c999
BK
176 static const_key_reference
177 extract_key(const_reference r_val)
178 {
179 return type_traits_base::extract_key(r_val);
180 }
4569a895 181
55a4c999
BK
182 static native_key_type
183 native_key(const_key_reference r_key)
184 {
185 return native_type_traits_base::native_key(r_key);
186 }
187
188 static native_value_type
189 native_value(const_reference r_val)
190 {
191 return native_type_traits_base::native_value(r_val);
192 }
4569a895 193
55a4c999
BK
194 static const native_key_type&
195 extract_native_key(const native_value_type& r_val)
196 {
197 return native_type_traits_base::extract_key(r_val);
198 }
4569a895 199
55a4c999
BK
200 static bool
201 cmp(const_reference r_val, const native_value_type& r_native_val)
202 {
203 return val_to_string(r_val) == native_val_to_string(r_native_val);
204 }
205
206 static std::string
207 val_to_string(const_reference r_val)
208 {
209 return to_string(r_val);
210 }
211
212 static std::string
213 key_to_string(const_key_reference r_key)
214 {
215 return to_string(r_key);
216 }
217
218 static std::string
219 native_val_to_string(const native_value_type& r_native_val)
220 {
221 return to_string(r_native_val);
222 }
223
224 static bool
225 prefix_match(const_key_reference r_key, const std::string& r_native_key)
226 {
227 const size_t native_substr_len = std::min(r_key.length(),
228 r_native_key.length());
229
230 const std::string native_substr = r_native_key.substr(0,
231 native_substr_len);
232
233 return native_substr == (const std::string&) r_key;
234 }
235
236 };
237
238#undef PB_DS_TYPE_TRAITS_C_DEC
239#undef PB_DS_NATIVE_TYPE_TRAITS_C_DEC
240#undef PB_DS_RESIZE_TRAITS_C_DEC
241#undef PB_DS_SET_LOADS_TRAITS_C_DEC
242#undef PB_DS_SET_LOAD_TRAITS_C_DEC
243#undef PB_DS_NODE_UPDATOR_TRAITS_C_DEC
244#undef PB_DS_CLASS_T_DEC
245#undef PB_DS_CLASS_C_DEC
4569a895 246
55a4c999
BK
247} // namespace detail
248} // namespace test
4569a895
AT
249} // namespace pb_ds
250
55a4c999 251#endif