Skip to content

Commit

Permalink
Use temporaries in Pointer::operator<() to evaluate once.
Browse files Browse the repository at this point in the history
  • Loading branch information
ylavic committed Dec 11, 2018
1 parent f1450da commit 54d8493
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 10 deletions.
15 changes: 8 additions & 7 deletions include/rapidjson/pointer.h
Expand Up @@ -373,15 +373,16 @@ class GenericPointer {
if (!rCount)
return false;

if (tokens_[i].index != rhs.tokens_[i].index)
return tokens_[i].index < rhs.tokens_[i].index;
const Token &lTokens = tokens_[i], &rTokens = rhs.tokens_[i];
if (lTokens.index != rTokens.index)
return lTokens.index < rTokens.index;

if (tokens_[i].length > rhs.tokens_[i].length)
return std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * rhs.tokens_[i].length) < 0;
if (lTokens.length > rTokens.length)
return std::memcmp(lTokens.name, rTokens.name, sizeof(Ch) * rTokens.length) < 0;

int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length);
if (cmp || tokens_[i].length != rhs.tokens_[i].length)
return cmp <= 0;
int comp = std::memcmp(lTokens.name, rTokens.name, sizeof(Ch) * lTokens.length);
if (comp || lTokens.length != rTokens.length)
return comp <= 0;

lCount--;
rCount--;
Expand Down
6 changes: 3 additions & 3 deletions test/unittest/pointertest.cpp
Expand Up @@ -1538,13 +1538,13 @@ TEST(Pointer, LessThan) {
{ "/e/f~~g", false }
};
MemoryPoolAllocator<> allocator;
typedef GenericPointer<Value, MemoryPoolAllocator<> > PooledPointer;
typedef std::multiset<PooledPointer> PointerSet;
typedef GenericPointer<Value, MemoryPoolAllocator<> > PointerType;
typedef std::multiset<PointerType> PointerSet;
PointerSet set;
size_t i;

for (i = 0; i < sizeof(pointers) / sizeof(*pointers); ++i) {
set.insert(PooledPointer(pointers[i], &allocator));
set.insert(PointerType(pointers[i], &allocator));
}

i = 0;
Expand Down

0 comments on commit 54d8493

Please sign in to comment.