17 static_assert(std::is_integral<T>::value,
"Integer required.");
22 return (x & (x-1)) == 0;
32 if (_BitScanReverse(&index, x)) {
33 return (uint8_t)1 << (((x & (x - 1)) == 0) ? index : index + 1);
50 assert((o == 0) || (o / 2 < x));
62 if (_BitScanReverse(&index, x)) {
63 return (uint16_t)1 << (((x & (x - 1)) == 0) ? index : index + 1);
78 assert((o == 0) || (o/2 < x));
84 inline uint16_t roundDownToPowerOfTwo(uint16_t x)
88 if (_BitScanReverse(&index, x)) {
89 return (uint16_t)(1 << index);
115 if (_BitScanReverse(&index, x)) {
116 return (uint32_t)1 << (((x & (x - 1)) == 0) ? index : index + 1);
132 assert((o == 0) || (o / 2 < x));
142#if defined(_MSC_VER) && defined(_WIN64)
144 if (_BitScanReverse64(&index, x)) {
145 return (uint64_t)1 << (((x & (x - 1)) == 0) ? index : index + 1);
162 assert((o == 0) || (o / 2 < x));
174 if (_BitScanReverse(&index, x)) {
175 return (uint8_t)(((x & (x - 1)) == 0) ? index : index + 1);
183 if (t & 0xF0u) s += 4;
184 if (t & 0xCCu) s += 2;
185 if (t & 0xAAu) s += 1;
188 assert(x <= (1u << s));
189 assert((s == 0u) || ((1u << (s - 1u) < x)));
201 if (_BitScanReverse(&index, x)) {
202 return (uint16_t)(((x & (x - 1)) == 0) ? index : index + 1);
209 if (t & 0xFF00u) s += 8;
210 if (t & 0xF0F0u) s += 4;
211 if (t & 0xCCCCu) s += 2;
212 if (t & 0xAAAAu) s += 1;
215 assert(x <= (1u << s));
216 assert((s == 0u) || ((1u << (s - 1u) < x)));
228 if (_BitScanReverse(&index, x)) {
229 return (uint32_t)(((x & (x - 1)) == 0) ? index : index + 1);
236 if (t & 0xFFFF0000u) s += 16;
237 if (t & 0xFF00FF00u) s += 8;
238 if (t & 0xF0F0F0F0u) s += 4;
239 if (t & 0xCCCCCCCCu) s += 2;
240 if (t & 0xAAAAAAAAu) s += 1;
243 assert(x <= (1u << s));
244 assert((s == 0u) || ((1u << (s - 1u) < x)));
254#if defined(_MSC_VER) && defined(_WIN64)
256 if (_BitScanReverse64(&index, x)) {
257 return ((x & (x - 1)) == 0) ? index : index + 1;
264 if (t & 0xFFFFFFFF00000000u) s += 32;
265 if (t & 0xFFFF0000FFFF0000u) s += 16;
266 if (t & 0xFF00FF00FF00FF00u) s += 8;
267 if (t & 0xF0F0F0F0F0F0F0F0u) s += 4;
268 if (t & 0xCCCCCCCCCCCCCCCCu) s += 2;
269 if (t & 0xAAAAAAAAAAAAAAAAu) s += 1;
272 assert(x <= (1ull << s));
273 assert((s == 0u) || ((1ull << (s - 1u) < x)));
Contains all Cogs related functionality.
uint8_t roundUpToPowerOfTwo(uint8_t x)
uint8_t roundUpToPowerOfTwoShift(uint8_t x)