| //===-- Optional.h - Simple variant for passing optional values ---*- C++ -*-=// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file provides Optional, a template class modeled in the spirit of | |
| // OCaml's 'opt' variant. The idea is to strongly type whether or not | |
| // a value can be optional. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_ADT_OPTIONAL | |
| #define LLVM_ADT_OPTIONAL | |
| #include <cassert> | |
| namespace llvm { | |
| template<typename T> | |
| class Optional { | |
| T x; | |
| unsigned hasVal : 1; | |
| public: | |
| explicit Optional() : x(), hasVal(false) {} | |
| Optional(const T &y) : x(y), hasVal(true) {} | |
| static inline Optional create(const T* y) { | |
| return y ? Optional(*y) : Optional(); | |
| } | |
| Optional &operator=(const T &y) { | |
| x = y; | |
| hasVal = true; | |
| return *this; | |
| } | |
| const T* getPointer() const { assert(hasVal); return &x; } | |
| const T& getValue() const { assert(hasVal); return x; } | |
| operator bool() const { return hasVal; } | |
| bool hasValue() const { return hasVal; } | |
| const T* operator->() const { return getPointer(); } | |
| const T& operator*() const { assert(hasVal); return x; } | |
| }; | |
| template<typename T> struct simplify_type; | |
| template <typename T> | |
| struct simplify_type<const Optional<T> > { | |
| typedef const T* SimpleType; | |
| static SimpleType getSimplifiedValue(const Optional<T> &Val) { | |
| return Val.getPointer(); | |
| } | |
| }; | |
| template <typename T> | |
| struct simplify_type<Optional<T> > | |
| : public simplify_type<const Optional<T> > {}; | |
| /// \brief Poison comparison between two \c Optional objects. Clients needs to | |
| /// explicitly compare the underlying values and account for empty \c Optional | |
| /// objects. | |
| /// | |
| /// This routine will never be defined. It returns \c void to help diagnose | |
| /// errors at compile time. | |
| template<typename T, typename U> | |
| void operator==(const Optional<T> &X, const Optional<U> &Y); | |
| /// \brief Poison comparison between two \c Optional objects. Clients needs to | |
| /// explicitly compare the underlying values and account for empty \c Optional | |
| /// objects. | |
| /// | |
| /// This routine will never be defined. It returns \c void to help diagnose | |
| /// errors at compile time. | |
| template<typename T, typename U> | |
| void operator!=(const Optional<T> &X, const Optional<U> &Y); | |
| /// \brief Poison comparison between two \c Optional objects. Clients needs to | |
| /// explicitly compare the underlying values and account for empty \c Optional | |
| /// objects. | |
| /// | |
| /// This routine will never be defined. It returns \c void to help diagnose | |
| /// errors at compile time. | |
| template<typename T, typename U> | |
| void operator<(const Optional<T> &X, const Optional<U> &Y); | |
| /// \brief Poison comparison between two \c Optional objects. Clients needs to | |
| /// explicitly compare the underlying values and account for empty \c Optional | |
| /// objects. | |
| /// | |
| /// This routine will never be defined. It returns \c void to help diagnose | |
| /// errors at compile time. | |
| template<typename T, typename U> | |
| void operator<=(const Optional<T> &X, const Optional<U> &Y); | |
| /// \brief Poison comparison between two \c Optional objects. Clients needs to | |
| /// explicitly compare the underlying values and account for empty \c Optional | |
| /// objects. | |
| /// | |
| /// This routine will never be defined. It returns \c void to help diagnose | |
| /// errors at compile time. | |
| template<typename T, typename U> | |
| void operator>=(const Optional<T> &X, const Optional<U> &Y); | |
| /// \brief Poison comparison between two \c Optional objects. Clients needs to | |
| /// explicitly compare the underlying values and account for empty \c Optional | |
| /// objects. | |
| /// | |
| /// This routine will never be defined. It returns \c void to help diagnose | |
| /// errors at compile time. | |
| template<typename T, typename U> | |
| void operator>(const Optional<T> &X, const Optional<U> &Y); | |
| } // end llvm namespace | |
| #endif |