Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/miloyip/rapidjson.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorylavic <ylavic.dev@gmail.com>2018-12-10 23:47:43 +0300
committerylavic <ylavic.dev@gmail.com>2018-12-11 00:02:25 +0300
commit055f1fa61e9745da2705d4b2714785aef7a3af97 (patch)
treeb923a4b99ec27fae620cf0fb10bb33040986b36e /include/rapidjson/pointer.h
parent66eb6067b10fd02e419f88816a8833a64eb33551 (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.h33
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