diff --git a/src/KDSpdSetup/details.cpp b/src/KDSpdSetup/details.cpp index 64a4b58..bc50db9 100644 --- a/src/KDSpdSetup/details.cpp +++ b/src/KDSpdSetup/details.cpp @@ -216,4 +216,16 @@ auto genFromWinStr(toml::string &&typeStr) -> spdlog::sink_ptr } #endif +auto genFromRingBufferStr(toml::string &&typeStr, std::size_t const nItems) -> spdlog::sink_ptr +{ + if (typeStr == "ringbuffer_sink_st") { + return createRingBufferSinkStPtr(nItems); + } + if (typeStr == "ringbuffer_sink_mt") { + return createRingBufferSinkMtPtr(nItems); + } + + return nullptr; +} + } // namespace KDSPDSetup::details diff --git a/src/KDSpdSetup/details.h b/src/KDSpdSetup/details.h index eb7b800..9338d27 100644 --- a/src/KDSpdSetup/details.h +++ b/src/KDSpdSetup/details.h @@ -28,6 +28,7 @@ #elif _WIN32 #include #endif +#include #include @@ -93,6 +94,8 @@ static auto const linuxStrs{ std::vector{ "syslog_sink_st", "syslog */ static auto const winStrs{ std::vector{ "msvc_sink_st", "msvc_sink_mt" } }; +static auto const ringBufferStrs{ std::vector{ "ringbuffer_sink_st", "ringbuffer_sink_mt" } }; + /** * @brief A simple map associating strings of `spdlog::level::level_enum` names to the enums themselves. * Used to pass an enum to `spdlog::logger::set_level` given a string read from a TOML table. @@ -312,6 +315,10 @@ class SPDMaps #define createMsvcSinkMtPtr createMsvcSinkPtr #endif +#define createRingBufferSinkStPtr createRingBufferSinkPtr + +#define createRingBufferSinkMtPtr createRingBufferSinkPtr + /** * @brief Returns true if a string `typeStr` is present in a vector `strList`, and false if not. * Used to identify a group to which a sink's `type` belongs when reading from a configuration file. @@ -574,6 +581,12 @@ auto createMsvcSinkPtr() -> std::shared_ptr> } #endif +template +auto createRingBufferSinkPtr(std::size_t const nItems) -> std::shared_ptr> +{ + return std::make_shared>(nItems); +} + /** * @brief Return the result of calling KDSPDSetup::details::createFileSinkPtr with the correct template argument * based on the value of `typeStr`. Uses macros `createFileSinkStPtr` and `createFileSinkMtPtr` for clarity. @@ -651,4 +664,6 @@ auto genFromWinStr(toml::string &&typeStr) -> spdlog::sink_ptr; #endif +auto genFromRingBufferStr(toml::string &&typeStr, const std::size_t nItems) -> spdlog::sink_ptr; + } // namespace KDSPDSetup::details diff --git a/src/KDSpdSetup/setup.cpp b/src/KDSpdSetup/setup.cpp index 605c2b2..239854e 100644 --- a/src/KDSpdSetup/setup.cpp +++ b/src/KDSpdSetup/setup.cpp @@ -48,7 +48,7 @@ void setupSink(toml::table &&sinkTable) auto typeStr = sinkTable.at("type").as_string(); bool ok = false; - for (auto &typeList : { details::fileStrs, details::rotateStrs, details::dailyStrs, details::nullStrs, details::stdStrs, details::linuxStrs, details::winStrs }) { + for (auto &typeList : { details::fileStrs, details::rotateStrs, details::dailyStrs, details::nullStrs, details::stdStrs, details::linuxStrs, details::winStrs, details::ringBufferStrs }) { if (details::inTypelist(typeStr, typeList)) { ok = true; break; @@ -86,6 +86,11 @@ void setupSink(toml::table &&sinkTable) #endif } + else if (details::inTypelist(typeStr, details::ringBufferStrs)) { + auto const nItems = static_cast(sinkTable.at("n_items").as_integer()); + sinkPtr = details::genFromRingBufferStr(std::move(typeStr), nItems); + } + if (level != "") { if (!details::levelMap.contains(level)) throw std::out_of_range("KDSPDSetup: level "s + level.str + " not found"s);