Lines Matching defs:_Tp
44 template <class _Tp>
47 move_constructible<_Tp>
49 copy_constructible<_Tp>
51 && is_object_v<_Tp>;
55 template <__movable_box_object _Tp>
57 _LIBCPP_NO_UNIQUE_ADDRESS optional<_Tp> __val_;
61 requires is_constructible_v<_Tp, _Args...>
63 is_nothrow_constructible_v<_Tp, _Args...>)
66 _LIBCPP_HIDE_FROM_ABI constexpr __movable_box() noexcept(is_nothrow_default_constructible_v<_Tp>)
67 requires default_initializable<_Tp>
74 operator=(__movable_box const& __other) noexcept(is_nothrow_copy_constructible_v<_Tp>)
76 requires copy_constructible<_Tp>
89 requires movable<_Tp>
93 operator=(__movable_box&& __other) noexcept(is_nothrow_move_constructible_v<_Tp>) {
103 _LIBCPP_HIDE_FROM_ABI constexpr _Tp const& operator*() const noexcept { return *__val_; }
104 _LIBCPP_HIDE_FROM_ABI constexpr _Tp& operator*() noexcept { return *__val_; }
106 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* operator->() const noexcept { return __val_.operator->(); }
107 _LIBCPP_HIDE_FROM_ABI constexpr _Tp* operator->() noexcept { return __val_.operator->(); }
126 template <class _Tp>
128 (copy_constructible<_Tp>
131 ? copyable<_Tp> || (is_nothrow_move_constructible_v<_Tp> && is_nothrow_copy_constructible_v<_Tp>)
134 : movable<_Tp> || is_nothrow_move_constructible_v<_Tp>);
136 // When _Tp doesn't have an assignment operator, we must implement __movable_box's assignment operator
138 // _Tp is potentially overlapping, as it is doing a non-transparent replacement of the sub-object, which means that
144 // Hence, when the _Tp doesn't have an assignment operator, we can't risk making it a potentially-overlapping
146 template <class _Tp>
147 concept __can_use_no_unique_address = (copy_constructible<_Tp> ? copyable<_Tp> : movable<_Tp>);
151 template <class _Tp>
152 concept __doesnt_need_empty_state_for_copy = copyable<_Tp> || is_nothrow_copy_constructible_v<_Tp>;
154 template <class _Tp>
155 concept __doesnt_need_empty_state_for_move = movable<_Tp> || is_nothrow_move_constructible_v<_Tp>;
157 template <class _Tp>
158 concept __doesnt_need_empty_state = __doesnt_need_empty_state_for_copy<_Tp> && __doesnt_need_empty_state_for_move<_Tp>;
160 template <class _Tp>
161 concept __can_use_no_unique_address = copyable<_Tp>;
164 template <class _Tp>
166 _Tp __val_;
173 template <class _Tp>
174 requires __can_use_no_unique_address<_Tp>
175 struct __movable_box_holder<_Tp> {
176 _LIBCPP_NO_UNIQUE_ADDRESS _Tp __val_;
183 template <__movable_box_object _Tp>
184 requires __doesnt_need_empty_state<_Tp>
185 class __movable_box<_Tp> {
186 _LIBCPP_NO_UNIQUE_ADDRESS __movable_box_holder<_Tp> __holder_;
190 requires is_constructible_v<_Tp, _Args...>
192 is_nothrow_constructible_v<_Tp, _Args...>)
195 _LIBCPP_HIDE_FROM_ABI constexpr __movable_box() noexcept(is_nothrow_default_constructible_v<_Tp>)
196 requires default_initializable<_Tp>
204 requires copyable<_Tp>
207 requires movable<_Tp>
212 static_assert(is_nothrow_copy_constructible_v<_Tp>);
213 static_assert(!__can_use_no_unique_address<_Tp>);
222 static_assert(is_nothrow_move_constructible_v<_Tp>);
223 static_assert(!__can_use_no_unique_address<_Tp>);
231 _LIBCPP_HIDE_FROM_ABI constexpr _Tp const& operator*() const noexcept { return __holder_.__val_; }
232 _LIBCPP_HIDE_FROM_ABI constexpr _Tp& operator*() noexcept { return __holder_.__val_; }
234 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* operator->() const noexcept { return std::addressof(__holder_.__val_); }
235 _LIBCPP_HIDE_FROM_ABI constexpr _Tp* operator->() noexcept { return std::addressof(__holder_.__val_); }