内存优化
This commit is contained in:
@@ -302,9 +302,9 @@ public:
|
|||||||
}
|
}
|
||||||
template <class Function>
|
template <class Function>
|
||||||
decltype(auto) read(Function&& function) const requires std::invocable<Function, const T&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, const T&>> {
|
decltype(auto) read(Function&& function) const requires std::invocable<Function, const T&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, const T&>> {
|
||||||
const auto& keys = detail::managed_key_array<T>();
|
return this->with_all_readable_locked([&](const auto&) -> decltype(auto) {
|
||||||
auto guard = this->lock_shared(std::span<const std::string_view>{keys});
|
|
||||||
return std::invoke(std::forward<Function>(function), std::as_const(value_));
|
return std::invoke(std::forward<Function>(function), std::as_const(value_));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
template <class Function>
|
template <class Function>
|
||||||
decltype(auto) write(Function&& function) requires std::invocable<Function, T&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, T&>> {
|
decltype(auto) write(Function&& function) requires std::invocable<Function, T&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, T&>> {
|
||||||
@@ -362,15 +362,12 @@ public:
|
|||||||
explicit Managed_Field(Managed& owner) : owner_(&owner) {}
|
explicit Managed_Field(Managed& owner) : owner_(&owner) {}
|
||||||
template <class Function>
|
template <class Function>
|
||||||
decltype(auto) read(Function&& function) const requires std::invocable<Function, const value_type&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, const value_type&>> {
|
decltype(auto) read(Function&& function) const requires std::invocable<Function, const value_type&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, const value_type&>> {
|
||||||
if constexpr(detail::managed_path_requires_synchronization<Root, Root_Index, Members...>()) {
|
return owner_->template with_read_index<Root_Index>([&](const auto& root_value) -> decltype(auto) {
|
||||||
const auto key = detail::Managed_Key_Attribute<Root_Index>::value.view();
|
if constexpr(sizeof...(Members) == 0)
|
||||||
auto guard = owner_->lock_shared({key});
|
return std::invoke(std::forward<Function>(function), root_value);
|
||||||
const auto& value = detail::managed_path_value<Root, Root_Index, Members...>(owner_->unsafe_value());
|
else
|
||||||
return std::invoke(std::forward<Function>(function), value);
|
return std::invoke(std::forward<Function>(function), detail::path_value<decltype(root_value), Members...>(root_value));
|
||||||
} else {
|
});
|
||||||
const auto& value = detail::managed_path_value<Root, Root_Index, Members...>(owner_->unsafe_value());
|
|
||||||
return std::invoke(std::forward<Function>(function), value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
template <class Function>
|
template <class Function>
|
||||||
decltype(auto) write(Function&& function) requires (!std::is_const_v<Managed>) && (detail::managed_path_writable<Root, Root_Index, Members...>()) && std::invocable<Function, value_type&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, value_type&>> {
|
decltype(auto) write(Function&& function) requires (!std::is_const_v<Managed>) && (detail::managed_path_writable<Root, Root_Index, Members...>()) && std::invocable<Function, value_type&> && detail::Managed_Callback_Result<std::invoke_result_t<Function, value_type&>> {
|
||||||
|
|||||||
Reference in New Issue
Block a user