diff options
Diffstat (limited to 'butl/optional')
-rw-r--r-- | butl/optional | 96 |
1 files changed, 0 insertions, 96 deletions
diff --git a/butl/optional b/butl/optional deleted file mode 100644 index f6cc15e..0000000 --- a/butl/optional +++ /dev/null @@ -1,96 +0,0 @@ -// file : butl/optional -*- C++ -*- -// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd -// license : MIT; see accompanying LICENSE file - -#ifndef BUTL_OPTIONAL -#define BUTL_OPTIONAL - -#include <utility> // move() -#include <functional> // hash - -namespace butl -{ - // Simple optional class template while waiting for std::optional. - // - struct nullopt_t {constexpr explicit nullopt_t (int) {}}; - constexpr const nullopt_t nullopt (1); - - template <typename T> - class optional - { - public: - typedef T value_type; - - constexpr optional (): value_ (), null_ (true) {} // VC14 needs value_(). - constexpr optional (nullopt_t): value_ (), null_ (true) {} - constexpr optional (const T& v): value_ (v), null_ (false) {} - constexpr optional (T&& v): value_ (std::move (v)), null_ (false) {} - - optional& operator= (nullopt_t) {value_ = T (); null_ = true; return *this;} - optional& operator= (const T& v) {value_ = v; null_ = false; return *this;} - optional& operator= (T&& v) {value_ = std::move (v); null_ = false; return *this;} - - T& value () {return value_;} - const T& value () const {return value_;} - - T* operator-> () {return &value_;} - const T* operator-> () const {return &value_;} - - T& operator* () {return value_;} - const T& operator* () const {return value_;} - - bool has_value () const {return !null_;} - explicit operator bool () const {return !null_;} - - private: - T value_; - bool null_; - }; - - template <typename T> - inline auto - operator== (const optional<T>& x, const optional<T>& y) -> decltype (*x == *y) - { - return static_cast<bool> (x) == static_cast<bool> (y) && (!x || *x == *y); - } - - template <typename T> - inline auto - operator!= (const optional<T>& x, const optional<T>& y) -> decltype (x == y) - { - return !(x == y); - } - - template <typename T> - inline auto - operator< (const optional<T>& x, const optional<T>& y) -> decltype (*x < *y) - { - bool px (x), py (y); - return px < py || (px && py && *x < *y); - } - - template <typename T> - inline auto - operator> (const optional<T>& x, const optional<T>& y) -> decltype (*x > *y) - { - return y < x; - } -} - -namespace std -{ - template <typename T> - struct hash<butl::optional<T>>: hash<T> - { - using argument_type = butl::optional<T>; - - size_t - operator() (const butl::optional<T>& o) const - noexcept (noexcept (hash<T> {} (*o))) - { - return o ? hash<T>::operator() (*o) : static_cast<size_t> (-3333); - } - }; -} - -#endif // BUTL_OPTIONAL |