Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
reARMnimator
Date:
Mon Jan 06 15:54:55 2020 +0000
Revision:
10:de4b8812877d
Parent:
7:471901a04573
Fixed inappropriate include path.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 6:a8c83a2e6fa4 1 /*******************************************************************************
IanBenzMaxim 6:a8c83a2e6fa4 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 6:a8c83a2e6fa4 3 *
IanBenzMaxim 6:a8c83a2e6fa4 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 6:a8c83a2e6fa4 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 6:a8c83a2e6fa4 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 6:a8c83a2e6fa4 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 6:a8c83a2e6fa4 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 6:a8c83a2e6fa4 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 6:a8c83a2e6fa4 10 *
IanBenzMaxim 6:a8c83a2e6fa4 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 6:a8c83a2e6fa4 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 6:a8c83a2e6fa4 13 *
IanBenzMaxim 6:a8c83a2e6fa4 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 6:a8c83a2e6fa4 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 6:a8c83a2e6fa4 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 6:a8c83a2e6fa4 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 6:a8c83a2e6fa4 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 6:a8c83a2e6fa4 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 6:a8c83a2e6fa4 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 6:a8c83a2e6fa4 21 *
IanBenzMaxim 6:a8c83a2e6fa4 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 6:a8c83a2e6fa4 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 6:a8c83a2e6fa4 24 * Products, Inc. Branding Policy.
IanBenzMaxim 6:a8c83a2e6fa4 25 *
IanBenzMaxim 6:a8c83a2e6fa4 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 6:a8c83a2e6fa4 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 6:a8c83a2e6fa4 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 6:a8c83a2e6fa4 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 6:a8c83a2e6fa4 30 * ownership rights.
IanBenzMaxim 6:a8c83a2e6fa4 31 *******************************************************************************/
IanBenzMaxim 6:a8c83a2e6fa4 32
IanBenzMaxim 6:a8c83a2e6fa4 33 #ifndef MaximInterface_optional
IanBenzMaxim 6:a8c83a2e6fa4 34 #define MaximInterface_optional
IanBenzMaxim 6:a8c83a2e6fa4 35
IanBenzMaxim 6:a8c83a2e6fa4 36 #include "SafeBool.hpp"
IanBenzMaxim 6:a8c83a2e6fa4 37
IanBenzMaxim 6:a8c83a2e6fa4 38 // Include for std::swap.
IanBenzMaxim 6:a8c83a2e6fa4 39 #include <algorithm>
IanBenzMaxim 6:a8c83a2e6fa4 40 #include <utility>
IanBenzMaxim 6:a8c83a2e6fa4 41
IanBenzMaxim 6:a8c83a2e6fa4 42 namespace MaximInterface {
IanBenzMaxim 6:a8c83a2e6fa4 43
IanBenzMaxim 6:a8c83a2e6fa4 44 struct nullopt_t {
IanBenzMaxim 6:a8c83a2e6fa4 45 explicit nullopt_t(int) {}
IanBenzMaxim 6:a8c83a2e6fa4 46 };
IanBenzMaxim 6:a8c83a2e6fa4 47
IanBenzMaxim 6:a8c83a2e6fa4 48 static const nullopt_t nullopt(0);
IanBenzMaxim 6:a8c83a2e6fa4 49
IanBenzMaxim 7:471901a04573 50 /// @brief Optional value container similar to std::optional.
IanBenzMaxim 6:a8c83a2e6fa4 51 /// @details
IanBenzMaxim 6:a8c83a2e6fa4 52 /// To prevent the need for aligned storage, this implementation imposes that
IanBenzMaxim 6:a8c83a2e6fa4 53 /// types must be DefaultConstructible, CopyConstructible, and CopyAssignable.
IanBenzMaxim 6:a8c83a2e6fa4 54 /// No exceptions are thrown when accessing a valueless optional.
IanBenzMaxim 6:a8c83a2e6fa4 55 template <typename T> class optional {
IanBenzMaxim 6:a8c83a2e6fa4 56 public:
IanBenzMaxim 6:a8c83a2e6fa4 57 typedef T value_type;
IanBenzMaxim 6:a8c83a2e6fa4 58
IanBenzMaxim 6:a8c83a2e6fa4 59 optional() : value_(), has_value_(false) {}
IanBenzMaxim 6:a8c83a2e6fa4 60
IanBenzMaxim 6:a8c83a2e6fa4 61 optional(nullopt_t) : value_(), has_value_(false) {}
IanBenzMaxim 6:a8c83a2e6fa4 62
IanBenzMaxim 6:a8c83a2e6fa4 63 optional(const T & value) : value_(value), has_value_(true) {}
IanBenzMaxim 6:a8c83a2e6fa4 64
IanBenzMaxim 6:a8c83a2e6fa4 65 template <typename U>
IanBenzMaxim 6:a8c83a2e6fa4 66 explicit optional(const optional<U> & other)
IanBenzMaxim 6:a8c83a2e6fa4 67 : value_(other.value_), has_value_(other.has_value_) {}
IanBenzMaxim 6:a8c83a2e6fa4 68
IanBenzMaxim 6:a8c83a2e6fa4 69 optional & operator=(nullopt_t) {
IanBenzMaxim 6:a8c83a2e6fa4 70 reset();
IanBenzMaxim 6:a8c83a2e6fa4 71 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 72 }
IanBenzMaxim 6:a8c83a2e6fa4 73
IanBenzMaxim 6:a8c83a2e6fa4 74 optional & operator=(const T & value) {
IanBenzMaxim 6:a8c83a2e6fa4 75 value_ = value;
IanBenzMaxim 6:a8c83a2e6fa4 76 has_value_ = true;
IanBenzMaxim 6:a8c83a2e6fa4 77 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 78 }
IanBenzMaxim 6:a8c83a2e6fa4 79
IanBenzMaxim 6:a8c83a2e6fa4 80 template <typename U> optional & operator=(const optional<U> & other) {
IanBenzMaxim 6:a8c83a2e6fa4 81 if (has_value_ || other.has_value_) {
IanBenzMaxim 6:a8c83a2e6fa4 82 value_ = other.value_;
IanBenzMaxim 6:a8c83a2e6fa4 83 has_value_ = other.has_value_;
IanBenzMaxim 6:a8c83a2e6fa4 84 }
IanBenzMaxim 6:a8c83a2e6fa4 85 return *this;
IanBenzMaxim 6:a8c83a2e6fa4 86 }
IanBenzMaxim 6:a8c83a2e6fa4 87
IanBenzMaxim 6:a8c83a2e6fa4 88 bool has_value() const { return has_value_; }
IanBenzMaxim 6:a8c83a2e6fa4 89
IanBenzMaxim 6:a8c83a2e6fa4 90 operator SafeBool() const { return makeSafeBool(has_value()); }
IanBenzMaxim 6:a8c83a2e6fa4 91
IanBenzMaxim 6:a8c83a2e6fa4 92 const T & value() const { return value_; }
IanBenzMaxim 6:a8c83a2e6fa4 93
IanBenzMaxim 6:a8c83a2e6fa4 94 T & value() {
IanBenzMaxim 6:a8c83a2e6fa4 95 return const_cast<T &>(static_cast<const optional &>(*this).value());
IanBenzMaxim 6:a8c83a2e6fa4 96 }
IanBenzMaxim 6:a8c83a2e6fa4 97
IanBenzMaxim 6:a8c83a2e6fa4 98 const T & operator*() const { return value(); }
IanBenzMaxim 6:a8c83a2e6fa4 99
IanBenzMaxim 6:a8c83a2e6fa4 100 T & operator*() {
IanBenzMaxim 6:a8c83a2e6fa4 101 return const_cast<T &>(static_cast<const optional &>(*this).operator*());
IanBenzMaxim 6:a8c83a2e6fa4 102 }
IanBenzMaxim 6:a8c83a2e6fa4 103
IanBenzMaxim 6:a8c83a2e6fa4 104 const T * operator->() const { return &value(); }
IanBenzMaxim 6:a8c83a2e6fa4 105
IanBenzMaxim 6:a8c83a2e6fa4 106 T * operator->() {
IanBenzMaxim 6:a8c83a2e6fa4 107 return const_cast<T *>(static_cast<const optional &>(*this).operator->());
IanBenzMaxim 6:a8c83a2e6fa4 108 }
IanBenzMaxim 6:a8c83a2e6fa4 109
IanBenzMaxim 6:a8c83a2e6fa4 110 const T & value_or(const T & default_value) const {
IanBenzMaxim 6:a8c83a2e6fa4 111 return has_value() ? value() : default_value;
IanBenzMaxim 6:a8c83a2e6fa4 112 }
IanBenzMaxim 6:a8c83a2e6fa4 113
IanBenzMaxim 6:a8c83a2e6fa4 114 void swap(optional & other) {
IanBenzMaxim 6:a8c83a2e6fa4 115 if (has_value_ || other.has_value_) {
IanBenzMaxim 6:a8c83a2e6fa4 116 using std::swap;
IanBenzMaxim 6:a8c83a2e6fa4 117 swap(value_, other.value_);
IanBenzMaxim 6:a8c83a2e6fa4 118 swap(has_value_, other.has_value_);
IanBenzMaxim 6:a8c83a2e6fa4 119 }
IanBenzMaxim 6:a8c83a2e6fa4 120 }
IanBenzMaxim 6:a8c83a2e6fa4 121
IanBenzMaxim 6:a8c83a2e6fa4 122 void reset() {
IanBenzMaxim 6:a8c83a2e6fa4 123 if (has_value_) {
IanBenzMaxim 6:a8c83a2e6fa4 124 has_value_ = false;
IanBenzMaxim 6:a8c83a2e6fa4 125 value_ = T();
IanBenzMaxim 6:a8c83a2e6fa4 126 }
IanBenzMaxim 6:a8c83a2e6fa4 127 }
IanBenzMaxim 6:a8c83a2e6fa4 128
IanBenzMaxim 6:a8c83a2e6fa4 129 private:
IanBenzMaxim 6:a8c83a2e6fa4 130 T value_;
IanBenzMaxim 6:a8c83a2e6fa4 131 bool has_value_;
IanBenzMaxim 6:a8c83a2e6fa4 132 };
IanBenzMaxim 6:a8c83a2e6fa4 133
IanBenzMaxim 6:a8c83a2e6fa4 134 template <typename T> optional<T> make_optional(const T & value) {
IanBenzMaxim 6:a8c83a2e6fa4 135 return value;
IanBenzMaxim 6:a8c83a2e6fa4 136 }
IanBenzMaxim 6:a8c83a2e6fa4 137
IanBenzMaxim 6:a8c83a2e6fa4 138 template <typename T> void swap(optional<T> & lhs, optional<T> & rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 139 lhs.swap(rhs);
IanBenzMaxim 6:a8c83a2e6fa4 140 }
IanBenzMaxim 6:a8c83a2e6fa4 141
IanBenzMaxim 6:a8c83a2e6fa4 142 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 143 bool operator==(const optional<T> & lhs, const optional<U> & rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 144 if (lhs.has_value() != rhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 145 return false;
IanBenzMaxim 6:a8c83a2e6fa4 146 }
IanBenzMaxim 6:a8c83a2e6fa4 147 if (!lhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 148 return true;
IanBenzMaxim 6:a8c83a2e6fa4 149 }
IanBenzMaxim 6:a8c83a2e6fa4 150 return lhs.value() == rhs.value();
IanBenzMaxim 6:a8c83a2e6fa4 151 }
IanBenzMaxim 6:a8c83a2e6fa4 152
IanBenzMaxim 6:a8c83a2e6fa4 153 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 154 bool operator!=(const optional<T> & lhs, const optional<U> & rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 155 if (lhs.has_value() != rhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 156 return true;
IanBenzMaxim 6:a8c83a2e6fa4 157 }
IanBenzMaxim 6:a8c83a2e6fa4 158 if (!lhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 159 return false;
IanBenzMaxim 6:a8c83a2e6fa4 160 }
IanBenzMaxim 6:a8c83a2e6fa4 161 return lhs.value() != rhs.value();
IanBenzMaxim 6:a8c83a2e6fa4 162 }
IanBenzMaxim 6:a8c83a2e6fa4 163
IanBenzMaxim 6:a8c83a2e6fa4 164 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 165 bool operator<(const optional<T> & lhs, const optional<U> & rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 166 if (!rhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 167 return false;
IanBenzMaxim 6:a8c83a2e6fa4 168 }
IanBenzMaxim 6:a8c83a2e6fa4 169 if (!lhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 170 return true;
IanBenzMaxim 6:a8c83a2e6fa4 171 }
IanBenzMaxim 6:a8c83a2e6fa4 172 return lhs.value() < rhs.value();
IanBenzMaxim 6:a8c83a2e6fa4 173 }
IanBenzMaxim 6:a8c83a2e6fa4 174
IanBenzMaxim 6:a8c83a2e6fa4 175 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 176 bool operator<=(const optional<T> & lhs, const optional<U> & rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 177 if (!lhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 178 return true;
IanBenzMaxim 6:a8c83a2e6fa4 179 }
IanBenzMaxim 6:a8c83a2e6fa4 180 if (!rhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 181 return false;
IanBenzMaxim 6:a8c83a2e6fa4 182 }
IanBenzMaxim 6:a8c83a2e6fa4 183 return lhs.value() <= rhs.value();
IanBenzMaxim 6:a8c83a2e6fa4 184 }
IanBenzMaxim 6:a8c83a2e6fa4 185
IanBenzMaxim 6:a8c83a2e6fa4 186 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 187 bool operator>(const optional<T> & lhs, const optional<U> & rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 188 if (!lhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 189 return false;
IanBenzMaxim 6:a8c83a2e6fa4 190 }
IanBenzMaxim 6:a8c83a2e6fa4 191 if (!rhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 192 return true;
IanBenzMaxim 6:a8c83a2e6fa4 193 }
IanBenzMaxim 6:a8c83a2e6fa4 194 return lhs.value() > rhs.value();
IanBenzMaxim 6:a8c83a2e6fa4 195 }
IanBenzMaxim 6:a8c83a2e6fa4 196
IanBenzMaxim 6:a8c83a2e6fa4 197 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 198 bool operator>=(const optional<T> & lhs, const optional<U> & rhs) {
IanBenzMaxim 6:a8c83a2e6fa4 199 if (!rhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 200 return true;
IanBenzMaxim 6:a8c83a2e6fa4 201 }
IanBenzMaxim 6:a8c83a2e6fa4 202 if (!lhs.has_value()) {
IanBenzMaxim 6:a8c83a2e6fa4 203 return false;
IanBenzMaxim 6:a8c83a2e6fa4 204 }
IanBenzMaxim 6:a8c83a2e6fa4 205 return lhs.value() >= rhs.value();
IanBenzMaxim 6:a8c83a2e6fa4 206 }
IanBenzMaxim 6:a8c83a2e6fa4 207
IanBenzMaxim 6:a8c83a2e6fa4 208 template <typename T> bool operator==(const optional<T> & opt, nullopt_t) {
IanBenzMaxim 6:a8c83a2e6fa4 209 return !opt.has_value();
IanBenzMaxim 6:a8c83a2e6fa4 210 }
IanBenzMaxim 6:a8c83a2e6fa4 211
IanBenzMaxim 6:a8c83a2e6fa4 212 template <typename T> bool operator==(nullopt_t, const optional<T> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 213 return operator==(opt, nullopt);
IanBenzMaxim 6:a8c83a2e6fa4 214 }
IanBenzMaxim 6:a8c83a2e6fa4 215
IanBenzMaxim 6:a8c83a2e6fa4 216 template <typename T> bool operator!=(const optional<T> & opt, nullopt_t) {
IanBenzMaxim 6:a8c83a2e6fa4 217 return !operator==(opt, nullopt);
IanBenzMaxim 6:a8c83a2e6fa4 218 }
IanBenzMaxim 6:a8c83a2e6fa4 219
IanBenzMaxim 6:a8c83a2e6fa4 220 template <typename T> bool operator!=(nullopt_t, const optional<T> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 221 return operator!=(opt, nullopt);
IanBenzMaxim 6:a8c83a2e6fa4 222 }
IanBenzMaxim 6:a8c83a2e6fa4 223
IanBenzMaxim 6:a8c83a2e6fa4 224 template <typename T> bool operator<(const optional<T> &, nullopt_t) {
IanBenzMaxim 6:a8c83a2e6fa4 225 return false;
IanBenzMaxim 6:a8c83a2e6fa4 226 }
IanBenzMaxim 6:a8c83a2e6fa4 227
IanBenzMaxim 6:a8c83a2e6fa4 228 template <typename T> bool operator<(nullopt_t, const optional<T> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 229 return opt.has_value();
IanBenzMaxim 6:a8c83a2e6fa4 230 }
IanBenzMaxim 6:a8c83a2e6fa4 231
IanBenzMaxim 6:a8c83a2e6fa4 232 template <typename T> bool operator<=(const optional<T> & opt, nullopt_t) {
IanBenzMaxim 6:a8c83a2e6fa4 233 return !operator>(opt, nullopt);
IanBenzMaxim 6:a8c83a2e6fa4 234 }
IanBenzMaxim 6:a8c83a2e6fa4 235
IanBenzMaxim 6:a8c83a2e6fa4 236 template <typename T> bool operator<=(nullopt_t, const optional<T> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 237 return !operator>(nullopt, opt);
IanBenzMaxim 6:a8c83a2e6fa4 238 }
IanBenzMaxim 6:a8c83a2e6fa4 239
IanBenzMaxim 6:a8c83a2e6fa4 240 template <typename T> bool operator>(const optional<T> & opt, nullopt_t) {
IanBenzMaxim 6:a8c83a2e6fa4 241 return operator<(nullopt, opt);
IanBenzMaxim 6:a8c83a2e6fa4 242 }
IanBenzMaxim 6:a8c83a2e6fa4 243
IanBenzMaxim 6:a8c83a2e6fa4 244 template <typename T> bool operator>(nullopt_t, const optional<T> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 245 return operator<(opt, nullopt);
IanBenzMaxim 6:a8c83a2e6fa4 246 }
IanBenzMaxim 6:a8c83a2e6fa4 247
IanBenzMaxim 6:a8c83a2e6fa4 248 template <typename T> bool operator>=(const optional<T> & opt, nullopt_t) {
IanBenzMaxim 6:a8c83a2e6fa4 249 return !operator<(opt, nullopt);
IanBenzMaxim 6:a8c83a2e6fa4 250 }
IanBenzMaxim 6:a8c83a2e6fa4 251
IanBenzMaxim 6:a8c83a2e6fa4 252 template <typename T> bool operator>=(nullopt_t, const optional<T> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 253 return !operator<(nullopt, opt);
IanBenzMaxim 6:a8c83a2e6fa4 254 }
IanBenzMaxim 6:a8c83a2e6fa4 255
IanBenzMaxim 6:a8c83a2e6fa4 256 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 257 bool operator==(const optional<T> & opt, const U & value) {
IanBenzMaxim 6:a8c83a2e6fa4 258 return opt.has_value() ? opt.value() == value : false;
IanBenzMaxim 6:a8c83a2e6fa4 259 }
IanBenzMaxim 6:a8c83a2e6fa4 260
IanBenzMaxim 6:a8c83a2e6fa4 261 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 262 bool operator==(const T & value, const optional<U> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 263 return operator==(opt, value);
IanBenzMaxim 6:a8c83a2e6fa4 264 }
IanBenzMaxim 6:a8c83a2e6fa4 265
IanBenzMaxim 6:a8c83a2e6fa4 266 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 267 bool operator!=(const optional<T> & opt, const U & value) {
IanBenzMaxim 6:a8c83a2e6fa4 268 return opt.has_value() ? opt.value() != value : true;
IanBenzMaxim 6:a8c83a2e6fa4 269 }
IanBenzMaxim 6:a8c83a2e6fa4 270
IanBenzMaxim 6:a8c83a2e6fa4 271 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 272 bool operator!=(const T & value, const optional<U> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 273 return operator!=(opt, value);
IanBenzMaxim 6:a8c83a2e6fa4 274 }
IanBenzMaxim 6:a8c83a2e6fa4 275
IanBenzMaxim 6:a8c83a2e6fa4 276 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 277 bool operator<(const optional<T> & opt, const U & value) {
IanBenzMaxim 6:a8c83a2e6fa4 278 return opt.has_value() ? opt.value() < value : true;
IanBenzMaxim 6:a8c83a2e6fa4 279 }
IanBenzMaxim 6:a8c83a2e6fa4 280
IanBenzMaxim 6:a8c83a2e6fa4 281 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 282 bool operator<(const T & value, const optional<U> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 283 return opt.has_value() ? value < opt.value() : false;
IanBenzMaxim 6:a8c83a2e6fa4 284 }
IanBenzMaxim 6:a8c83a2e6fa4 285
IanBenzMaxim 6:a8c83a2e6fa4 286 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 287 bool operator<=(const optional<T> & opt, const U & value) {
IanBenzMaxim 6:a8c83a2e6fa4 288 return opt.has_value() ? opt.value() <= value : true;
IanBenzMaxim 6:a8c83a2e6fa4 289 }
IanBenzMaxim 6:a8c83a2e6fa4 290
IanBenzMaxim 6:a8c83a2e6fa4 291 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 292 bool operator<=(const T & value, const optional<U> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 293 return opt.has_value() ? value <= opt.value() : false;
IanBenzMaxim 6:a8c83a2e6fa4 294 }
IanBenzMaxim 6:a8c83a2e6fa4 295
IanBenzMaxim 6:a8c83a2e6fa4 296 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 297 bool operator>(const optional<T> & opt, const U & value) {
IanBenzMaxim 6:a8c83a2e6fa4 298 return opt.has_value() ? opt.value() > value : false;
IanBenzMaxim 6:a8c83a2e6fa4 299 }
IanBenzMaxim 6:a8c83a2e6fa4 300
IanBenzMaxim 6:a8c83a2e6fa4 301 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 302 bool operator>(const T & value, const optional<U> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 303 return opt.has_value() ? value > opt.value() : true;
IanBenzMaxim 6:a8c83a2e6fa4 304 }
IanBenzMaxim 6:a8c83a2e6fa4 305
IanBenzMaxim 6:a8c83a2e6fa4 306 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 307 bool operator>=(const optional<T> & opt, const U & value) {
IanBenzMaxim 6:a8c83a2e6fa4 308 return opt.has_value() ? opt.value() >= value : false;
IanBenzMaxim 6:a8c83a2e6fa4 309 }
IanBenzMaxim 6:a8c83a2e6fa4 310
IanBenzMaxim 6:a8c83a2e6fa4 311 template <typename T, typename U>
IanBenzMaxim 6:a8c83a2e6fa4 312 bool operator>=(const T & value, const optional<U> & opt) {
IanBenzMaxim 6:a8c83a2e6fa4 313 return opt.has_value() ? value >= opt.value() : true;
IanBenzMaxim 6:a8c83a2e6fa4 314 }
IanBenzMaxim 6:a8c83a2e6fa4 315
IanBenzMaxim 6:a8c83a2e6fa4 316 } // namespace MaximInterface
IanBenzMaxim 6:a8c83a2e6fa4 317
IanBenzMaxim 6:a8c83a2e6fa4 318 #endif