零开销抽象

This commit is contained in:
2026-08-07 16:51:40 +08:00
parent 1e903dfe1e
commit 1ddd2799f2
8 changed files with 164 additions and 46 deletions
+34
View File
@@ -74,6 +74,25 @@ struct structive::Type_Descriptor<Non_Copyable_Device> {
);
}
};
struct Lockless_Device : Property_Object<Lockless_Device, No_Lock_Policy> {
Lockless_Device() = default;
explicit Lockless_Device(Property_Synchronization synchronization) : Property_Object(std::move(synchronization)) {}
int left{1};
int right{2};
};
template <>
struct structive::Type_Descriptor<Lockless_Device> {
static auto get() {
return object<Lockless_Device>(
synchronization(sync_all_independent, sync_group("sum", "left", "right", "sum")),
field < &Lockless_Device::left > (key < "left" >),
field < &Lockless_Device::right > (key < "right" >),
computed_property<Lockless_Device, int>([](const auto& view) {
return view.template get<&Lockless_Device::left>() + view.template get<&Lockless_Device::right>();
}, key < "sum" >)
);
}
};
template <class View>
concept Has_Write_Temperature = requires(View view) {
view.template write<&Device::temperature>(1);
@@ -124,6 +143,14 @@ int main() {
REQUIRE(shared_device.lock_slot<&Device::pressure>() == shared_device.lock_slot<&Device::min_speed>());
Device grouped_device{property_synchronization<Device>(synchronization(sync_all_independent, sync_group < &Device::temperature, &Device::pressure > ("environment")))};
REQUIRE(grouped_device.lock_slot<&Device::temperature>() == grouped_device.lock_slot<&Device::pressure>());
Device shared_copy{shared_device};
REQUIRE(shared_copy.lock_slot<&Device::temperature>() == shared_copy.lock_slot<&Device::pressure>());
Device shared_move{std::move(shared_copy)};
REQUIRE(shared_move.lock_slot<&Device::temperature>() == shared_move.lock_slot<&Device::pressure>());
Device assignment_target;
auto assignment_target_slot = assignment_target.lock_slot<&Device::pressure>();
assignment_target = shared_device;
REQUIRE(assignment_target.lock_slot<&Device::pressure>() == assignment_target_slot);
device.external().write < &Device::temperature > (30);
REQUIRE(device.external().read<&Device::temperature>() == 30);
device.persistence().load < &Device::pressure > (101);
@@ -151,6 +178,13 @@ int main() {
REQUIRE(computed.external().read_key<"speed_span">() == 90);
computed.write < &Computed_Device::min_speed > (20);
REQUIRE(computed.external().read_key<"speed_span">() == 80);
Lockless_Device lockless;
REQUIRE(lockless.read<&Lockless_Device::left>() == 1);
lockless.write < &Lockless_Device::right > (4);
REQUIRE(lockless.read_key<"sum">() == 5);
auto lockless_guard = lockless.lock_shared<&Lockless_Device::left, &Lockless_Device::right>();
REQUIRE(lockless_guard.get<&Lockless_Device::left>() == 1);
REQUIRE(lockless_guard.get<&Lockless_Device::right>() == 4);
Non_Copyable_Device non_copyable;
bool non_copyable_visited = false;
non_copyable.external().for_each_readable_locked([&](auto, const auto&, const auto& value) {