// ArduinoJson - https://arduinojson.org // Copyright Benoit Blanchon 2014-2021 // MIT License #pragma once #include "lib/ArduinoJson/Misc/Visitable.hpp" #include "lib/ArduinoJson/Numbers/arithmeticCompare.hpp" #include "lib/ArduinoJson/Polyfills/attributes.hpp" #include "lib/ArduinoJson/Polyfills/type_traits.hpp" #include "lib/ArduinoJson/Variant/VariantTag.hpp" namespace ARDUINOJSON_NAMESPACE { template CompareResult compare(const T1 &lhs, const T2 &rhs); // VariantCompare.cpp template struct VariantOperators { // Returns the default value if the VariantRef is undefined or incompatible // // int operator|(JsonVariant, int) // float operator|(JsonVariant, float) // bool operator|(JsonVariant, bool) template friend typename enable_if::value && !is_array::value, T>::type operator|(const TVariant &variant, const T &defaultValue) { if (variant.template is()) return variant.template as(); else return defaultValue; } // // const char* operator|(JsonVariant, const char*) friend const char *operator|(const TVariant &variant, const char *defaultValue) { if (variant.template is()) return variant.template as(); else return defaultValue; } // // JsonVariant operator|(JsonVariant, JsonVariant) template friend typename enable_if::value, typename T::variant_type>::type operator|(const TVariant &variant, T defaultValue) { if (variant) return variant; else return defaultValue; } // value == TVariant template friend bool operator==(T *lhs, TVariant rhs) { return compare(rhs, lhs) == COMPARE_RESULT_EQUAL; } template friend bool operator==(const T &lhs, TVariant rhs) { return compare(rhs, lhs) == COMPARE_RESULT_EQUAL; } // TVariant == value template friend bool operator==(TVariant lhs, T *rhs) { return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; } template friend typename enable_if::value, bool>::type operator==( TVariant lhs, const T &rhs) { return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; } // value != TVariant template friend bool operator!=(T *lhs, TVariant rhs) { return compare(rhs, lhs) != COMPARE_RESULT_EQUAL; } template friend bool operator!=(const T &lhs, TVariant rhs) { return compare(rhs, lhs) != COMPARE_RESULT_EQUAL; } // TVariant != value template friend bool operator!=(TVariant lhs, T *rhs) { return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; } template friend typename enable_if::value, bool>::type operator!=( TVariant lhs, const T &rhs) { return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; } // value < TVariant template friend bool operator<(T *lhs, TVariant rhs) { return compare(rhs, lhs) == COMPARE_RESULT_GREATER; } template friend bool operator<(const T &lhs, TVariant rhs) { return compare(rhs, lhs) == COMPARE_RESULT_GREATER; } // TVariant < value template friend bool operator<(TVariant lhs, T *rhs) { return compare(lhs, rhs) == COMPARE_RESULT_LESS; } template friend typename enable_if::value, bool>::type operator<( TVariant lhs, const T &rhs) { return compare(lhs, rhs) == COMPARE_RESULT_LESS; } // value <= TVariant template friend bool operator<=(T *lhs, TVariant rhs) { return (compare(rhs, lhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; } template friend bool operator<=(const T &lhs, TVariant rhs) { return (compare(rhs, lhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; } // TVariant <= value template friend bool operator<=(TVariant lhs, T *rhs) { return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; } template friend typename enable_if::value, bool>::type operator<=( TVariant lhs, const T &rhs) { return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; } // value > TVariant template friend bool operator>(T *lhs, TVariant rhs) { return compare(rhs, lhs) == COMPARE_RESULT_LESS; } template friend bool operator>(const T &lhs, TVariant rhs) { return compare(rhs, lhs) == COMPARE_RESULT_LESS; } // TVariant > value template friend bool operator>(TVariant lhs, T *rhs) { return compare(lhs, rhs) == COMPARE_RESULT_GREATER; } template friend typename enable_if::value, bool>::type operator>( TVariant lhs, const T &rhs) { return compare(lhs, rhs) == COMPARE_RESULT_GREATER; } // value >= TVariant template friend bool operator>=(T *lhs, TVariant rhs) { return (compare(rhs, lhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; } template friend bool operator>=(const T &lhs, TVariant rhs) { return (compare(rhs, lhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; } // TVariant >= value template friend bool operator>=(TVariant lhs, T *rhs) { return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; } template friend typename enable_if::value, bool>::type operator>=( TVariant lhs, const T &rhs) { return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; } }; } // namespace ARDUINOJSON_NAMESPACE