| 125 | // --------------------------------------------------------------------------------------------------- |
| 126 | |
| 127 | void test_optional_int() |
| 128 | { |
| 129 | dlib::optional<int> o1; |
| 130 | DLIB_TEST(!o1); |
| 131 | DLIB_TEST(!o1.has_value()); |
| 132 | DLIB_TEST(o1.value_or(2) == 2); |
| 133 | int throw_counter{0}; |
| 134 | try { |
| 135 | o1.value(); |
| 136 | } catch(const std::exception& e) { |
| 137 | throw_counter++; |
| 138 | } |
| 139 | DLIB_TEST(throw_counter == 1); |
| 140 | DLIB_TEST(o1 == dlib::nullopt); |
| 141 | |
| 142 | dlib::optional<int> o2 = dlib::nullopt; |
| 143 | static_assert(noexcept(o2 = dlib::nullopt), "bad"); |
| 144 | DLIB_TEST(!o2); |
| 145 | DLIB_TEST(!o2.has_value()); |
| 146 | DLIB_TEST(o2.value_or(3) == 3); |
| 147 | |
| 148 | dlib::optional<int> o3 = 42; |
| 149 | DLIB_TEST(*o3 == 42); |
| 150 | DLIB_TEST(o3.value() == 42); |
| 151 | DLIB_TEST(o3.value_or(3) == 42); |
| 152 | DLIB_TEST(o3 == 42); |
| 153 | DLIB_TEST(42 == o3); |
| 154 | |
| 155 | dlib::optional<int> o4 = o3; |
| 156 | static_assert(noexcept(o4 = o3), "bad"); |
| 157 | DLIB_TEST(*o3 == 42); |
| 158 | DLIB_TEST(*o4 == 42); |
| 159 | DLIB_TEST(o4 == 42); |
| 160 | DLIB_TEST(42 == o4); |
| 161 | DLIB_TEST(o4.value() == 42); |
| 162 | |
| 163 | dlib::optional<int> o5 = o1; |
| 164 | static_assert(noexcept(o5 = o1), "bad"); |
| 165 | DLIB_TEST(!o1); |
| 166 | DLIB_TEST(!o5); |
| 167 | DLIB_TEST(!o5.has_value()); |
| 168 | |
| 169 | dlib::optional<int> o6 = std::move(o3); |
| 170 | static_assert(noexcept(o6 = std::move(o3)), "bad"); |
| 171 | DLIB_TEST(*o6 == 42); |
| 172 | DLIB_TEST(o6.value() == 42); |
| 173 | |
| 174 | dlib::optional<short> o7 = (short)42; |
| 175 | static_assert(noexcept(o7 = (short)42), "bad"); |
| 176 | DLIB_TEST(*o7 == 42); |
| 177 | |
| 178 | dlib::optional<int> o8 = o7; |
| 179 | DLIB_TEST(*o7 == 42); |
| 180 | DLIB_TEST(*o8 == 42); |
| 181 | |
| 182 | dlib::optional<int> o9 = std::move(o7); |
| 183 | DLIB_TEST(*o9 == 42); |
| 184 | |