diff options
author | ylavic <ylavic.dev@gmail.com> | 2018-12-10 23:47:43 +0300 |
---|---|---|
committer | ylavic <ylavic.dev@gmail.com> | 2018-12-11 00:02:25 +0300 |
commit | 055f1fa61e9745da2705d4b2714785aef7a3af97 (patch) | |
tree | b923a4b99ec27fae620cf0fb10bb33040986b36e /include/rapidjson/pointer.h | |
parent | 66eb6067b10fd02e419f88816a8833a64eb33551 (diff) |
Add less than operator to Pointer.
Allows to sort pointers in (std-)containers and/or index by them.
Diffstat (limited to 'include/rapidjson/pointer.h')
-rw-r--r-- | include/rapidjson/pointer.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/include/rapidjson/pointer.h b/include/rapidjson/pointer.h index 3d339f24..54a8c9aa 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 |