From b34b2d64de235d0f2fe287be2c0b445cdd343061 Mon Sep 17 00:00:00 2001 From: "Morten V. Pedersen" Date: Mon, 3 Feb 2025 23:14:56 +0100 Subject: [PATCH] WIP --- benchmark/main.cpp | 47 ++++++++++++++++++++++++--------------- src/abacus/enum8.hpp | 17 +++++++++++++- src/abacus/metrics.cpp | 2 +- test/src/test_metrics.cpp | 8 +++---- 4 files changed, 50 insertions(+), 24 deletions(-) diff --git a/benchmark/main.cpp b/benchmark/main.cpp index d0ff73f..9dd2bd7 100644 --- a/benchmark/main.cpp +++ b/benchmark/main.cpp @@ -3,6 +3,14 @@ #include #include +enum class test_enum +{ + value0 = 0, + value1 = 1, + value2 = 2, + value3 = 3 +}; + // Helper function to create metric definitions std::map create_metric_infos() { @@ -17,10 +25,11 @@ std::map create_metric_infos() {abacus::name{"4"}, abacus::boolean{abacus::description{""}}}, {abacus::name{"5"}, abacus::float64{abacus::kind::gauge, abacus::description{""}}}, - {abacus::name{"6"}, - abacus::enum8{ - abacus::description{""}, - {{0, {"", ""}}, {1, {"", ""}}, {2, {"", ""}}, {3, {"", ""}}}}}}; + {abacus::name{"6"}, abacus::enum8{abacus::description{""}, + {{test_enum::value0, {"", ""}}, + {test_enum::value1, {"", ""}}, + {test_enum::value2, {"", ""}}, + {test_enum::value3, {"", ""}}}}}}; } // Benchmark for metric initialization @@ -30,13 +39,14 @@ static void BM_MetricInitialization(benchmark::State& state) for (auto _ : state) { abacus::metrics metrics(create_metric_infos()); - auto m0 = metrics.initialize("0"); - auto m1 = metrics.initialize("1"); - auto m2 = metrics.initialize("2"); - auto m3 = metrics.initialize("3"); - auto m4 = metrics.initialize("4"); - auto m5 = metrics.initialize("5"); - auto m6 = metrics.initialize("6"); + auto m0 = metrics.initialize("0").set_value(false); + auto m1 = metrics.initialize("1").set_value(0); + auto m2 = metrics.initialize("2").set_value(0); + auto m3 = metrics.initialize("3").set_value(0.0); + auto m4 = metrics.initialize("4").set_value(true); + auto m5 = metrics.initialize("5").set_value(3.14); + auto m6 = + metrics.initialize("6").set_value(test_enum::value1); (void)m0; (void)m1; @@ -54,13 +64,14 @@ static void BM_AssignMetrics(benchmark::State& state) { state.SetLabel("Assign Metrics"); abacus::metrics metrics(create_metric_infos()); - auto m0 = metrics.initialize("0"); - auto m1 = metrics.initialize("1"); - auto m2 = metrics.initialize("2"); - auto m3 = metrics.initialize("3"); - auto m4 = metrics.initialize("4"); - auto m5 = metrics.initialize("5"); - auto m6 = metrics.initialize("6"); + auto m0 = metrics.initialize("0").set_value(false); + auto m1 = metrics.initialize("1").set_value(0); + auto m2 = metrics.initialize("2").set_value(0); + auto m3 = metrics.initialize("3").set_value(0.0); + auto m4 = metrics.initialize("4").set_value(true); + auto m5 = metrics.initialize("5").set_value(3.14); + auto m6 = + metrics.initialize("6").set_value(test_enum::value1); for (auto _ : state) { diff --git a/src/abacus/enum8.hpp b/src/abacus/enum8.hpp index a2c022c..ed8a69f 100644 --- a/src/abacus/enum8.hpp +++ b/src/abacus/enum8.hpp @@ -22,6 +22,21 @@ inline namespace STEINWURF_ABACUS_VERSION /// A enumeration metric struct enum8 { + struct enum_value + { + template + enum_value(T v) : value(static_cast(v)) + { + } + + auto operator<(const enum_value& other) const -> bool + { + return value < other.value; + } + + uint8_t value; + }; + /// The primitive type of the metric using type = uint8_t; @@ -39,7 +54,7 @@ struct enum8 abacus::description description; /// The enumeration value information - std::map values; + std::map values; /// The unit of the metric abacus::unit unit{}; diff --git a/src/abacus/metrics.cpp b/src/abacus/metrics.cpp index c4c83fb..20dd3db 100644 --- a/src/abacus/metrics.cpp +++ b/src/abacus/metrics.cpp @@ -242,7 +242,7 @@ metrics::metrics(const std::map& infos) } typed_metric->mutable_values()->insert( - {key, enum_value}); + {key.value, enum_value}); } m_value_bytes += sizeof(enum8::type); diff --git a/test/src/test_metrics.cpp b/test/src/test_metrics.cpp index 95ea41a..b46e727 100644 --- a/test/src/test_metrics.cpp +++ b/test/src/test_metrics.cpp @@ -70,10 +70,10 @@ TEST(test_metrics, api) abacus::unit{"ms"}}}, {abacus::name{name6}, abacus::enum8{abacus::description{"An enum metric"}, - {{0, {"value0", "The value for 0"}}, - {1, {"value1", "The value for 1"}}, - {2, {"value2", "The value for 2"}}, - {3, {"value3", "The value for 3"}}}}}, + {{test_enum::value0, {"value0", "The value for 0"}}, + {test_enum::value1, {"value1", "The value for 1"}}, + {test_enum::value2, {"value2", "The value for 2"}}, + {test_enum::value3, {"value3", "The value for 3"}}}}}, {abacus::name{name7}, abacus::constant{abacus::constant::str{"hello"}, abacus::description{"A string metric"}}}};