Skip to content

Commit 0e34ed4

Browse files
committed
Rework Pointer::operator<() loop.
I must be too dumb to understand the mess MSVC (32bit only) did with the previous loop, and to figure out how it might have make it never end. Anyway, hopefully any compiler can grok this new loop...
1 parent af17f19 commit 0e34ed4

File tree

2 files changed

+27
-29
lines changed

2 files changed

+27
-29
lines changed

include/rapidjson/pointer.h

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -358,35 +358,28 @@ class GenericPointer {
358358

359359
//! Less than operator.
360360
/*!
361-
\note Invalid pointers are never lesser than valid ones.
361+
\note Invalid pointers are always greater than valid ones.
362362
*/
363363
bool operator<(const GenericPointer& rhs) const {
364364
if (!IsValid())
365365
return false;
366366
if (!rhs.IsValid())
367367
return true;
368368

369-
size_t i = 0, lCount = tokenCount_, rCount = rhs.tokenCount_;
370-
for (;;) {
371-
if (!rCount)
372-
return false;
373-
if (!lCount)
374-
return true;
375-
376-
if (tokens_[i].index != rhs.tokens_[i].index)
377-
return tokens_[i].index < rhs.tokens_[i].index;
369+
const Token *lTok = tokens_, *const lEnd = lTok + tokenCount_,
370+
*rTok = rhs.tokens_, *const rEnd = rTok + rhs.tokenCount_;
371+
for (; lTok != lEnd && rTok != rEnd; ++lTok, ++rTok) {
372+
if (lTok->index != rTok->index)
373+
return lTok->index < rTok->index;
378374

379-
if (tokens_[i].length > rhs.tokens_[i].length)
380-
return std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * rhs.tokens_[i].length) < 0;
375+
if (lTok->length > rTok->length)
376+
return std::memcmp(lTok->name, rTok->name, sizeof(Ch) * rTok->length) < 0;
381377

382-
int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length);
383-
if (cmp || tokens_[i].length != rhs.tokens_[i].length)
384-
return cmp <= 0;
385-
386-
lCount--;
387-
rCount--;
388-
i++;
378+
int comp = std::memcmp(lTok->name, rTok->name, sizeof(Ch) * lTok->length);
379+
if (comp || lTok->length != rTok->length)
380+
return comp <= 0;
389381
}
382+
return rTok != rEnd;
390383
}
391384

392385
//@}

test/unittest/pointertest.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,8 +1515,8 @@ TEST(Pointer, LessThan) {
15151515
"/e/f.g",
15161516
""
15171517
};
1518-
static struct {
1519-
const char *string;
1518+
static const struct {
1519+
const char *str;
15201520
bool valid;
15211521
} ordered_pointers[] = {
15221522
{ "", true },
@@ -1537,24 +1537,29 @@ TEST(Pointer, LessThan) {
15371537
{ "/e/f~g", false },
15381538
{ "/e/f~~g", false }
15391539
};
1540-
MemoryPoolAllocator<> allocator;
1541-
typedef GenericPointer<Value, MemoryPoolAllocator<> > PooledPointer;
1542-
std::multiset<PooledPointer> set;
1540+
typedef MemoryPoolAllocator<> AllocatorType;
1541+
typedef GenericPointer<Value, AllocatorType> PointerType;
1542+
typedef std::multiset<PointerType> PointerSet;
1543+
AllocatorType allocator;
1544+
PointerSet set;
15431545
size_t i;
15441546

1545-
for (i = 0; i < sizeof(pointers) / sizeof(*pointers); ++i) {
1546-
set.insert(PooledPointer(pointers[i], &allocator));
1547+
EXPECT_EQ(sizeof(pointers) / sizeof(pointers[0]),
1548+
sizeof(ordered_pointers) / sizeof(ordered_pointers[0]));
1549+
1550+
for (i = 0; i < sizeof(pointers) / sizeof(pointers[0]); ++i) {
1551+
set.insert(PointerType(pointers[i], &allocator));
15471552
}
15481553

15491554
i = 0;
1550-
for (std::set<PooledPointer>::iterator it = set.begin(); it != set.end(); ++it) {
1551-
EXPECT_TRUE(i < sizeof(ordered_pointers) / sizeof(*ordered_pointers));
1555+
for (PointerSet::iterator it = set.begin(); it != set.end(); ++it) {
1556+
EXPECT_TRUE(i < sizeof(ordered_pointers) / sizeof(ordered_pointers[0]));
15521557
EXPECT_EQ(it->IsValid(), ordered_pointers[i].valid);
15531558
if (it->IsValid()) {
15541559
std::stringstream ss;
15551560
OStreamWrapper os(ss);
15561561
EXPECT_TRUE(it->Stringify(os));
1557-
EXPECT_EQ(ss.str(), ordered_pointers[i].string);
1562+
EXPECT_EQ(ss.str(), ordered_pointers[i].str);
15581563
}
15591564
i++;
15601565
}

0 commit comments

Comments
 (0)