Skip to content

Commit dad7547

Browse files
committed
added ArrayIterator::Empty
1 parent b4f78cc commit dad7547

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

include/velocypack/Iterator.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,14 @@ class ArrayIterator : public std::iterator<std::forward_iterator_tag, Slice> {
4141
public:
4242
using iterator_category = std::forward_iterator_tag;
4343

44+
struct Empty {};
45+
4446
ArrayIterator() = delete;
4547

48+
// optimization for an empty array
49+
explicit ArrayIterator(Empty) noexcept
50+
: _slice(Slice::emptyArraySlice()), _size(0), _position(0), _current(nullptr), _first(nullptr) {}
51+
4652
explicit ArrayIterator(Slice slice)
4753
: _slice(slice), _size(0), _position(0), _current(nullptr), _first(nullptr) {
4854

tests/testsBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3447,7 +3447,7 @@ TEST(BuilderTest, TestBoundariesWithPaddingButContainingNones) {
34473447

34483448
#if __cplusplus >= 201703L
34493449
TEST(BuilderTest, getSharedSlice) {
3450-
auto const check = [](Builder& b, bool const isSmall) {
3450+
auto const check = [](Builder& b, bool const /* isSmall */) {
34513451
auto const slice = b.slice();
34523452
ASSERT_EQ(1, b.buffer().use_count());
34533453
auto const sharedSlice = b.sharedSlice();

tests/testsIterator.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ TEST(IteratorTest, IterateArrayEmpty) {
8181
Slice s(parser.start());
8282

8383
ArrayIterator it(s);
84+
ASSERT_EQ(0U, it.size());
85+
ASSERT_FALSE(it.valid());
86+
87+
ASSERT_VELOCYPACK_EXCEPTION(it.value(), Exception::IndexOutOfBounds);
88+
89+
it.next();
90+
ASSERT_FALSE(it.valid());
91+
92+
ASSERT_VELOCYPACK_EXCEPTION((*it), Exception::IndexOutOfBounds);
93+
}
94+
95+
TEST(IteratorTest, IterateArrayEmptySpecial) {
96+
ArrayIterator it(ArrayIterator::Empty{});
97+
ASSERT_EQ(0U, it.size());
8498
ASSERT_FALSE(it.valid());
8599

86100
ASSERT_VELOCYPACK_EXCEPTION(it.value(), Exception::IndexOutOfBounds);
@@ -99,6 +113,7 @@ TEST(IteratorTest, IterateArray) {
99113
Slice s(parser.start());
100114

101115
ArrayIterator it(s);
116+
ASSERT_EQ(8U, it.size());
102117

103118
ASSERT_TRUE(it.valid());
104119
Slice current = it.value();
@@ -167,6 +182,7 @@ TEST(IteratorTest, IterateArrayForward) {
167182
Slice s(parser.start());
168183

169184
ArrayIterator it(s);
185+
ASSERT_EQ(8U, it.size());
170186

171187
ASSERT_TRUE(it.valid());
172188
Slice current = it.value();
@@ -228,6 +244,7 @@ TEST(IteratorTest, IterateCompactArrayForward) {
228244
Slice s(parser.start());
229245

230246
ArrayIterator it(s);
247+
ASSERT_EQ(8U, it.size());
231248

232249
ASSERT_TRUE(it.valid());
233250
Slice current = it.value();
@@ -286,12 +303,14 @@ TEST(IteratorTest, IterateSubArray) {
286303
Slice s(parser.start());
287304

288305
ArrayIterator it(s);
306+
ASSERT_EQ(2U, it.size());
289307

290308
ASSERT_TRUE(it.valid());
291309
Slice current = it.value();
292310
ASSERT_TRUE(current.isArray());
293311

294312
ArrayIterator it2(current);
313+
ASSERT_EQ(3U, it2.size());
295314
ASSERT_TRUE(it2.valid());
296315
Slice sub = it2.value();
297316
ASSERT_TRUE(sub.isNumber());
@@ -322,6 +341,7 @@ TEST(IteratorTest, IterateSubArray) {
322341
ASSERT_TRUE(current.isArray());
323342

324343
ArrayIterator it3(current);
344+
ASSERT_EQ(2U, it3.size());
325345

326346
ASSERT_TRUE(it3.valid());
327347
sub = it3.value();
@@ -352,6 +372,7 @@ TEST(IteratorTest, IterateArrayUnsorted) {
352372
Slice s(parser.start());
353373

354374
ArrayIterator it(s);
375+
ASSERT_EQ(8U, it.size());
355376

356377
ASSERT_TRUE(it.valid());
357378
Slice current = it.value();

0 commit comments

Comments
 (0)