Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <optional>
7 :
8 : /// @{
9 : /*!
10 : * \ingroup UtilitiesGroup
11 : * \brief Returns `t.has_value()` if `t` is a `std::optional` otherwise returns
12 : * `true`.
13 : */
14 : template <typename T>
15 1 : constexpr bool has_value(const T& /*t*/) {
16 : return true;
17 : }
18 :
19 : template <typename T>
20 1 : constexpr bool has_value(const std::optional<T>& t) {
21 : return t.has_value();
22 : }
23 : /// @}
24 :
25 : /// @{
26 : /*!
27 : * \ingroup UtilitiesGroup
28 : * \brief Returns `t.value()` if `t` is a `std::optional` otherwise returns
29 : * `t`.
30 : */
31 : template <typename T>
32 1 : constexpr T& value(T& t) {
33 : return t;
34 : }
35 :
36 : template <typename T>
37 1 : constexpr const T& value(const T& t) {
38 : return t;
39 : }
40 :
41 : template <typename T>
42 1 : constexpr const T& value(const std::optional<T>& t) {
43 : return t.value();
44 : }
45 :
46 : template <typename T>
47 1 : constexpr T& value(std::optional<T>& t) {
48 : return t.value();
49 : }
50 : /// @}
|