From 055f1fa61e9745da2705d4b2714785aef7a3af97 Mon Sep 17 00:00:00 2001 From: ylavic Date: Mon, 10 Dec 2018 21:47:43 +0100 Subject: [PATCH] Add less than operator to Pointer. Allows to sort pointers in (std-)containers and/or index by them. --- include/rapidjson/pointer.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/include/rapidjson/pointer.h b/include/rapidjson/pointer.h index 3d339f2..54a8c9a 100644 --- a/include/rapidjson/pointer.h +++ b/include/rapidjson/pointer.h @@ -356,6 +356,39 @@ public: */ bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + //! Less than operator. + /*! + \note Invalid pointers are never lesser than valid ones. + */ + bool operator<(const GenericPointer& rhs) const { + if (!IsValid()) + return false; + if (!rhs.IsValid()) + return true; + + size_t i = 0, lCount = tokenCount_, rCount = rhs.tokenCount_; + for (;;) { + if (!rCount) + return false; + if (!lCount) + return true; + + if (tokens_[i].index != rhs.tokens_[i].index) + return tokens_[i].index < rhs.tokens_[i].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; + + 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; + + lCount--; + rCount--; + i++; + } + } + //@} //!@name Stringify