#include <type_traits>
#include <utility>
-#include <folly/Launder.h>
+#include <folly/Portability.h>
#include <folly/Traits.h>
#include <folly/Utility.h>
+#include <folly/lang/Launder.h>
/**
* An instance of `Replaceable<T>` wraps an instance of `T`.
std::is_constructible<T, const Replaceable<T>&>::value ||
std::is_constructible<T, const Replaceable<T>&&>::value> {};
-template <typename T>
-constexpr bool is_constructible_from_replaceable_v{
- is_constructible_from_replaceable<T>::value};
-
template <typename T>
struct is_convertible_from_replaceable
: std::integral_constant<
std::is_convertible<Replaceable<T>&&, T>::value ||
std::is_convertible<const Replaceable<T>&, T>::value ||
std::is_convertible<const Replaceable<T>&&, T>::value> {};
-
-template <typename T>
-constexpr bool is_convertible_from_replaceable_v{
- is_convertible_from_replaceable<T>::value};
} // namespace replaceable_detail
// Type trait template to statically test whether a type is a specialization of
template <class T>
struct is_replaceable<Replaceable<T>> : std::true_type {};
-template <class T>
-constexpr bool is_replaceable_v{is_replaceable<T>::value};
-
// Function to make a Replaceable with a type deduced from its input
template <class T>
constexpr Replaceable<std::decay_t<T>> make_replaceable(T&& t) {
template <
class... Args,
std::enable_if_t<std::is_constructible<T, Args&&...>::value, int> = 0>
- constexpr explicit Replaceable(in_place_t, Args&&... args)
+ FOLLY_CPP14_CONSTEXPR explicit Replaceable(in_place_t, Args&&... args)
// clang-format off
noexcept(std::is_nothrow_constructible<T, Args&&...>::value)
// clang-format on
std::enable_if_t<
std::is_constructible<T, std::initializer_list<U>, Args&&...>::value,
int> = 0>
- constexpr explicit Replaceable(
+ FOLLY_CPP14_CONSTEXPR explicit Replaceable(
in_place_t,
std::initializer_list<U> il,
Args&&... args)
!std::is_same<Replaceable<T>, std::decay_t<U>>::value &&
std::is_convertible<U&&, T>::value,
int> = 0>
- constexpr /* implicit */ Replaceable(U&& other)
+ FOLLY_CPP14_CONSTEXPR /* implicit */ Replaceable(U&& other)
// clang-format off
noexcept(std::is_nothrow_constructible<T, U&&>::value)
// clang-format on
!std::is_same<Replaceable<T>, std::decay_t<U>>::value &&
!std::is_convertible<U&&, T>::value,
int> = 0>
- explicit constexpr Replaceable(U&& other)
+ FOLLY_CPP14_CONSTEXPR explicit Replaceable(U&& other)
// clang-format off
noexcept(std::is_nothrow_constructible<T, U&&>::value)
// clang-format on
class U,
std::enable_if_t<
std::is_constructible<T, const U&>::value &&
- !replaceable_detail::is_constructible_from_replaceable_v<T> &&
- !replaceable_detail::is_convertible_from_replaceable_v<T> &&
+ !replaceable_detail::is_constructible_from_replaceable<
+ T>::value &&
+ !replaceable_detail::is_convertible_from_replaceable<T>::value &&
std::is_convertible<const U&, T>::value,
int> = 0>
/* implicit */ Replaceable(const Replaceable<U>& other)
class U,
std::enable_if_t<
std::is_constructible<T, const U&>::value &&
- !replaceable_detail::is_constructible_from_replaceable_v<T> &&
- !replaceable_detail::is_convertible_from_replaceable_v<T> &&
+ !replaceable_detail::is_constructible_from_replaceable<
+ T>::value &&
+ !replaceable_detail::is_convertible_from_replaceable<T>::value &&
!std::is_convertible<const U&, T>::value,
int> = 0>
explicit Replaceable(const Replaceable<U>& other)
class U,
std::enable_if_t<
std::is_constructible<T, U&&>::value &&
- !replaceable_detail::is_constructible_from_replaceable_v<T> &&
- !replaceable_detail::is_convertible_from_replaceable_v<T> &&
+ !replaceable_detail::is_constructible_from_replaceable<
+ T>::value &&
+ !replaceable_detail::is_convertible_from_replaceable<T>::value &&
std::is_convertible<U&&, T>::value,
int> = 0>
/* implicit */ Replaceable(Replaceable<U>&& other)
class U,
std::enable_if_t<
std::is_constructible<T, U&&>::value &&
- !replaceable_detail::is_constructible_from_replaceable_v<T> &&
- !replaceable_detail::is_convertible_from_replaceable_v<T> &&
+ !replaceable_detail::is_constructible_from_replaceable<
+ T>::value &&
+ !replaceable_detail::is_convertible_from_replaceable<T>::value &&
!std::is_convertible<U&&, T>::value,
int> = 0>
explicit Replaceable(Replaceable<U>&& other)
return launder(reinterpret_cast<T const*>(storage_));
}
- constexpr T* operator->() {
+ FOLLY_CPP14_CONSTEXPR T* operator->() {
return launder(reinterpret_cast<T*>(storage_));
}
return *launder(reinterpret_cast<T const*>(storage_));
}
- constexpr T& operator*() & {
+ FOLLY_CPP14_CONSTEXPR T& operator*() & {
return *launder(reinterpret_cast<T*>(storage_));
}
- constexpr T&& operator*() && {
+ FOLLY_CPP14_CONSTEXPR T&& operator*() && {
return std::move(*launder(reinterpret_cast<T*>(storage_)));
}