From 8e657df097e39a506cd889d0aeaa1ac74ee98d32 Mon Sep 17 00:00:00 2001 From: Bart Beumer Date: Sun, 27 Jul 2025 09:42:05 +0000 Subject: [PATCH] WIP --- src/CMakeLists.txt | 3 ++ src/awesome_log/CMakeLists.txt | 21 ++++++++++++ .../include/awesome_log/console_writer.hpp | 14 ++++++++ src/awesome_log/include/awesome_log/log.hpp | 12 +++++++ .../include/awesome_log/null_writer.hpp | 14 ++++++++ .../include/awesome_log/scoped_log.hpp | 27 ++++++++++++++++ .../include/awesome_log/writer_interface.hpp | 15 +++++++++ src/awesome_log/src/console_writer.cpp | 12 +++++++ src/awesome_log/src/log.cpp | 23 +++++++++++++ src/awesome_log/src/null_writer.cpp | 10 ++++++ src/awesome_log/src/scoped_log.cpp | 32 +++++++++++++++++++ src/example_boost/CMakeLists.txt | 2 +- src/example_boost/src/main.cpp | 6 ++-- src/hello_world/CMakeLists.txt | 13 ++++++++ src/hello_world/src/main.cpp | 7 ++++ src/hello_world_awesome/CMakeLists.txt | 18 +++++++++++ src/hello_world_awesome/src/main.cpp | 29 +++++++++++++++++ 17 files changed, 254 insertions(+), 4 deletions(-) create mode 100644 src/awesome_log/CMakeLists.txt create mode 100644 src/awesome_log/include/awesome_log/console_writer.hpp create mode 100644 src/awesome_log/include/awesome_log/log.hpp create mode 100644 src/awesome_log/include/awesome_log/null_writer.hpp create mode 100644 src/awesome_log/include/awesome_log/scoped_log.hpp create mode 100644 src/awesome_log/include/awesome_log/writer_interface.hpp create mode 100644 src/awesome_log/src/console_writer.cpp create mode 100644 src/awesome_log/src/log.cpp create mode 100644 src/awesome_log/src/null_writer.cpp create mode 100644 src/awesome_log/src/scoped_log.cpp create mode 100644 src/hello_world/CMakeLists.txt create mode 100644 src/hello_world/src/main.cpp create mode 100644 src/hello_world_awesome/CMakeLists.txt create mode 100644 src/hello_world_awesome/src/main.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4c95bae..f0e6ed4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,6 @@ cmake_minimum_required(VERSION 3.20) add_subdirectory(example_boost) +add_subdirectory(hello_world) +add_subdirectory(hello_world_awesome) +add_subdirectory(awesome_log) diff --git a/src/awesome_log/CMakeLists.txt b/src/awesome_log/CMakeLists.txt new file mode 100644 index 0000000..e8e064a --- /dev/null +++ b/src/awesome_log/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.20) + +project(awesome_log) + +add_library( + ${PROJECT_NAME} + ./src/console_writer.cpp + ./src/log.cpp + ./src/null_writer.cpp + ./src/scoped_log.cpp +) + +set_property( + TARGET ${PROJECT_NAME} + PROPERTY CXX_STANDARD 20 +) + +target_include_directories( + ${PROJECT_NAME} + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include +) diff --git a/src/awesome_log/include/awesome_log/console_writer.hpp b/src/awesome_log/include/awesome_log/console_writer.hpp new file mode 100644 index 0000000..5fe4e38 --- /dev/null +++ b/src/awesome_log/include/awesome_log/console_writer.hpp @@ -0,0 +1,14 @@ + +#pragma once + +#include "writer_interface.hpp" + +namespace awesome_log +{ + class console_writer : public writer_interface + { + public: + ~console_writer() override; + void log(std::string_view msg) override; + }; +} diff --git a/src/awesome_log/include/awesome_log/log.hpp b/src/awesome_log/include/awesome_log/log.hpp new file mode 100644 index 0000000..749ed61 --- /dev/null +++ b/src/awesome_log/include/awesome_log/log.hpp @@ -0,0 +1,12 @@ + +#pragma once + +#include + +namespace awesome_log +{ + class writer_interface; + + writer_interface& get_writer(); + void set_writer(const std::shared_ptr& writer); +} \ No newline at end of file diff --git a/src/awesome_log/include/awesome_log/null_writer.hpp b/src/awesome_log/include/awesome_log/null_writer.hpp new file mode 100644 index 0000000..fbd2334 --- /dev/null +++ b/src/awesome_log/include/awesome_log/null_writer.hpp @@ -0,0 +1,14 @@ + +#pragma once + +#include "writer_interface.hpp" + +namespace awesome_log +{ + class null_writer : public writer_interface + { + public: + ~null_writer() override; + void log(std::string_view msg) override; + }; +} diff --git a/src/awesome_log/include/awesome_log/scoped_log.hpp b/src/awesome_log/include/awesome_log/scoped_log.hpp new file mode 100644 index 0000000..ac4e175 --- /dev/null +++ b/src/awesome_log/include/awesome_log/scoped_log.hpp @@ -0,0 +1,27 @@ + +#pragma once + +#include +#include + +namespace awesome_log +{ + class scoped_log + { + public: + scoped_log(std::string_view msg); + ~scoped_log(); + + scoped_log() = delete; + + // No copying or moving allowed. + scoped_log(const scoped_log&) = delete; + scoped_log(scoped_log&&) = delete; + scoped_log& operator=(const scoped_log&) = delete; + scoped_log& operator=(scoped_log&&) = delete; + + private: + std::string m_msg; + int m_uncaught_exceptions; + }; +} \ No newline at end of file diff --git a/src/awesome_log/include/awesome_log/writer_interface.hpp b/src/awesome_log/include/awesome_log/writer_interface.hpp new file mode 100644 index 0000000..b5f0e48 --- /dev/null +++ b/src/awesome_log/include/awesome_log/writer_interface.hpp @@ -0,0 +1,15 @@ + +#pragma once + +#include + +namespace awesome_log +{ + class writer_interface + { + public: + virtual ~writer_interface() = default; + + virtual void log(std::string_view msg) = 0; + }; +} diff --git a/src/awesome_log/src/console_writer.cpp b/src/awesome_log/src/console_writer.cpp new file mode 100644 index 0000000..9d6a221 --- /dev/null +++ b/src/awesome_log/src/console_writer.cpp @@ -0,0 +1,12 @@ + +#include +#include + +using namespace awesome_log; + +console_writer::~console_writer() = default; + +void console_writer::log(std::string_view msg) +{ + std::cout << msg << std::endl; +} diff --git a/src/awesome_log/src/log.cpp b/src/awesome_log/src/log.cpp new file mode 100644 index 0000000..dc4be2b --- /dev/null +++ b/src/awesome_log/src/log.cpp @@ -0,0 +1,23 @@ +#include +#include + +using awesome_log::writer_interface; + +namespace +{ + std::shared_ptr g_instance; +} + +writer_interface& awesome_log::get_writer() +{ + if(!g_instance) + { + g_instance = std::make_shared(); + } + return *g_instance; +} + +void awesome_log::set_writer(const std::shared_ptr& writer) +{ + g_instance = writer; +} diff --git a/src/awesome_log/src/null_writer.cpp b/src/awesome_log/src/null_writer.cpp new file mode 100644 index 0000000..32da4f7 --- /dev/null +++ b/src/awesome_log/src/null_writer.cpp @@ -0,0 +1,10 @@ + +#include + +using namespace awesome_log; + +null_writer::~null_writer() = default; + +void null_writer::log(std::string_view) +{ +} diff --git a/src/awesome_log/src/scoped_log.cpp b/src/awesome_log/src/scoped_log.cpp new file mode 100644 index 0000000..271ecbb --- /dev/null +++ b/src/awesome_log/src/scoped_log.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include + +using namespace awesome_log; + +scoped_log::scoped_log(std::string_view msg) + : m_msg(msg) + , m_uncaught_exceptions(std::uncaught_exceptions()) +{ + std::stringstream ss; + ss << "> " << m_msg; + + get_writer().log(ss.str()); +} + +scoped_log::~scoped_log() +{ + bool is_stack_unwinding = (m_uncaught_exceptions != std::uncaught_exceptions()); + + std::stringstream ss; + ss << "< " << m_msg; + + if (is_stack_unwinding) + { + ss << " (stack unwinding)"; + } + + get_writer().log(ss.str()); +} diff --git a/src/example_boost/CMakeLists.txt b/src/example_boost/CMakeLists.txt index f8133ed..623df99 100644 --- a/src/example_boost/CMakeLists.txt +++ b/src/example_boost/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.20) find_package(Boost 1.88.0 REQUIRED COMPONENTS serialization) -project(hello_world_boost) +project(example_boost) add_executable( ${PROJECT_NAME} diff --git a/src/example_boost/src/main.cpp b/src/example_boost/src/main.cpp index d17a699..23b2371 100644 --- a/src/example_boost/src/main.cpp +++ b/src/example_boost/src/main.cpp @@ -5,8 +5,8 @@ struct position { - double x; - double y; + int x; + int y; template void serialize(Archive & ar, const unsigned int /*version*/) @@ -25,7 +25,7 @@ struct position int main(int argc, char* argv[]) { - position myposition{.x=123.0, .y=456.0}; + position myposition{.x=123, .y=456}; std::stringstream ss; { diff --git a/src/hello_world/CMakeLists.txt b/src/hello_world/CMakeLists.txt new file mode 100644 index 0000000..4925946 --- /dev/null +++ b/src/hello_world/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.20) + +project(hello_world) + +add_executable( + ${PROJECT_NAME} + src/main.cpp +) + +set_property( + TARGET ${PROJECT_NAME} + PROPERTY CXX_STANDARD 20 +) diff --git a/src/hello_world/src/main.cpp b/src/hello_world/src/main.cpp new file mode 100644 index 0000000..13c5192 --- /dev/null +++ b/src/hello_world/src/main.cpp @@ -0,0 +1,7 @@ + +#include + +int main(int argc, char* argv[]) +{ + std::cout << "Hello world" << std::endl; +} \ No newline at end of file diff --git a/src/hello_world_awesome/CMakeLists.txt b/src/hello_world_awesome/CMakeLists.txt new file mode 100644 index 0000000..d9464e7 --- /dev/null +++ b/src/hello_world_awesome/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.20) + +project(hello_world_awesome) + +add_executable( + ${PROJECT_NAME} + src/main.cpp +) + +target_link_libraries( + ${PROJECT_NAME} + awesome_log +) + +set_property( + TARGET ${PROJECT_NAME} + PROPERTY CXX_STANDARD 20 +) diff --git a/src/hello_world_awesome/src/main.cpp b/src/hello_world_awesome/src/main.cpp new file mode 100644 index 0000000..8d27071 --- /dev/null +++ b/src/hello_world_awesome/src/main.cpp @@ -0,0 +1,29 @@ +#include +#include +#include + +#include +#include + +using awesome_log::scoped_log; + +int main(int argc, char* argv[]) +{ + awesome_log::set_writer(std::make_shared()); + + { + scoped_log scoped("main.cpp, printing text"); + std::cout << "Hello world" << std::endl; + } + + try + { + scoped_log scoped("main.cpp, playing with exceptions"); + throw std::runtime_error("Let's play!"); + // ... unreachable code goes here. + } + catch(const std::exception& e) + { + std::cout << "Caught an exception, as expected in this example" << std::endl; + } +} \ No newline at end of file