26class AnyMovable
final {
33 AnyMovable& operator=(AnyMovable&&)
noexcept =
default;
37 template <
typename ValueType>
38 requires(!std::is_same_v<AnyMovable, std::decay_t<ValueType>>)
42 template <
typename ValueType,
typename... Args>
43 explicit AnyMovable(std::in_place_type_t<ValueType> tag, Args&&... args);
46 template <
typename ValueType,
typename Item,
typename... Args>
47 explicit AnyMovable(std::in_place_type_t<ValueType> tag, std::initializer_list<Item> list, Args&&... args);
51 template <
typename ValueType>
52 AnyMovable&
operator=(ValueType&& rhs);
61 template <
typename ValueType,
typename... Args>
62 ValueType&
Emplace(Args&&... args) USERVER_IMPL_LIFETIME_BOUND;
65 template <
typename ValueType,
typename Item,
typename... Args>
66 ValueType&
Emplace(std::initializer_list<Item> list, Args&&... args) USERVER_IMPL_LIFETIME_BOUND;
71 template <
typename ValueType>
74 struct HolderDeleter {
78 template <
typename ValueType>
79 friend ValueType*
AnyCast(AnyMovable*)
noexcept;
81 template <
typename ValueType>
82 friend const ValueType*
AnyCast(
const AnyMovable*)
noexcept;
84 std::unique_ptr<
HolderBase, HolderDeleter> content_;
158 : content_(Holder<std::decay_t<ValueType>>::Make(std::forward<ValueType>(value)))
161 !std::is_same_v<AnyMovable*, std::decay_t<ValueType>> &&
162 !std::is_same_v<
const AnyMovable*, std::decay_t<ValueType>>,
163 "AnyMovable misuse detected: trying to wrap AnyMovable* in another "
164 "AnyMovable. The pointer was probably meant to be dereferenced."