//===-- 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 namespace llvm { template 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 struct simplify_type; template struct simplify_type > { typedef const T* SimpleType; static SimpleType getSimplifiedValue(const Optional &Val) { return Val.getPointer(); } }; template struct simplify_type > : public simplify_type > {}; /// \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 void operator==(const Optional &X, const Optional &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 void operator!=(const Optional &X, const Optional &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 void operator<(const Optional &X, const Optional &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 void operator<=(const Optional &X, const Optional &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 void operator>=(const Optional &X, const Optional &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 void operator>(const Optional &X, const Optional &Y); } // end llvm namespace #endif