Home | History | Annotate | Download | only in optional.comp_with_t
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // UNSUPPORTED: c++98, c++03, c++11, c++14
     11 // <optional>
     12 
     13 // template <class T, class U> constexpr bool operator<=(const optional<T>& x, const U& v);
     14 // template <class T, class U> constexpr bool operator<=(const U& v, const optional<T>& x);
     15 
     16 #include <optional>
     17 
     18 using std::optional;
     19 
     20 struct X {
     21   int i_;
     22 
     23   constexpr X(int i) : i_(i) {}
     24 };
     25 
     26 constexpr bool operator<=(const X& lhs, const X& rhs) {
     27   return lhs.i_ <= rhs.i_;
     28 }
     29 
     30 int main() {
     31   {
     32     typedef X T;
     33     typedef optional<T> O;
     34 
     35     constexpr T val(2);
     36     constexpr O o1;      // disengaged
     37     constexpr O o2{1};   // engaged
     38     constexpr O o3{val}; // engaged
     39 
     40     static_assert((o1 <= T(1)), "");
     41     static_assert((o2 <= T(1)), ""); // equal
     42     static_assert(!(o3 <= T(1)), "");
     43     static_assert((o2 <= val), "");
     44     static_assert((o3 <= val), ""); // equal
     45     static_assert((o3 <= T(3)), "");
     46 
     47     static_assert(!(T(1) <= o1), "");
     48     static_assert((T(1) <= o2), ""); // equal
     49     static_assert((T(1) <= o3), "");
     50     static_assert(!(val <= o2), "");
     51     static_assert((val <= o3), ""); // equal
     52     static_assert(!(T(3) <= o3), "");
     53   }
     54   {
     55     using O = optional<int>;
     56     constexpr O o1(42);
     57     static_assert(o1 <= 42l, "");
     58     static_assert(!(101l <= o1), "");
     59   }
     60   {
     61     using O = optional<const int>;
     62     constexpr O o1(42);
     63     static_assert(o1 <= 42, "");
     64     static_assert(!(101 <= o1), "");
     65   }
     66 }
     67