This commit is contained in:
2026-08-09 22:47:14 +08:00
parent a058242536
commit 5054ceb2c8
19 changed files with 364 additions and 339 deletions
+23 -1
View File
@@ -2,6 +2,8 @@
#include "adminive/http.hpp"
#include <atomic>
#include "adminive_test.hpp"
#include <functional>
#include <span>
#include <string>
#include <thread>
#include <tuple>
@@ -50,6 +52,22 @@ concept Reference_Escaping_Read = requires(Field field) {
return value;
});
};
template <class Field>
concept Pointer_Escaping_Read = requires(Field field) {
field.read([](const auto& value) { return &value; });
};
template <class Field>
concept Wrapper_Escaping_Read = requires(Field field) {
field.read([](const auto& value) { return std::cref(value); });
};
template <class Field>
concept View_Escaping_Read = requires(Field field) {
field.read([](const auto& value) { return std::span{&value, std::size_t{1}}; });
};
template <class Field>
concept Reference_Escaping_Write = requires(Field field) {
field.write([](auto& value) -> auto& { return value; });
};
}
namespace adminive {
template <>
@@ -87,6 +105,10 @@ int main() {
static_assert(Writable_Field<decltype(backend)>);
static_assert(Writable_Field<decltype(unsynchronized)>);
static_assert(!Reference_Escaping_Read<decltype(immutable)>);
static_assert(!Pointer_Escaping_Read<decltype(immutable)>);
static_assert(!Wrapper_Escaping_Read<decltype(immutable)>);
static_assert(!View_Escaping_Read<decltype(immutable)>);
static_assert(!Reference_Escaping_Write<decltype(editable)>);
const auto resolved = guarded.resolved_synchronization();
ADMINIVE_CHECK(resolved.lock_count == 2);
ADMINIVE_CHECK(resolved.slot(0) != structive::Resolved_Synchronization_View::unsynchronized_slot);
@@ -122,7 +144,7 @@ int main() {
ADMINIVE_CHECK(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 0);
ADMINIVE_CHECK(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
const auto descriptor = adminive::to_descriptor_json<Json, Section_Config>();
ADMINIVE_CHECK(descriptor.at("protocol_version") == 5);
ADMINIVE_CHECK(descriptor.at("protocol_version") == adminive::resource_protocol_version);
ADMINIVE_CHECK(!descriptor.at("fields").at(0).contains("lock_mode"));
ADMINIVE_CHECK(descriptor.at("fields").at(0).at("writable") == true);
ADMINIVE_CHECK(descriptor.at("fields").at(0).at("synchronized") == true);