1
1
#include " ZkdHelper.h"
2
2
3
- #include < Basics/debugging.h>
3
+ #include " Basics/ScopeGuard.h"
4
+ #include " Basics/debugging.h"
5
+ #include " Containers/SmallVector.h"
6
+
4
7
#include < algorithm>
5
8
#include < cassert>
6
9
#include < cmath>
@@ -145,7 +148,7 @@ auto zkd::ByteReader::next() -> std::optional<std::byte> {
145
148
146
149
void zkd::BitWriter::append (Bit bit) {
147
150
if (bit == Bit::ONE) {
148
- _value |= std::byte{1 } << (7u - _nibble);
151
+ _value |= std::byte{1 } << (7U - _nibble);
149
152
}
150
153
_nibble += 1 ;
151
154
if (_nibble == 8 ) {
@@ -271,9 +274,6 @@ auto zkd::transpose(byte_string_view bs, std::size_t dimensions) -> std::vector<
271
274
return result;
272
275
}
273
276
274
-
275
- constexpr std::size_t max_dimensions = 64 ;
276
-
277
277
auto zkd::compareWithBox (byte_string_view cur, byte_string_view min, byte_string_view max, std::size_t dimensions)
278
278
-> std::vector<CompareResult> {
279
279
if (dimensions == 0 ) {
@@ -299,8 +299,12 @@ void zkd::compareWithBoxInto(byte_string_view cur, byte_string_view min, byte_st
299
299
BitReader min_reader (min);
300
300
BitReader max_reader (max);
301
301
302
- bool isLargerThanMin[max_dimensions] = {};
303
- bool isLowerThanMax[max_dimensions] = {};
302
+ auto const isLargerThanMin = [&result](auto const dim) {
303
+ return result[dim].saveMin != CompareResult::max;
304
+ };
305
+ auto const isLowerThanMax = [&result](auto const dim) {
306
+ return result[dim].saveMax != CompareResult::max;
307
+ };
304
308
305
309
unsigned step = 0 ;
306
310
unsigned dim = 0 ;
@@ -315,22 +319,20 @@ void zkd::compareWithBoxInto(byte_string_view cur, byte_string_view min, byte_st
315
319
continue ;
316
320
}
317
321
318
- if (!isLargerThanMin[ dim] ) {
322
+ if (!isLargerThanMin ( dim) ) {
319
323
if (cur_bit == Bit::ZERO && min_bit == Bit::ONE) {
320
324
result[dim].outStep = step;
321
325
result[dim].flag = -1 ;
322
326
} else if (cur_bit == Bit::ONE && min_bit == Bit::ZERO) {
323
- isLargerThanMin[dim] = true ;
324
327
result[dim].saveMin = step;
325
328
}
326
329
}
327
330
328
- if (!isLowerThanMax[ dim] ) {
331
+ if (!isLowerThanMax ( dim) ) {
329
332
if (cur_bit == Bit::ONE && max_bit == Bit::ZERO) {
330
333
result[dim].outStep = step;
331
334
result[dim].flag = 1 ;
332
335
} else if (cur_bit == Bit::ZERO && max_bit == Bit::ONE) {
333
- isLowerThanMax[dim] = true ;
334
336
result[dim].saveMax = step;
335
337
}
336
338
}
@@ -347,7 +349,7 @@ void zkd::compareWithBoxInto(byte_string_view cur, byte_string_view min, byte_st
347
349
auto zkd::testInBox (byte_string_view cur, byte_string_view min, byte_string_view max, std::size_t dimensions)
348
350
-> bool {
349
351
350
- if (dimensions == 0 && dimensions <= max_dimensions ) {
352
+ if (dimensions == 0 ) {
351
353
auto msg = std::string{" dimensions argument to " };
352
354
msg += __func__;
353
355
msg += " must be greater than zero." ;
@@ -360,8 +362,16 @@ auto zkd::testInBox(byte_string_view cur, byte_string_view min, byte_string_view
360
362
BitReader min_reader (min);
361
363
BitReader max_reader (max);
362
364
363
- bool isLargerThanMin[max_dimensions] = {};
364
- bool isLowerThanMax[max_dimensions] = {};
365
+ using allocator_type = containers::detail::short_alloc<bool , 64 , alignof (bool )>;
366
+ allocator_type::arena_type arena;
367
+ auto allocator = allocator_type{arena};
368
+ auto const boolArraySize = sizeof (bool ) * dimensions;
369
+ auto * const isLargerThanMin = allocator.allocate (boolArraySize);
370
+ TRI_DEFER (arena.deallocate ((char *)isLargerThanMin, dimensions));
371
+ auto * const isLowerThanMax = allocator.allocate (boolArraySize);
372
+ TRI_DEFER (arena.deallocate ((char *)isLowerThanMax, dimensions));
373
+ std::fill_n (isLargerThanMin, dimensions, false );
374
+ std::fill_n (isLowerThanMax, dimensions, false );
365
375
366
376
unsigned dim = 0 ;
367
377
unsigned finished_dims = 2 * dimensions;
0 commit comments