summaryrefslogtreecommitdiff
path: root/include/lib/ArduinoJson/JsonVariantComparisons.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/lib/ArduinoJson/JsonVariantComparisons.hpp')
-rw-r--r--include/lib/ArduinoJson/JsonVariantComparisons.hpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/include/lib/ArduinoJson/JsonVariantComparisons.hpp b/include/lib/ArduinoJson/JsonVariantComparisons.hpp
new file mode 100644
index 0000000..47f9d63
--- /dev/null
+++ b/include/lib/ArduinoJson/JsonVariantComparisons.hpp
@@ -0,0 +1,139 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2018
+// MIT License
+
+#pragma once
+
+#include "StringTraits/StringTraits.hpp"
+#include "TypeTraits/EnableIf.hpp"
+#include "TypeTraits/IsVariant.hpp"
+
+namespace ArduinoJson {
+namespace Internals {
+
+template <typename TImpl>
+class JsonVariantComparisons {
+ public:
+ template <typename TComparand>
+ friend bool operator==(const JsonVariantComparisons &variant,
+ TComparand comparand) {
+ return variant.equals(comparand);
+ }
+
+ template <typename TComparand>
+ friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
+ operator==(TComparand comparand, const JsonVariantComparisons &variant) {
+ return variant.equals(comparand);
+ }
+
+ template <typename TComparand>
+ friend bool operator!=(const JsonVariantComparisons &variant,
+ TComparand comparand) {
+ return !variant.equals(comparand);
+ }
+
+ template <typename TComparand>
+ friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
+ operator!=(TComparand comparand, const JsonVariantComparisons &variant) {
+ return !variant.equals(comparand);
+ }
+
+ template <typename TComparand>
+ friend bool operator<=(const JsonVariantComparisons &left, TComparand right) {
+ return left.as<TComparand>() <= right;
+ }
+
+ template <typename TComparand>
+ friend bool operator<=(TComparand comparand,
+ const JsonVariantComparisons &variant) {
+ return comparand <= variant.as<TComparand>();
+ }
+
+ template <typename TComparand>
+ friend bool operator>=(const JsonVariantComparisons &variant,
+ TComparand comparand) {
+ return variant.as<TComparand>() >= comparand;
+ }
+
+ template <typename TComparand>
+ friend bool operator>=(TComparand comparand,
+ const JsonVariantComparisons &variant) {
+ return comparand >= variant.as<TComparand>();
+ }
+
+ template <typename TComparand>
+ friend bool operator<(const JsonVariantComparisons &varian,
+ TComparand comparand) {
+ return varian.as<TComparand>() < comparand;
+ }
+
+ template <typename TComparand>
+ friend bool operator<(TComparand comparand,
+ const JsonVariantComparisons &variant) {
+ return comparand < variant.as<TComparand>();
+ }
+
+ template <typename TComparand>
+ friend bool operator>(const JsonVariantComparisons &variant,
+ TComparand comparand) {
+ return variant.as<TComparand>() > comparand;
+ }
+
+ template <typename TComparand>
+ friend bool operator>(TComparand comparand,
+ const JsonVariantComparisons &variant) {
+ return comparand > variant.as<TComparand>();
+ }
+
+ private:
+ const TImpl *impl() const {
+ return static_cast<const TImpl *>(this);
+ }
+
+ template <typename T>
+ const typename JsonVariantAs<T>::type as() const {
+ return impl()->template as<T>();
+ }
+
+ template <typename T>
+ bool is() const {
+ return impl()->template is<T>();
+ }
+
+ template <typename TString>
+ typename EnableIf<StringTraits<TString>::has_equals, bool>::type equals(
+ const TString &comparand) const {
+ const char *value = as<const char *>();
+ return StringTraits<TString>::equals(comparand, value);
+ }
+
+ template <typename TComparand>
+ typename EnableIf<!IsVariant<TComparand>::value &&
+ !StringTraits<TComparand>::has_equals,
+ bool>::type
+ equals(const TComparand &comparand) const {
+ return as<TComparand>() == comparand;
+ }
+
+ template <typename TVariant2>
+ bool equals(const JsonVariantComparisons<TVariant2> &right) const {
+ using namespace Internals;
+ if (is<bool>() && right.template is<bool>())
+ return as<bool>() == right.template as<bool>();
+ if (is<JsonInteger>() && right.template is<JsonInteger>())
+ return as<JsonInteger>() == right.template as<JsonInteger>();
+ if (is<JsonFloat>() && right.template is<JsonFloat>())
+ return as<JsonFloat>() == right.template as<JsonFloat>();
+ if (is<JsonArray>() && right.template is<JsonArray>())
+ return as<JsonArray>() == right.template as<JsonArray>();
+ if (is<JsonObject>() && right.template is<JsonObject>())
+ return as<JsonObject>() == right.template as<JsonObject>();
+ if (is<char *>() && right.template is<char *>())
+ return StringTraits<const char *>::equals(as<char *>(),
+ right.template as<char *>());
+
+ return false;
+ }
+};
+} // namespace Internals
+} // namespace ArduinoJson