内存优化
This commit is contained in:
@@ -632,6 +632,13 @@ private:
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
template <class Function>
|
template <class Function>
|
||||||
|
decltype(auto) with_all_readable_locked_impl(Function&& function) const {
|
||||||
|
using Schema = type_descriptor_schema_t<Derived>;
|
||||||
|
auto targets = collect_all_static_lock_targets<true>();
|
||||||
|
Static_Read_Guard<Schema::property_count> guard{*this, std::move(targets)};
|
||||||
|
return std::invoke(std::forward<Function>(function), guard);
|
||||||
|
}
|
||||||
|
template <class Function>
|
||||||
void with_all_writable_locked_impl(Function&& function) {
|
void with_all_writable_locked_impl(Function&& function) {
|
||||||
using Schema = type_descriptor_schema_t<Derived>;
|
using Schema = type_descriptor_schema_t<Derived>;
|
||||||
auto targets = collect_all_static_lock_targets<false>();
|
auto targets = collect_all_static_lock_targets<false>();
|
||||||
@@ -777,6 +784,20 @@ public:
|
|||||||
constexpr auto index = schema_member_property_index_v<Schema, Member>;
|
constexpr auto index = schema_member_property_index_v<Schema, Member>;
|
||||||
return read_one<index>();
|
return read_one<index>();
|
||||||
}
|
}
|
||||||
|
template <std::size_t Index, class Function>
|
||||||
|
decltype(auto) with_read_index(Function&& function) const {
|
||||||
|
using Schema = type_descriptor_schema_t<Derived>;
|
||||||
|
static_assert(Index < Schema::property_count);
|
||||||
|
static_assert(Schema::template property_type<Index>::readable);
|
||||||
|
const auto lock_slot = slot(Index);
|
||||||
|
Single_Read_View<Index> view{*this, lock_slot};
|
||||||
|
if constexpr(!uses_real_mutexes)
|
||||||
|
return std::invoke(std::forward<Function>(function), read_unlocked<Index>(view));
|
||||||
|
if (lock_slot == Resolved_Synchronization_View::unsynchronized_slot)
|
||||||
|
return std::invoke(std::forward<Function>(function), read_unlocked<Index>(view));
|
||||||
|
std::shared_lock lock{mutex(lock_slot)};
|
||||||
|
return std::invoke(std::forward<Function>(function), read_unlocked<Index>(view));
|
||||||
|
}
|
||||||
template <Fixed_String Key>
|
template <Fixed_String Key>
|
||||||
auto read() const requires Schema_Readable_Property_Key<type_descriptor_schema_t<Derived>, Key> {
|
auto read() const requires Schema_Readable_Property_Key<type_descriptor_schema_t<Derived>, Key> {
|
||||||
using Schema = type_descriptor_schema_t<Derived>;
|
using Schema = type_descriptor_schema_t<Derived>;
|
||||||
@@ -864,6 +885,10 @@ public:
|
|||||||
for_each_readable_locked_impl(std::forward<Function>(function));
|
for_each_readable_locked_impl(std::forward<Function>(function));
|
||||||
}
|
}
|
||||||
template <class Function>
|
template <class Function>
|
||||||
|
decltype(auto) with_all_readable_locked(Function&& function) const {
|
||||||
|
return with_all_readable_locked_impl(std::forward<Function>(function));
|
||||||
|
}
|
||||||
|
template <class Function>
|
||||||
void with_all_writable_locked(Function&& function) {
|
void with_all_writable_locked(Function&& function) {
|
||||||
with_all_writable_locked_impl(std::forward<Function>(function));
|
with_all_writable_locked_impl(std::forward<Function>(function));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user