Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/detail/dynamic_bitset.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
comparison
equal
deleted
inserted
replaced
15:663ca0da4350 | 16:2665513ce2d3 |
---|---|
1 // ----------------------------------------------------------- | |
2 // | |
3 // Copyright (c) 2001-2002 Chuck Allison and Jeremy Siek | |
4 // Copyright (c) 2003-2006, 2008 Gennaro Prota | |
5 // | |
6 // Distributed under the Boost Software License, Version 1.0. | |
7 // (See accompanying file LICENSE_1_0.txt or copy at | |
8 // http://www.boost.org/LICENSE_1_0.txt) | |
9 // | |
10 // ----------------------------------------------------------- | |
11 | |
12 #ifndef BOOST_DETAIL_DYNAMIC_BITSET_HPP | |
13 #define BOOST_DETAIL_DYNAMIC_BITSET_HPP | |
14 | |
15 #include <cstddef> | |
16 #include "boost/config.hpp" | |
17 #include "boost/detail/workaround.hpp" | |
18 | |
19 | |
20 namespace boost { | |
21 | |
22 namespace detail { | |
23 namespace dynamic_bitset_impl { | |
24 | |
25 // Gives (read-)access to the object representation | |
26 // of an object of type T (3.9p4). CANNOT be used | |
27 // on a base sub-object | |
28 // | |
29 template <typename T> | |
30 inline const unsigned char * object_representation (T* p) | |
31 { | |
32 return static_cast<const unsigned char *>(static_cast<const void *>(p)); | |
33 } | |
34 | |
35 template<typename T, int amount, int width /* = default */> | |
36 struct shifter | |
37 { | |
38 static void left_shift(T & v) { | |
39 amount >= width ? (v = 0) | |
40 : (v >>= BOOST_DYNAMIC_BITSET_WRAP_CONSTANT(amount)); | |
41 } | |
42 }; | |
43 | |
44 // ------- count function implementation -------------- | |
45 | |
46 typedef unsigned char byte_type; | |
47 | |
48 // These two entities | |
49 // | |
50 // enum mode { access_by_bytes, access_by_blocks }; | |
51 // template <mode> struct mode_to_type {}; | |
52 // | |
53 // were removed, since the regression logs (as of 24 Aug 2008) | |
54 // showed that several compilers had troubles with recognizing | |
55 // | |
56 // const mode m = access_by_bytes | |
57 // | |
58 // as a constant expression | |
59 // | |
60 // * So, we'll use bool, instead of enum *. | |
61 // | |
62 template <bool value> | |
63 struct value_to_type | |
64 { | |
65 value_to_type() {} | |
66 }; | |
67 const bool access_by_bytes = true; | |
68 const bool access_by_blocks = false; | |
69 | |
70 | |
71 // the table: wrapped in a class template, so | |
72 // that it is only instantiated if/when needed | |
73 // | |
74 template <bool dummy_name = true> | |
75 struct count_table { static const byte_type table[]; }; | |
76 | |
77 template <> | |
78 struct count_table<false> { /* no table */ }; | |
79 | |
80 | |
81 const unsigned int table_width = 8; | |
82 template <bool b> | |
83 const byte_type count_table<b>::table[] = | |
84 { | |
85 // Automatically generated by GPTableGen.exe v.1.0 | |
86 // | |
87 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, | |
88 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, | |
89 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, | |
90 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, | |
91 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, | |
92 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, | |
93 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, | |
94 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 | |
95 }; | |
96 | |
97 | |
98 // overload for access by bytes | |
99 // | |
100 | |
101 template <typename Iterator> | |
102 inline std::size_t do_count(Iterator first, std::size_t length, | |
103 int /*dummy param*/, | |
104 value_to_type<access_by_bytes>* ) | |
105 { | |
106 std::size_t num = 0; | |
107 if (length) | |
108 { | |
109 const byte_type * p = object_representation(&*first); | |
110 length *= sizeof(*first); | |
111 | |
112 do { | |
113 num += count_table<>::table[*p]; | |
114 ++p; | |
115 --length; | |
116 | |
117 } while (length); | |
118 } | |
119 | |
120 return num; | |
121 } | |
122 | |
123 | |
124 // overload for access by blocks | |
125 // | |
126 template <typename Iterator, typename ValueType> | |
127 inline std::size_t do_count(Iterator first, std::size_t length, ValueType, | |
128 value_to_type<access_by_blocks>*) | |
129 { | |
130 std::size_t num = 0; | |
131 while (length){ | |
132 | |
133 ValueType value = *first; | |
134 while (value) { | |
135 num += count_table<>::table[value & ((1u<<table_width) - 1)]; | |
136 value >>= table_width; | |
137 } | |
138 | |
139 ++first; | |
140 --length; | |
141 } | |
142 | |
143 return num; | |
144 } | |
145 | |
146 // ------------------------------------------------------- | |
147 | |
148 | |
149 // Some library implementations simply return a dummy | |
150 // value such as | |
151 // | |
152 // size_type(-1) / sizeof(T) | |
153 // | |
154 // from vector<>::max_size. This tries to get more | |
155 // meaningful info. | |
156 // | |
157 template <typename T> | |
158 typename T::size_type vector_max_size_workaround(const T & v) { | |
159 | |
160 typedef typename T::allocator_type allocator_type; | |
161 | |
162 const typename allocator_type::size_type alloc_max = | |
163 v.get_allocator().max_size(); | |
164 const typename T::size_type container_max = v.max_size(); | |
165 | |
166 return alloc_max < container_max? | |
167 alloc_max : | |
168 container_max; | |
169 } | |
170 | |
171 // for static_asserts | |
172 template <typename T> | |
173 struct allowed_block_type { | |
174 enum { value = T(-1) > 0 }; // ensure T has no sign | |
175 }; | |
176 | |
177 template <> | |
178 struct allowed_block_type<bool> { | |
179 enum { value = false }; | |
180 }; | |
181 | |
182 | |
183 template <typename T> | |
184 struct is_numeric { | |
185 enum { value = false }; | |
186 }; | |
187 | |
188 # define BOOST_dynamic_bitset_is_numeric(x) \ | |
189 template<> \ | |
190 struct is_numeric< x > { \ | |
191 enum { value = true }; \ | |
192 } /**/ | |
193 | |
194 BOOST_dynamic_bitset_is_numeric(bool); | |
195 BOOST_dynamic_bitset_is_numeric(char); | |
196 | |
197 #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) | |
198 BOOST_dynamic_bitset_is_numeric(wchar_t); | |
199 #endif | |
200 | |
201 BOOST_dynamic_bitset_is_numeric(signed char); | |
202 BOOST_dynamic_bitset_is_numeric(short int); | |
203 BOOST_dynamic_bitset_is_numeric(int); | |
204 BOOST_dynamic_bitset_is_numeric(long int); | |
205 | |
206 BOOST_dynamic_bitset_is_numeric(unsigned char); | |
207 BOOST_dynamic_bitset_is_numeric(unsigned short); | |
208 BOOST_dynamic_bitset_is_numeric(unsigned int); | |
209 BOOST_dynamic_bitset_is_numeric(unsigned long); | |
210 | |
211 #if defined(BOOST_HAS_LONG_LONG) | |
212 BOOST_dynamic_bitset_is_numeric(::boost::long_long_type); | |
213 BOOST_dynamic_bitset_is_numeric(::boost::ulong_long_type); | |
214 #endif | |
215 | |
216 // intentionally omitted | |
217 //BOOST_dynamic_bitset_is_numeric(float); | |
218 //BOOST_dynamic_bitset_is_numeric(double); | |
219 //BOOST_dynamic_bitset_is_numeric(long double); | |
220 | |
221 #undef BOOST_dynamic_bitset_is_numeric | |
222 | |
223 } // dynamic_bitset_impl | |
224 } // namespace detail | |
225 | |
226 } // namespace boost | |
227 | |
228 #endif // include guard | |
229 |