#include #include #include #include using namespace structive; #define REQUIRE(expression) do { if (!(expression)) { std::fprintf(stderr, "REQUIRE failed: %s:%d: %s\n", __FILE__, __LINE__, #expression); std::abort(); } } while (false) struct Device : Property_Object { int temperature{20}; int pressure{100}; }; template <> struct structive::Type_Descriptor { static auto get() { return object( defaults(presentation::group<"Environment">), field<&Device::temperature>(key<"temperature">, presentation::label<"Temperature">, presentation::description<"Current temperature">, presentation::order<2>), field<&Device::pressure>(key<"pressure">, presentation::group<"Pressure">) ); } }; int main() { Device device; const auto& temperature = device.schema().property<&Device::temperature>(); static_assert(std::remove_cvref_t::template has_attribute); auto temperature_info = presentation::describe<&Device::temperature>(device.schema()); auto pressure_info = presentation::describe<&Device::pressure>(device.schema()); auto pressure_by_index = presentation::describe<1>(device.schema()); REQUIRE(temperature_info.label == "Temperature"); REQUIRE(temperature_info.description == "Current temperature"); REQUIRE(temperature_info.group == "Environment"); REQUIRE(temperature_info.order == 2); REQUIRE(temperature_info.has_order); REQUIRE(pressure_info.label == "pressure"); REQUIRE(pressure_info.group == "Pressure"); REQUIRE(!pressure_info.has_order); REQUIRE(pressure_by_index.key == "pressure"); REQUIRE(pressure_by_index.group == "Pressure"); return 0; }