diff --git a/proxy.h b/proxy.h index 7e671380..87f00b96 100644 --- a/proxy.h +++ b/proxy.h @@ -4,6 +4,7 @@ #ifndef _MSFT_PROXY_ #define _MSFT_PROXY_ +#include #include #include #include @@ -174,52 +175,53 @@ R invoke_dispatch(Args&&... args) { } } template -R invocation_dispatcher_ref(const char* self, Args... args) +R invocation_dispatcher_ref(const std::byte* self, Args... args) noexcept(is_invoker_well_formed< F, typename ptr_traits

::target_type, true, R, Args...>()) { return invoke_dispatch(ptr_traits

::dereference(*std::launder( reinterpret_cast(self))), std::forward(args)...); } template -R invocation_dispatcher_ptr(const char* self, Args... args) +R invocation_dispatcher_ptr(const std::byte* self, Args... args) noexcept(is_invoker_well_formed()) { return invoke_dispatch(*std::launder(reinterpret_cast(self)), std::forward(args)...); } template -R invocation_dispatcher_void(const char*, Args... args) +R invocation_dispatcher_void(const std::byte*, Args... args) noexcept(is_invoker_well_formed()) { return invoke_dispatch(std::forward(args)...); } template -void copying_dispatcher(char* self, const char* rhs) +void copying_dispatcher(std::byte* self, const std::byte* rhs) noexcept(has_copyability

(constraint_level::nothrow)) { std::construct_at(reinterpret_cast(self), *std::launder(reinterpret_cast(rhs))); } template -void copying_default_dispatcher(char* self, const char* rhs) noexcept { +void copying_default_dispatcher(std::byte* self, const std::byte* rhs) + noexcept { std::uninitialized_copy_n( std::assume_aligned(rhs), Len, std::assume_aligned(self)); } template -void relocation_dispatcher(char* self, const char* rhs) +void relocation_dispatcher(std::byte* self, const std::byte* rhs) noexcept(has_relocatability

(constraint_level::nothrow)) { - P* other = std::launder(reinterpret_cast(const_cast(rhs))); + P* other = std::launder(reinterpret_cast(const_cast(rhs))); std::construct_at(reinterpret_cast(self), std::move(*other)); std::destroy_at(other); } template -void destruction_dispatcher(char* self) +void destruction_dispatcher(std::byte* self) noexcept(has_destructibility

(constraint_level::nothrow)) { std::destroy_at(std::launder(reinterpret_cast(self))); } -inline void destruction_default_dispatcher(char*) noexcept {} +inline void destruction_default_dispatcher(std::byte*) noexcept {} template struct overload_traits_impl : applicable_traits { template struct meta_provider { template - static constexpr func_ptr_t get() { + static constexpr func_ptr_t get() { if constexpr (invocable_dispatch< D, typename ptr_traits

::target_type, NE, R, Args...>) { return &invocation_dispatcher_ref : instantiated_t< template struct copyability_meta_provider { template - static constexpr func_ptr_t get() { + static constexpr func_ptr_t get() { if constexpr (has_copyability

(constraint_level::trivial)) { return ©ing_default_dispatcher; } else { @@ -325,7 +327,7 @@ struct copyability_meta_provider { template struct relocatability_meta_provider { template - static constexpr func_ptr_t get() { + static constexpr func_ptr_t get() { if constexpr (has_relocatability

(constraint_level::trivial)) { return ©ing_default_dispatcher; } else { @@ -336,7 +338,7 @@ struct relocatability_meta_provider { template struct destructibility_meta_provider { template - static constexpr func_ptr_t get() { + static constexpr func_ptr_t get() { if constexpr (has_destructibility

(constraint_level::trivial)) { return &destruction_default_dispatcher; } else { @@ -685,7 +687,7 @@ class proxy : public details::facade_traits::base { } details::meta_ptr meta_; - alignas(F::constraints.max_align) char ptr_[F::constraints.max_size]; + alignas(F::constraints.max_align) std::byte ptr_[F::constraints.max_size]; }; constexpr proxiable_ptr_constraints relocatable_ptr_constraints{