// file : butl/optional -*- C++ -*- // copyright : Copyright (c) 2014-2015 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef BUTL_OPTIONAL #define BUTL_OPTIONAL namespace butl { // Simple optional class template while waiting for std::optional. // struct nullopt_t {constexpr nullopt_t (int) {}}; constexpr nullopt_t nullopt = 1; template class optional { public: typedef T value_type; optional (): null_ (true) {} optional (nullopt_t): null_ (true) {} optional (const T& v): value_ (v), null_ (false) {} optional& operator= (nullopt_t) {value_ = T (); null_ = true; return *this;} optional& operator= (const T& v) {value_ = 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_;} explicit operator bool () const {return !null_;} private: T value_; bool null_; }; } #endif // BUTL_OPTIONAL