1 #ifndef SILICIUM_OPTIONAL_HPP
2 #define SILICIUM_OPTIONAL_HPP
9 #include <boost/static_assert.hpp>
10 #include <boost/functional/hash.hpp>
27 static none_t BOOST_CONSTEXPR_OR_CONST none;
36 static some_t BOOST_CONSTEXPR_OR_CONST some;
52 : m_is_set(other.m_is_set)
61 : m_is_set(other.m_is_set)
65 new (data())T(*other);
78 new (data()) T(value);
81 template <
class ...Args>
85 new (data()) T(std::forward<Args>(args)...);
144 new (data()) T(*other);
163 new (data()) T(value);
193 explicit operator bool() const BOOST_NOEXCEPT
204 #if !SILICIUM_COMPILER_HAS_RVALUE_THIS_QUALIFIER
253 template <
class ...Args>
257 new (data()) T{std::forward<Args>(args)...};
268 typename std::aligned_storage<sizeof(T), alignment>::type m_storage;
271 T *data() BOOST_NOEXCEPT
273 return reinterpret_cast<T *
>(&m_storage);
276 T
const *data()
const BOOST_NOEXCEPT
278 return reinterpret_cast<T
const *
>(&m_storage);
313 return m_data ==
nullptr;
319 T &operator * () BOOST_NOEXCEPT
363 return (*left == *right);
365 return !left == !right;
374 return (*left == right);
383 return (right == left);
404 return !(left == right);
409 bool operator < (optional<T>
const &left,
optional<T> const &right)
415 return (*left < *right);
449 std::ostream &operator << (std::ostream &out, optional<T>
const &value)
477 BOOST_STATIC_ASSERT(
sizeof(optional<char *>) == (alignment_of<char *>::value +
sizeof(
char *)));
484 struct hash<
Si::optional<T>>
std::remove_reference< T >::type && move(T &&ref)
Definition: move.hpp:10
optional & operator=(optional &&other) BOOST_NOEXCEPT
Definition: optional.hpp:97
BOOST_STATIC_ASSERT(Si::is_handle< absolute_path >::value)
SILICIUM_USE_RESULT bool operator!() const BOOST_NOEXCEPT
Definition: optional.hpp:199
optional(T const &value)
Definition: optional.hpp:75
T * operator->() BOOST_NOEXCEPT
Definition: optional.hpp:241
std::ostream & operator<<(std::ostream &out, absolute_path const &p)
Definition: absolute_path.hpp:144
optional(T &data) BOOST_NOEXCEPT
Definition: optional.hpp:290
Definition: optional.hpp:25
Definition: absolute_path.hpp:352
#define SILICIUM_EXPLICIT_OPERATOR_BOOL()
Definition: explicit_operator_bool.hpp:17
Definition: absolute_path.hpp:19
SILICIUM_USE_RESULT T & operator*() BOOST_NOEXCEPT
Definition: optional.hpp:206
Definition: optional.hpp:39
Definition: optional.hpp:15
optional(optional &&other) BOOST_NOEXCEPT
Definition: optional.hpp:51
optional(none_t) BOOST_NOEXCEPT
Definition: optional.hpp:46
optional(T &&value) BOOST_NOEXCEPT
Definition: optional.hpp:69
optional() BOOST_NOEXCEPT
Definition: optional.hpp:285
optional(none_t) BOOST_NOEXCEPT
Definition: optional.hpp:300
~optional() BOOST_NOEXCEPT
Definition: optional.hpp:88
void emplace(Args &&...args)
Definition: optional.hpp:254
SILICIUM_USE_RESULT std::size_t operator()(Si::optional< T > const &value) const
Definition: optional.hpp:487
SILICIUM_USE_RESULT bool operator==(absolute_path const &left, ComparableToPath const &right)
Definition: absolute_path.hpp:169
void emplace(T &data) BOOST_NOEXCEPT
Definition: optional.hpp:305
optional() BOOST_NOEXCEPT
Definition: optional.hpp:41
SILICIUM_USE_RESULT Si::optional< typename std::decay< T >::type > make_optional(T &&value)
Definition: optional.hpp:437
optional(some_t, T &data) BOOST_NOEXCEPT
Definition: optional.hpp:295
optional(some_t, Args &&...args)
Definition: optional.hpp:82
SILICIUM_USE_RESULT std::size_t hash_value(absolute_path const &value)
Definition: absolute_path.hpp:220
SILICIUM_USE_RESULT bool operator!=(absolute_path const &left, ComparableToPath const &right)
Definition: absolute_path.hpp:201
SILICIUM_USE_RESULT std::size_t hash_value(optional< T > const &value)
Definition: optional.hpp:464
optional(optional const &other)
Definition: optional.hpp:60
#define SILICIUM_USE_RESULT
Definition: config.hpp:147
Definition: optional.hpp:34