Browse Source

Merge remote-tracking branch 'origin/development' into google_test

Patrick-Christopher Mattulat 2 năm trước cách đây
mục cha
commit
d2029b6363
45 tập tin đã thay đổi với 788 bổ sung164 xóa
  1. 312 19
      CMakeLists.txt
  2. 21 37
      README.md
  3. 2 2
      include/ls_std/boxing/Boolean.hpp
  4. 2 2
      include/ls_std/boxing/Double.hpp
  5. 2 2
      include/ls_std/boxing/Float.hpp
  6. 2 2
      include/ls_std/boxing/Integer.hpp
  7. 2 2
      include/ls_std/boxing/Long.hpp
  8. 2 2
      include/ls_std/boxing/String.hpp
  9. 2 2
      include/ls_std/core/Version.hpp
  10. 2 2
      include/ls_std/core/interface/IBoxing.hpp
  11. 35 0
      include/ls_std/core/interface/IEncoding.hpp
  12. 4 4
      include/ls_std/core/interface/IEventSubscriber.hpp
  13. 2 2
      include/ls_std/core/interface/IListener.hpp
  14. 2 2
      include/ls_std/core/interface/IReader.hpp
  15. 2 2
      include/ls_std/core/interface/ISerializable.hpp
  16. 2 2
      include/ls_std/core/interface/IStorable.hpp
  17. 2 2
      include/ls_std/core/interface/IWriter.hpp
  18. 55 0
      include/ls_std/encoding/Base64.hpp
  19. 4 4
      include/ls_std/event/EventManager.hpp
  20. 5 5
      include/ls_std/event/Narrator.hpp
  21. 2 2
      include/ls_std/event/serialization/SerializableJsonEvent.hpp
  22. 2 2
      include/ls_std/io/FileOutputStream.hpp
  23. 2 2
      include/ls_std/io/FileReader.hpp
  24. 2 2
      include/ls_std/io/FileWriter.hpp
  25. 2 2
      include/ls_std/io/StandardOutputWriter.hpp
  26. 2 2
      include/ls_std/io/StorableFile.hpp
  27. 2 2
      include/ls_std/io/kv/KvFileReader.hpp
  28. 4 4
      include/ls_std/io/logging/Logger.hpp
  29. 2 2
      include/ls_std/io/xml/XmlReader.hpp
  30. 2 2
      include/ls_std/logic/serialization/SerializableJsonState.hpp
  31. 2 2
      include/ls_std/logic/serialization/SerializableJsonStateConnection.hpp
  32. 2 2
      include/ls_std/logic/serialization/SerializableJsonStateMachine.hpp
  33. 2 1
      include/ls_std/ls_std_core.hpp
  34. 15 0
      include/ls_std/ls_std_encoding.hpp
  35. 193 0
      source/ls_std/encoding/Base64.cpp
  36. 3 3
      source/ls_std/event/EventManager.cpp
  37. 4 4
      source/ls_std/event/Narrator.cpp
  38. 3 3
      source/ls_std/io/logging/Logger.cpp
  39. 2 2
      test/TestHelper.hpp
  40. 48 0
      test/cases/encoding/Base64Test.cpp
  41. 15 15
      test/cases/event/NarratorTest.cpp
  42. 9 9
      test/cases/io/logging/LoggerTest.cpp
  43. 2 2
      test/classes/event/DailyNewsAgency.hpp
  44. 2 2
      test/classes/event/GossipNewsAgency.hpp
  45. 2 2
      test/classes/event/TestDataMercedesCar.hpp

+ 312 - 19
CMakeLists.txt

@@ -1,3 +1,11 @@
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# General
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
 ##########################################################
 # Basic
 ##########################################################
@@ -7,6 +15,7 @@ project(ls_std VERSION 2022.1.0)
 
 set(MODULE_NAME_BOXING ls_std_boxing)
 set(MODULE_NAME_CORE ls_std_core)
+set(MODULE_NAME_ENCODING ls_std_encoding)
 set(MODULE_NAME_EVENT ls_std_event)
 set(MODULE_NAME_IO ls_std_io)
 set(MODULE_NAME_LOGIC ls_std_logic)
@@ -18,11 +27,33 @@ set(GOOGLE_TEST_MODULE googletest-1.11.0)
 # Options
 ##########################################################
 
-option(LS_STD_BUILD_WITH_TESTS "Build project with tests..." OFF)
+option(LS_STD_BUILD_WITH_TESTS "Build project with tests..." ON)
 option(LS_STD_BUILD_STATIC "Build ls_std static library..." ON)
 option(LS_STD_BUILD_SHARED "Build ls_std shared library..." OFF)
 option(LS_STD_BUILD_MODULE "Build ls_std module library..." OFF)
 
+set(TARGET_COUNTER 0)
+
+if (${LS_STD_BUILD_STATIC})
+    math(EXPR TARGET_COUNTER "${TARGET_COUNTER} + 1")
+    message("${PROJECT_NAME}: [Goal] static library")
+endif ()
+
+if (${LS_STD_BUILD_SHARED})
+    math(EXPR TARGET_COUNTER "${TARGET_COUNTER} + 1")
+    message("${PROJECT_NAME}: [Goal] shared library")
+endif ()
+
+if (${LS_STD_BUILD_MODULE})
+    math(EXPR TARGET_COUNTER "${TARGET_COUNTER} + 1")
+    message("${PROJECT_NAME}: [Goal] module library")
+endif ()
+
+if (TARGET_COUNTER GREATER 1)
+    message("${PROJECT_NAME}: [Error] only one goal supported at the same time!")
+    return()
+endif ()
+
 ##########################################################
 # Compiler Settings
 ##########################################################
@@ -56,9 +87,13 @@ if (${LS_STD_BUILD_WITH_TESTS})
     add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/test/lib/${GOOGLE_TEST_MODULE})
 endif ()
 
-##########################################################
-# Source Files
-##########################################################
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Source Files Modularization
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
 
 set(SOURCE_FILES_BOXING
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/boxing/Boolean.cpp
@@ -72,6 +107,9 @@ set(SOURCE_FILES_CORE
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/core/Class.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/core/Version.cpp)
 
+set(SOURCE_FILES_ENCODING
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/encoding/Base64.cpp)
+
 set(SOURCE_FILES_EVENT
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/event/serialization/SerializableJsonEvent.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/event/Event.cpp
@@ -110,6 +148,14 @@ set(SOURCE_FILES_LOGIC
 set(SOURCE_FILES_TIME
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/time/Date.cpp)
 
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Test Files Modularization
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
 if (${LS_STD_BUILD_WITH_TESTS})
     set(TEST_FILES_BOXING
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/BooleanTest.cpp
@@ -134,6 +180,9 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/LibraryVersionTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/VersionTest.cpp)
 
+    set(TEST_FILES_ENCODING
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/encoding/Base64Test.cpp)
+
     set(TEST_FILES_EVENT
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/event/serialization/SerializableJsonEventTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/event/EventHandlerTest.cpp
@@ -188,6 +237,14 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/time/DateTest.cpp)
 endif ()
 
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Test Suite Builds
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
 ##########################################################
 # Build Tests (boxing)
 ##########################################################
@@ -206,6 +263,15 @@ if (${LS_STD_BUILD_WITH_TESTS})
     add_executable(${MODULE_NAME_CORE}_test ${TEST_FILES_CORE})
 endif ()
 
+##########################################################
+# Build Tests (encoding)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS})
+    message("${MODULE_NAME_ENCODING}: Building tests...")
+    add_executable(${MODULE_NAME_ENCODING}_test ${TEST_FILES_ENCODING})
+endif ()
+
 ##########################################################
 # Build Tests (event)
 ##########################################################
@@ -243,7 +309,7 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Build Tests
+# Build Tests (all)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
@@ -251,6 +317,7 @@ if (${LS_STD_BUILD_WITH_TESTS})
     add_executable(${PROJECT_NAME}_test
             ${TEST_FILES_BOXING}
             ${TEST_FILES_CORE}
+            ${TEST_FILES_ENCODING}
             ${TEST_FILES_EVENT}
             ${TEST_FILES_IO}
             ${TEST_FILES_LOGIC}
@@ -258,6 +325,14 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${TEST_FILES_TIME})
 endif ()
 
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Build Library Binaries
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
 ##########################################################
 # Build Library (boxing)
 ##########################################################
@@ -290,6 +365,37 @@ if (${LS_STD_BUILD_STATIC})
     set_target_properties("${MODULE_NAME_CORE}" PROPERTIES DEBUG_POSTFIX "_d")
 endif ()
 
+if (${LS_STD_BUILD_SHARED})
+    add_library("${MODULE_NAME_CORE}" SHARED ${SOURCE_FILES_CORE})
+    set_target_properties("${MODULE_NAME_CORE}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+if (${LS_STD_BUILD_MODULE})
+    add_library("${MODULE_NAME_CORE}" MODULE ${SOURCE_FILES_CORE})
+    set_target_properties("${MODULE_NAME_CORE}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+##########################################################
+# Build Library (encoding)
+##########################################################
+
+message("${PROJECT_NAME}: Building ${MODULE_NAME_ENCODING} library version ${PROJECT_VERSION}...")
+
+if (${LS_STD_BUILD_STATIC})
+    add_library("${MODULE_NAME_ENCODING}" STATIC ${SOURCE_FILES_ENCODING})
+    set_target_properties("${MODULE_NAME_ENCODING}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+if (${LS_STD_BUILD_SHARED})
+    add_library("${MODULE_NAME_ENCODING}" SHARED ${SOURCE_FILES_ENCODING})
+    set_target_properties("${MODULE_NAME_ENCODING}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+if (${LS_STD_BUILD_MODULE})
+    add_library("${MODULE_NAME_ENCODING}" MODULE ${SOURCE_FILES_ENCODING})
+    set_target_properties("${MODULE_NAME_ENCODING}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
 ##########################################################
 # Build Library (event)
 ##########################################################
@@ -301,6 +407,16 @@ if (${LS_STD_BUILD_STATIC})
     set_target_properties("${MODULE_NAME_EVENT}" PROPERTIES DEBUG_POSTFIX "_d")
 endif ()
 
+if (${LS_STD_BUILD_SHARED})
+    add_library("${MODULE_NAME_EVENT}" SHARED ${SOURCE_FILES_EVENT})
+    set_target_properties("${MODULE_NAME_EVENT}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+if (${LS_STD_BUILD_MODULE})
+    add_library("${MODULE_NAME_EVENT}" MODULE ${SOURCE_FILES_EVENT})
+    set_target_properties("${MODULE_NAME_EVENT}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
 ##########################################################
 # Build Library (io)
 ##########################################################
@@ -312,6 +428,16 @@ if (${LS_STD_BUILD_STATIC})
     set_target_properties("${MODULE_NAME_IO}" PROPERTIES DEBUG_POSTFIX "_d")
 endif ()
 
+if (${LS_STD_BUILD_SHARED})
+    add_library("${MODULE_NAME_IO}" SHARED ${SOURCE_FILES_IO})
+    set_target_properties("${MODULE_NAME_IO}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+if (${LS_STD_BUILD_MODULE})
+    add_library("${MODULE_NAME_IO}" MODULE ${SOURCE_FILES_IO})
+    set_target_properties("${MODULE_NAME_IO}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
 ##########################################################
 # Build Library (logic)
 ##########################################################
@@ -323,6 +449,16 @@ if (${LS_STD_BUILD_STATIC})
     set_target_properties("${MODULE_NAME_LOGIC}" PROPERTIES DEBUG_POSTFIX "_d")
 endif ()
 
+if (${LS_STD_BUILD_SHARED})
+    add_library("${MODULE_NAME_LOGIC}" SHARED ${SOURCE_FILES_LOGIC})
+    set_target_properties("${MODULE_NAME_LOGIC}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+if (${LS_STD_BUILD_MODULE})
+    add_library("${MODULE_NAME_LOGIC}" MODULE ${SOURCE_FILES_LOGIC})
+    set_target_properties("${MODULE_NAME_LOGIC}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
 ##########################################################
 # Build Library (time)
 ##########################################################
@@ -334,11 +470,29 @@ if (${LS_STD_BUILD_STATIC})
     set_target_properties("${MODULE_NAME_TIME}" PROPERTIES DEBUG_POSTFIX "_d")
 endif ()
 
+if (${LS_STD_BUILD_SHARED})
+    add_library("${MODULE_NAME_TIME}" SHARED ${SOURCE_FILES_TIME})
+    set_target_properties("${MODULE_NAME_TIME}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+if (${LS_STD_BUILD_MODULE})
+    add_library("${MODULE_NAME_TIME}" MODULE ${SOURCE_FILES_TIME})
+    set_target_properties("${MODULE_NAME_TIME}" PROPERTIES DEBUG_POSTFIX "_d")
+endif ()
+
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Test Suite: Static Linking
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
 ##########################################################
-# Linking (boxing)
+# Static Linking (boxing)
 ##########################################################
 
-if (${LS_STD_BUILD_WITH_TESTS})
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
     message("${MODULE_NAME_BOXING}: Linking libraries for test application...")
     target_link_libraries(${MODULE_NAME_BOXING}_test
             gtest
@@ -349,10 +503,10 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking (core)
+# Static Linking (core)
 ##########################################################
 
-if (${LS_STD_BUILD_WITH_TESTS})
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
     message("${MODULE_NAME_CORE}: Linking libraries for test application...")
     target_link_libraries(${MODULE_NAME_CORE}_test
             gtest
@@ -362,10 +516,24 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking (event)
+# Static Linking (encoding)
 ##########################################################
 
-if (${LS_STD_BUILD_WITH_TESTS})
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
+    message("${MODULE_NAME_ENCODING}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_ENCODING}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_ENCODING}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Static Linking (event)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
     message("${MODULE_NAME_EVENT}: Linking libraries for test application...")
     target_link_libraries(${MODULE_NAME_EVENT}_test
             gtest
@@ -376,10 +544,10 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking (io)
+# Static Linking (io)
 ##########################################################
 
-if (${LS_STD_BUILD_WITH_TESTS})
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
     message("${MODULE_NAME_IO}: Linking libraries for test application...")
     target_link_libraries(${MODULE_NAME_IO}_test
             gtest
@@ -390,10 +558,10 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking (logic)
+# Static Linking (logic)
 ##########################################################
 
-if (${LS_STD_BUILD_WITH_TESTS})
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
     message("${MODULE_NAME_LOGIC}: Linking libraries for test application...")
     target_link_libraries(${MODULE_NAME_LOGIC}_test
             gtest
@@ -404,10 +572,10 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking (time)
+# Static Linking (time)
 ##########################################################
 
-if (${LS_STD_BUILD_WITH_TESTS})
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
     message("${MODULE_NAME_TIME}: Linking libraries for test application...")
     target_link_libraries(${MODULE_NAME_TIME}_test
             gtest
@@ -418,10 +586,134 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking
+# Static Linking (all)
 ##########################################################
 
-if (${LS_STD_BUILD_WITH_TESTS})
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_STATIC})
+    message("${PROJECT_NAME}: Linking libraries for test application...")
+    target_link_libraries(${PROJECT_NAME}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_CORE}"
+            "${MODULE_NAME_BOXING}"
+            "${MODULE_NAME_ENCODING}"
+            "${MODULE_NAME_EVENT}"
+            "${MODULE_NAME_IO}"
+            "${MODULE_NAME_LOGIC}"
+            "${MODULE_NAME_TIME}")
+endif ()
+
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Test Suite: Dynamic Linking
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
+##########################################################
+# Dynamic Linking (boxing)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
+    message("${MODULE_NAME_BOXING}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_BOXING}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_BOXING}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Dynamic Linking (core)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
+    message("${MODULE_NAME_CORE}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_CORE}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Dynamic Linking (encoding)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
+    message("${MODULE_NAME_ENCODING}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_ENCODING}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_ENCODING}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Dynamic Linking (event)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
+    message("${MODULE_NAME_EVENT}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_EVENT}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_EVENT}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Dynamic Linking (io)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
+    message("${MODULE_NAME_IO}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_IO}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_IO}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Dynamic Linking (logic)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
+    message("${MODULE_NAME_LOGIC}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_LOGIC}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_LOGIC}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Dynamic Linking (time)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
+    message("${MODULE_NAME_TIME}: Linking libraries for test application...")
+    target_link_libraries(${MODULE_NAME_TIME}_test
+            gtest
+            gmock
+            gtest_main
+            "${MODULE_NAME_TIME}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+##########################################################
+# Dynamic Linking (all)
+##########################################################
+
+if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_SHARED})
     message("${PROJECT_NAME}: Linking libraries for test application...")
     target_link_libraries(${PROJECT_NAME}_test
             gtest
@@ -429,6 +721,7 @@ if (${LS_STD_BUILD_WITH_TESTS})
             gtest_main
             "${MODULE_NAME_CORE}"
             "${MODULE_NAME_BOXING}"
+            "${MODULE_NAME_ENCODING}"
             "${MODULE_NAME_EVENT}"
             "${MODULE_NAME_IO}"
             "${MODULE_NAME_LOGIC}"

+ 21 - 37
README.md

@@ -1,55 +1,36 @@
 # Lynar Studios - Standard Library 2022.1.0 #
 
-This is a cross-platform standard library written in C++ offering functionalities you'd usually miss in C++ standard library, especially if you'd search for cross-platform implementations. This library has been tested on __Windows__, __Linux__ and __MacOS__ systems.
+This is a cross-platform standard library written in C++ offering functionalities you'd usually miss in C++'s standard template library (STL), especially if you'd search for cross-platform implementations. This library has been tested on __Windows__, __Linux__ and __MacOS__ systems.
+Following a modularized approach the following submodules are defined in scope of this library, which are independent:
  
 #### Boxing ####
 
-This library provides boxing classes for primitive data types (e.g. string, int, long, float...) to add additional functionalities for each one of them.
- 
-#### File ####
-
-To handle file operations - or to receive information of a file - this library provides an own __File__ class implementation, which can also be passed to library implemented input or output stream classes.
-
-#### Base ####
-
-This is a collection of very basic functionalities like a base __Class__ which provides minimal reflection like class name. Also, you have the possibility with this collection to fetch this libraries version or even handle own versions for your project.
-
-#### Time ####
-
-A __Date__ class comes with this collection, which you can use to represent a date and doing operations on it. 
-
-#### Logic ####
-
-This collection of classes provides some nice functionalities to support your project with some nice logical features, like state machines and observer pattern supporting classes.
-
-#### Serialization ####
-
-Serialization is very important nowadays to persist data. This library offers a serializable interface, which can then be implemented in your project.  
-In addition to that there is already JSON serialization-based implementation for some public library classes.
+This library module provides boxing classes for primitive data types (e.g. string, int, long, float...) to add additional functionalities for each one of them.
 
-#### JSON ####
+#### Core ####
 
-This library uses a transitive JSON dependency, which is in line with our license model. Many thanks to __Niels Lohmann__ for writing this nice little library.
+The core module is a base module providing a base __Class__, exceptions, data types and interfaces. Usually the other submodules are dependent on this module. 
 
-#### XML ####
+#### Encoding ####
 
-To handle XML files this library has an own XML parser implementation, which uses modern C++ features, such as shared pointers.
+To encode a byte field (e.g. binaries) for transfer the __Base64__ encoding / decoding functionality is being provided by this submodule as a first feature.
 
-#### Logger ####
+#### Event ####
 
-For logging functionality you might need for your project there is a __Logger__ class coming with this library, which is also able to handle different log level.
+This submodule comes with an __Event__ class, as well as with handlers and managers to provide an intuitive event managing for your application.
 
-#### Event Handling ####
+#### IO ####
 
-With this first implemented milestone of event handling this library provides functionalities for creating and firing events.
+To handle file operations - or to receive information of a file - this library submodule provides an own __File__ class implementation, which can also be passed to library implemented input or output stream classes.  
+Additionally __XML__ and __KV__ parsing functionalities are provided by this submodule.
 
-#### Exception ####
+#### Logic ####
 
-This library provides some basic exceptions which can be used in your project to create awareness of certain error behaviour.
+Functionalities provided by this submodule support your project with some nice logical features. The first one being provided by it is a state machine.
 
-#### KV ####
+#### Time ####
 
-A key value file offers the possibility to store simple information pairs in a file. This library provides parsing functionalities for __.kv__ files.
+A __Date__ class comes with this submodule, which you can use to represent a date and do operations on it. 
 
 ### Changelog ###
 
@@ -59,11 +40,14 @@ A key value file offers the possibility to store simple information pairs in a f
 
 #### Improvements ####
 
-- TBA
+- modularization has been improved by restructuring library files, which would result into having submodules - __there is no central header or binary file anymore__ - instead submodules can be linked independently now (e.g. using __ls_std_event.hpp__ and linking __libls_std_event.so__)
+- there is a cmake guard now to ensure that only one goal at the time is being build
+- test suites for shared libraries have been introduced to ensure that building and linking created shared library is working
+- namespaces have been improved library wide and are more specific - __there is no _ls_std_ namespace anymore__ - instead you can choose submodule specific namespaces (e.g. _ls::std::boxing::_)
 
 #### Fixes ####
 
-- TBA
+- there is a cmake guard now to ensure that only one goal at the time is being build
 
 ### Documentation ###
 

+ 2 - 2
include/ls_std/boxing/Boolean.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-09
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace boxing
     {
-      class Boolean : public ls::std::core::Class, public ls::std::core::interface::IBoxing
+      class Boolean : public ls::std::core::Class, public ls::std::core::interface_type::IBoxing
       {
         public:
 

+ 2 - 2
include/ls_std/boxing/Double.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace boxing
     {
-      class Double : public ls::std::core::Class, public ls::std::core::interface::IBoxing
+      class Double : public ls::std::core::Class, public ls::std::core::interface_type::IBoxing
       {
         public:
 

+ 2 - 2
include/ls_std/boxing/Float.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace boxing
     {
-      class Float : public ls::std::core::Class, public ls::std::core::interface::IBoxing
+      class Float : public ls::std::core::Class, public ls::std::core::interface_type::IBoxing
       {
         public:
 

+ 2 - 2
include/ls_std/boxing/Integer.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-07
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace boxing
     {
-      class Integer : public ls::std::core::Class, public ls::std::core::interface::IBoxing
+      class Integer : public ls::std::core::Class, public ls::std::core::interface_type::IBoxing
       {
         public:
 

+ 2 - 2
include/ls_std/boxing/Long.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -21,7 +21,7 @@ namespace ls
   {
     namespace boxing
     {
-      class Long : public ls::std::core::Class, public ls::std::core::interface::IBoxing
+      class Long : public ls::std::core::Class, public ls::std::core::interface_type::IBoxing
       {
         public:
 

+ 2 - 2
include/ls_std/boxing/String.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -23,7 +23,7 @@ namespace ls
   {
     namespace boxing
     {
-      class String : public ls::std::core::Class, public ls::std::core::interface::IBoxing
+      class String : public ls::std::core::Class, public ls::std::core::interface_type::IBoxing
       {
         public:
 

+ 2 - 2
include/ls_std/core/Version.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-27
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace core
     {
-      class Version : public ls::std::core::interface::ISerializable
+      class Version : public ls::std::core::interface_type::ISerializable
       {
         public:
 

+ 2 - 2
include/ls_std/core/interface/IBoxing.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-07
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@ namespace ls
   {
     namespace core
     {
-      namespace interface
+      namespace interface_type
       {
         class IBoxing
         {

+ 35 - 0
include/ls_std/core/interface/IEncoding.hpp

@@ -0,0 +1,35 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-01-03
+ * Changed:         2022-05-19
+ *
+ * */
+
+#ifndef LS_STD_I_ENCODING_HPP
+#define LS_STD_I_ENCODING_HPP
+
+#include <string>
+
+namespace ls
+{
+  namespace std
+  {
+    namespace core
+    {
+      namespace interface_type
+      {
+        class IEncoding
+        {
+          public:
+
+            virtual ::std::string encode(const ::std::string &_sequence) = 0;
+            virtual ::std::string decode(const ::std::string &_sequence) = 0;
+        };
+      }
+    }
+  }
+}
+
+#endif

+ 4 - 4
include/ls_std/core/interface/IEventSubscriber.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace core
     {
-      namespace interface
+      namespace interface_type
       {
         class IEventSubscriber
         {
@@ -29,8 +29,8 @@ namespace ls
             IEventSubscriber() = default;
             ~IEventSubscriber() = default;
 
-            virtual void subscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener) = 0;
-            virtual void unsubscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener) = 0;
+            virtual void subscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener) = 0;
+            virtual void unsubscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener) = 0;
         };
       }
     }

+ 2 - 2
include/ls_std/core/interface/IListener.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@ namespace ls
   {
     namespace core
     {
-      namespace interface
+      namespace interface_type
       {
         class IListener
         {

+ 2 - 2
include/ls_std/core/interface/IReader.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@ namespace ls
   {
     namespace core
     {
-      namespace interface
+      namespace interface_type
       {
         class IReader
         {

+ 2 - 2
include/ls_std/core/interface/ISerializable.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-21
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@ namespace ls
   {
     namespace core
     {
-      namespace interface
+      namespace interface_type
       {
         class ISerializable
         {

+ 2 - 2
include/ls_std/core/interface/IStorable.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-19
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@ namespace ls
   {
     namespace core
     {
-      namespace interface
+      namespace interface_type
       {
         class IStorable
         {

+ 2 - 2
include/ls_std/core/interface/IWriter.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -19,7 +19,7 @@ namespace ls
   {
     namespace core
     {
-      namespace interface
+      namespace interface_type
       {
         class IWriter
         {

+ 55 - 0
include/ls_std/encoding/Base64.hpp

@@ -0,0 +1,55 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-01-03
+ * Changed:         2022-05-20
+ *
+ * */
+
+#ifndef LS_STD_BASE64_HPP
+#define LS_STD_BASE64_HPP
+
+#include <ls_std/core/interface/IEncoding.hpp>
+#include <bitset>
+#include <vector>
+#include <unordered_map>
+
+namespace ls
+{
+  namespace std
+  {
+    namespace encoding
+    {
+      class Base64 : public ls::std::core::interface_type::IEncoding
+      {
+        public:
+
+          Base64() = default;
+          ~Base64() = default;
+
+          // implementation
+
+          ::std::string encode(const ::std::string &_sequence) override;
+          ::std::string decode(const ::std::string &_sequence) override;
+
+        private:
+
+          static ::std::string _applyEndingRule(::std::string _encodedString, size_t _sequenceSize);
+          static ::std::string _decodeByteQuadruple(const ::std::string &_quadruple);
+          static ::std::string _encodeByteTriple(const ::std::string &_byteTriple);
+          static uint32_t _extractBitSequence(uint32_t _bitMask, uint32_t _bitStorage);
+          static uint32_t _generateBitMask(uint32_t _maskValue, uint8_t _shiftValue);
+          static ::std::unordered_map<char, uint8_t> _getDecodingMap();
+          static ::std::unordered_map<uint8_t, char> _getEncodingMap();
+          static ::std::string _getNextByteQuadruple(const ::std::string &_sequence, size_t _index);
+          static ::std::string _getNextByteTriple(const ::std::string &_sequence, size_t _index);
+          static void _mergeBitSequence(uint32_t &_bitStorage, const uint32_t &_bitMask);
+          static uint32_t _toDecodingBitStorage(const ::std::string &_quadruple);
+          static uint32_t _toEncodingBitStorage(const ::std::string &_triple);
+      };
+    }
+  }
+}
+
+#endif

+ 4 - 4
include/ls_std/event/EventManager.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -23,7 +23,7 @@ namespace ls
   {
     namespace event
     {
-      class EventManager : public ls::std::core::Class, public ls::std::core::interface::IEventSubscriber
+      class EventManager : public ls::std::core::Class, public ls::std::core::interface_type::IEventSubscriber
       {
         public:
 
@@ -32,8 +32,8 @@ namespace ls
 
           // implementation
 
-          void subscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener) override;
-          void unsubscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener) override;
+          void subscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener) override;
+          void unsubscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener) override;
 
           // additional functionality
 

+ 5 - 5
include/ls_std/event/Narrator.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -28,15 +28,15 @@ namespace ls
           Narrator();
           ~Narrator() override = default;
 
-          bool addListener(const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener);
+          bool addListener(const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener);
           void clear();
-          ::std::list<::std::shared_ptr<ls::std::core::interface::IListener>> getListeners();
-          bool removeListener(const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener);
+          ::std::list<::std::shared_ptr<ls::std::core::interface_type::IListener>> getListeners();
+          bool removeListener(const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener);
           void tell(const ls::std::core::Class &_info);
 
         private:
 
-          ::std::list<::std::shared_ptr<ls::std::core::interface::IListener>> listeners{};
+          ::std::list<::std::shared_ptr<ls::std::core::interface_type::IListener>> listeners{};
       };
     }
   }

+ 2 - 2
include/ls_std/event/serialization/SerializableJsonEvent.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-12-07
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -22,7 +22,7 @@ namespace ls
   {
     namespace event
     {
-      class SerializableJsonEvent : public ls::std::core::Class, public ls::std::core::interface::ISerializable
+      class SerializableJsonEvent : public ls::std::core::Class, public ls::std::core::interface_type::ISerializable
       {
         public:
 

+ 2 - 2
include/ls_std/io/FileOutputStream.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-20
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -21,7 +21,7 @@ namespace ls
   {
     namespace io
     {
-      class FileOutputStream : public ls::std::core::Class, public ls::std::core::interface::IWriter
+      class FileOutputStream : public ls::std::core::Class, public ls::std::core::interface_type::IWriter
       {
         public:
 

+ 2 - 2
include/ls_std/io/FileReader.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace io
     {
-      class FileReader : public ls::std::core::Class, public ls::std::core::interface::IReader
+      class FileReader : public ls::std::core::Class, public ls::std::core::interface_type::IReader
       {
         public:
 

+ 2 - 2
include/ls_std/io/FileWriter.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -20,7 +20,7 @@ namespace ls
   {
     namespace io
     {
-      class FileWriter : public ls::std::core::Class, public ls::std::core::interface::IWriter
+      class FileWriter : public ls::std::core::Class, public ls::std::core::interface_type::IWriter
       {
         public:
 

+ 2 - 2
include/ls_std/io/StandardOutputWriter.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-06
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@ namespace ls
   {
     namespace io
     {
-      class StandardOutputWriter : public ls::std::core::interface::IWriter
+      class StandardOutputWriter : public ls::std::core::interface_type::IWriter
       {
         public:
 

+ 2 - 2
include/ls_std/io/StorableFile.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-19
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -21,7 +21,7 @@ namespace ls
   {
     namespace io
     {
-      class StorableFile : public ls::std::core::interface::IStorable
+      class StorableFile : public ls::std::core::interface_type::IStorable
       {
         public:
 

+ 2 - 2
include/ls_std/io/kv/KvFileReader.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-12-25
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -22,7 +22,7 @@ namespace ls
   {
     namespace io
     {
-      class KvFileReader : public ls::std::core::Class, public ls::std::core::interface::IReader
+      class KvFileReader : public ls::std::core::Class, public ls::std::core::interface_type::IReader
       {
         public:
 

+ 4 - 4
include/ls_std/io/logging/Logger.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-20
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -27,7 +27,7 @@ namespace ls
       {
         public:
 
-          explicit Logger(const ::std::shared_ptr<ls::std::core::interface::IWriter> &_writer);
+          explicit Logger(const ::std::shared_ptr<ls::std::core::interface_type::IWriter> &_writer);
           ~Logger() override = default;
 
           void debug(const ls::std::core::type::byte *_data);
@@ -42,9 +42,9 @@ namespace ls
         private:
 
           ls::std::io::LogLevel logLevel{};
-          ::std::shared_ptr<ls::std::core::interface::IWriter> writer{};
+          ::std::shared_ptr<ls::std::core::interface_type::IWriter> writer{};
 
-          void _assignWriter(const ::std::shared_ptr<ls::std::core::interface::IWriter> &_writer);
+          void _assignWriter(const ::std::shared_ptr<ls::std::core::interface_type::IWriter> &_writer);
           static ::std::string _buildCharacterChain(size_t _amount);
           static ::std::string _createFillContent(const ::std::string &_text);
           static ::std::string _generateTimeString(tm *_localTime);

+ 2 - 2
include/ls_std/io/xml/XmlReader.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-10-08
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -24,7 +24,7 @@ namespace ls
   {
     namespace io
     {
-      class XmlReader : public ls::std::core::Class, public ls::std::core::interface::IReader
+      class XmlReader : public ls::std::core::Class, public ls::std::core::interface_type::IReader
       {
         public:
 

+ 2 - 2
include/ls_std/logic/serialization/SerializableJsonState.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-15
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -22,7 +22,7 @@ namespace ls
   {
     namespace logic
     {
-      class SerializableJsonState : public ls::std::core::Class, public ls::std::core::interface::ISerializable
+      class SerializableJsonState : public ls::std::core::Class, public ls::std::core::interface_type::ISerializable
       {
         public:
 

+ 2 - 2
include/ls_std/logic/serialization/SerializableJsonStateConnection.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -22,7 +22,7 @@ namespace ls
   {
     namespace logic
     {
-      class SerializableJsonStateConnection : public ls::std::core::Class, public ls::std::core::interface::ISerializable
+      class SerializableJsonStateConnection : public ls::std::core::Class, public ls::std::core::interface_type::ISerializable
       {
         public:
 

+ 2 - 2
include/ls_std/logic/serialization/SerializableJsonStateMachine.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-17
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -22,7 +22,7 @@ namespace ls
   {
     namespace logic
     {
-      class SerializableJsonStateMachine : public ls::std::core::Class, public ls::std::core::interface::ISerializable
+      class SerializableJsonStateMachine : public ls::std::core::Class, public ls::std::core::interface_type::ISerializable
       {
         public:
 

+ 2 - 1
include/ls_std/ls_std_core.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-05-13
- * Changed:         2022-05-16
+ * Changed:         2022-05-17
  *
  * */
 
@@ -20,6 +20,7 @@
 #include <ls_std/core/exception/NullPointerException.hpp>
 
 #include <ls_std/core/interface/IBoxing.hpp>
+#include <ls_std/core/interface/IEncoding.hpp>
 #include <ls_std/core/interface/IEventSubscriber.hpp>
 #include <ls_std/core/interface/IListener.hpp>
 #include <ls_std/core/interface/IReader.hpp>

+ 15 - 0
include/ls_std/ls_std_encoding.hpp

@@ -0,0 +1,15 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-05-17
+ * Changed:         2022-05-17
+ *
+ * */
+
+#ifndef LS_STD_LS_STD_ENCODING_HPP
+#define LS_STD_LS_STD_ENCODING_HPP
+
+#include <ls_std/encoding/Base64.hpp>
+
+#endif

+ 193 - 0
source/ls_std/encoding/Base64.cpp

@@ -0,0 +1,193 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-01-03
+ * Changed:         2022-05-20
+ *
+ * */
+
+#include <ls_std/encoding/Base64.hpp>
+#include <bitset>
+
+std::string ls::std::encoding::Base64::encode(const ::std::string &_sequence)
+{
+  ::std::string encodedString{};
+
+  for(size_t index = 0 ; index < _sequence.size() ; index += 3)
+  {
+    ::std::string byteTriple = ls::std::encoding::Base64::_getNextByteTriple(_sequence, index);
+    encodedString += ls::std::encoding::Base64::_encodeByteTriple(byteTriple);
+  }
+
+  return ls::std::encoding::Base64::_applyEndingRule(encodedString, _sequence.size());
+}
+
+std::string ls::std::encoding::Base64::decode(const ::std::string &_sequence)
+{
+  ::std::string decodedString{};
+
+  for (int index{} ; index < _sequence.size() ; index += 4)
+  {
+    ::std::string quadruple = ls::std::encoding::Base64::_getNextByteQuadruple(_sequence, index);
+    decodedString += ls::std::encoding::Base64::_decodeByteQuadruple(quadruple);
+  }
+
+  return decodedString;
+}
+
+::std::string ls::std::encoding::Base64::_applyEndingRule(::std::string _encodedString, size_t _sequenceSize)
+{
+  size_t size = _encodedString.size();
+
+  if (_sequenceSize % 3 == 1)
+  {
+    _encodedString[size - 2] = '=';
+    _encodedString[size - 1] = '=';
+  }
+
+  if (_sequenceSize % 3 == 2)
+  {
+    _encodedString[size - 1] = '=';
+  }
+
+  return _encodedString;
+}
+
+std::string ls::std::encoding::Base64::_decodeByteQuadruple(const ::std::string& _quadruple)
+{
+  ::std::string decodedText{};
+  uint8_t shiftValue = 16;
+  uint32_t bitStorage = ls::std::encoding::Base64::_toDecodingBitStorage(_quadruple);
+
+  for (uint8_t index = 0; index < ((uint8_t) _quadruple.size() - 1); index++)
+  {
+    uint32_t bitMask = ls::std::encoding::Base64::_generateBitMask(255, shiftValue);
+    uint32_t bitSequence = ls::std::encoding::Base64::_extractBitSequence(bitMask, bitStorage);
+    bitSequence = bitSequence >> shiftValue;
+
+    decodedText += (char) bitSequence;
+    shiftValue -= 8;
+  }
+
+  return decodedText;
+}
+
+std::string ls::std::encoding::Base64::_encodeByteTriple(const ::std::string& _byteTriple)
+{
+  ::std::string encodedText{};
+  uint32_t bitStorage = ls::std::encoding::Base64::_toEncodingBitStorage(_byteTriple);
+  static ::std::vector<uint32_t> bitMaskStorage = {16515072, 258048, 4032, 63};
+  static ::std::unordered_map<uint8_t, char> encodingMap = ls::std::encoding::Base64::_getEncodingMap();
+  uint8_t shiftValue = 18;
+
+  for (uint8_t bitMaskIndex = 0 ; bitMaskIndex < 4 ; bitMaskIndex++)
+  {
+    uint32_t extractedBitSequence = ls::std::encoding::Base64::_extractBitSequence(bitMaskStorage[bitMaskIndex], bitStorage);
+    extractedBitSequence = extractedBitSequence >> shiftValue;
+    encodedText += encodingMap[(uint8_t) extractedBitSequence];
+    shiftValue -= 6;
+  }
+
+  return encodedText;
+}
+
+uint32_t ls::std::encoding::Base64::_extractBitSequence(uint32_t _bitMask, uint32_t _bitStorage)
+{
+  return _bitStorage & _bitMask;
+}
+
+uint32_t ls::std::encoding::Base64::_generateBitMask(uint32_t _maskValue, uint8_t _shiftValue)
+{
+  if(_shiftValue == 0)
+  {
+    return _maskValue;
+  }
+
+  if(_shiftValue < 0)
+  {
+    return _maskValue >> _shiftValue;
+  }
+
+  return _maskValue << _shiftValue;
+}
+
+std::unordered_map<char, uint8_t> ls::std::encoding::Base64::_getDecodingMap()
+{
+  static ::std::unordered_map<char, uint8_t> decodingMap =
+  {
+    {'A', 0}, {'B', 1}, {'C', 2}, {'D', 3}, {'E', 4}, {'F', 5}, {'G', 6}, {'H', 7},
+    {'I', 8}, {'J', 9}, {'K', 10}, {'L', 11}, {'M', 12}, {'N', 13}, {'O', 14}, {'P', 15},
+    {'Q', 16}, {'R', 17}, {'S', 18}, {'T', 19}, {'U', 20}, {'V', 21}, {'W', 22}, {'X', 23},
+    {'Y', 24}, {'Z', 25}, {'a', 26}, {'b', 27}, {'c', 28}, {'d', 29}, {'e', 30}, {'f', 31},
+    {'g', 32}, {'h', 33}, {'i', 34}, {'j', 35}, {'k', 36}, {'l', 37}, {'m', 38}, {'n', 39},
+    {'o', 40}, {'p', 41}, {'q', 42}, {'r', 43}, {'s', 44}, {'t', 45}, {'u', 46}, {'v', 47},
+    {'w', 48}, {'x', 49}, {'y', 50}, {'z', 51}, {'0', 52}, {'1', 53}, {'2', 54}, {'3', 55},
+    {'4', 56}, {'5', 57}, {'6', 58}, {'7', 59}, {'8', 60}, {'9', 61}, {'+', 62}, {'/', 63}
+  };
+
+  return decodingMap;
+}
+
+std::unordered_map<uint8_t, char> ls::std::encoding::Base64::_getEncodingMap()
+{
+  static ::std::unordered_map<uint8_t, char> encodingMap =
+  {
+    {0, 'A'}, {1, 'B'}, {2, 'C'}, {3, 'D'}, {4, 'E'}, {5, 'F'}, {6, 'G'}, {7, 'H'},
+    {8, 'I'}, {9, 'J'}, {10, 'K'}, {11, 'L'}, {12, 'M'}, {13, 'N'}, {14, 'O'}, {15, 'P'},
+    {16, 'Q'}, {17, 'R'}, {18, 'S'}, {19, 'T'}, {20, 'U'}, {21, 'V'}, {22, 'W'}, {23, 'X'},
+    {24, 'Y'}, {25, 'Z'}, {26, 'a'}, {27, 'b'}, {28, 'c'}, {29, 'd'}, {30, 'e'}, {31, 'f'},
+    {32, 'g'}, {33, 'h'}, {34, 'i'}, {35, 'j'}, {36, 'k'}, {37, 'l'}, {38, 'm'}, {39, 'n'},
+    {40, 'o'}, {41, 'p'}, {42, 'q'}, {43, 'r'}, {44, 's'}, {45, 't'}, {46, 'u'}, {47, 'v'},
+    {48, 'w'}, {49, 'x'}, {50, 'y'}, {51, 'z'}, {52, '0'}, {53, '1'}, {54, '2'}, {55, '3'},
+    {56, '4'}, {57, '5'}, {58, '6'}, {59, '7'}, {60, '8'}, {61, '9'}, {62, '+'}, {63, '/'},
+  };
+
+  return encodingMap;
+}
+
+std::string ls::std::encoding::Base64::_getNextByteQuadruple(const ::std::string &_sequence, size_t _index)
+{
+  return _sequence.substr(_index, 4);
+}
+
+std::string ls::std::encoding::Base64::_getNextByteTriple(const ::std::string &_sequence, size_t _index)
+{
+  return _sequence.substr(_index, 3);
+}
+
+void ls::std::encoding::Base64::_mergeBitSequence(uint32_t &_bitStorage, const uint32_t &_bitMask)
+{
+  _bitStorage = _bitStorage | _bitMask;
+}
+
+uint32_t ls::std::encoding::Base64::_toDecodingBitStorage(const ::std::string &_quadruple)
+{
+  uint32_t bitStorage{};
+  uint8_t letterCounter = 1;
+  ::std::unordered_map<char, uint8_t> decodingMap = ls::std::encoding::Base64::_getDecodingMap();
+
+  for(char letter : _quadruple)
+  {
+    uint32_t bitMask = ls::std::encoding::Base64::_generateBitMask(decodingMap[(char) letter], (4 - letterCounter) * 6); // must be hardcoded - even in case of less than 4 characters, so that conversion is correct
+    ls::std::encoding::Base64::_mergeBitSequence(bitStorage, bitMask);
+    ++letterCounter;
+  }
+
+  return bitStorage;
+}
+
+uint32_t ls::std::encoding::Base64::_toEncodingBitStorage(const ::std::string &_triple)
+{
+  uint32_t bitStorage{};
+  uint8_t shiftValue = 16;
+
+  for(char letter : _triple)
+  {
+    uint32_t bitMask = ls::std::encoding::Base64::_generateBitMask((uint8_t) letter, shiftValue);
+    ls::std::encoding::Base64::_mergeBitSequence(bitStorage, bitMask);
+    shiftValue -= 8;
+  }
+
+  return bitStorage;
+}

+ 3 - 3
source/ls_std/event/EventManager.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -15,7 +15,7 @@
 ls::std::event::EventManager::EventManager() : ls::std::core::Class("EventManager")
 {}
 
-void ls::std::event::EventManager::subscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener)
+void ls::std::event::EventManager::subscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener)
 {
   if (_id.empty() || _listener == nullptr)
   {
@@ -32,7 +32,7 @@ void ls::std::event::EventManager::subscribe(const ls::std::core::type::event_id
   }
 }
 
-void ls::std::event::EventManager::unsubscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener)
+void ls::std::event::EventManager::unsubscribe(const ls::std::core::type::event_id &_id, const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener)
 {
   if (_id.empty() || _listener == nullptr)
   {

+ 4 - 4
source/ls_std/event/Narrator.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -14,7 +14,7 @@
 ls::std::event::Narrator::Narrator() : ls::std::core::Class("Narrator")
 {}
 
-bool ls::std::event::Narrator::addListener(const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener)
+bool ls::std::event::Narrator::addListener(const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener)
 {
   bool wasAdded{};
 
@@ -39,12 +39,12 @@ void ls::std::event::Narrator::clear()
   this->listeners.clear();
 }
 
-std::list<std::shared_ptr<ls::std::core::interface::IListener>> ls::std::event::Narrator::getListeners()
+std::list<std::shared_ptr<ls::std::core::interface_type::IListener>> ls::std::event::Narrator::getListeners()
 {
   return this->listeners;
 }
 
-bool ls::std::event::Narrator::removeListener(const ::std::shared_ptr<ls::std::core::interface::IListener> &_listener)
+bool ls::std::event::Narrator::removeListener(const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener)
 {
   bool wasRemoved{};
 

+ 3 - 3
source/ls_std/io/logging/Logger.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-20
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -13,7 +13,7 @@
 #include <ls_std/io/NewLine.hpp>
 #include <ls_std/core/exception/IllegalArgumentException.hpp>
 
-ls::std::io::Logger::Logger(const ::std::shared_ptr<ls::std::core::interface::IWriter> &_writer)
+ls::std::io::Logger::Logger(const ::std::shared_ptr<ls::std::core::interface_type::IWriter> &_writer)
     : ls::std::core::Class("Logger"),
       logLevel(ls::std::io::LogLevelValue::INFO)
 {
@@ -78,7 +78,7 @@ void ls::std::io::Logger::warn(const ls::std::core::type::byte *_data)
   }
 }
 
-void ls::std::io::Logger::_assignWriter(const ::std::shared_ptr<ls::std::core::interface::IWriter> &_writer)
+void ls::std::io::Logger::_assignWriter(const ::std::shared_ptr<ls::std::core::interface_type::IWriter> &_writer)
 {
   if (_writer == nullptr)
   {

+ 2 - 2
test/TestHelper.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-15
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -156,7 +156,7 @@ namespace ls_std_test
 
       #ifdef _WIN32
 
-      ::std::string _getWorkingDirectoryWindows()
+      static ::std::string _getWorkingDirectoryWindows()
       {
         ::std::string workingDirectory{};
         TCHAR buffer[MAX_PATH];

+ 48 - 0
test/cases/encoding/Base64Test.cpp

@@ -0,0 +1,48 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-01-08
+ * Changed:         2022-05-20
+ *
+ * */
+
+#include <gtest/gtest.h>
+#include <ls_std/ls_std_encoding.hpp>
+
+namespace
+{
+  class Base64Test : public ::testing::Test
+  {
+    protected:
+
+      Base64Test() = default;
+      ~Base64Test() override = default;
+
+      void SetUp() override
+      {}
+
+      void TearDown() override
+      {}
+  };
+
+  TEST_F(Base64Test, encode)
+  {
+    ls::std::encoding::Base64 base64{};
+
+    ASSERT_STREQ("YWJj", base64.encode("abc").c_str());
+    ASSERT_STREQ("YWJjZGU=", base64.encode("abcde").c_str());
+    ASSERT_STREQ("SGVsbG8gQysrIQ==", base64.encode("Hello C++!").c_str());
+    ASSERT_STREQ("UG9seWZvbiB6d2l0c2NoZXJuZCBhw59lbiBNw6R4Y2hlbnMgVsO2Z2VsIFLDvGJlbiwgSm9naHVydCB1bmQgUXVhcms=", base64.encode("Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark").c_str());
+  }
+
+  TEST_F(Base64Test, decode)
+  {
+    ls::std::encoding::Base64 base64{};
+
+    ASSERT_STREQ("abc", base64.decode("YWJj").c_str());
+    ASSERT_STREQ("abcde", base64.decode("YWJjZGU=").c_str());
+    ASSERT_STREQ("Hello C++!", base64.decode("SGVsbG8gQysrIQ==").c_str());
+    ASSERT_STREQ("Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark", base64.decode("UG9seWZvbiB6d2l0c2NoZXJuZCBhw59lbiBNw6R4Y2hlbnMgVsO2Z2VsIFLDvGJlbiwgSm9naHVydCB1bmQgUXVhcms=").c_str());
+  }
+}

+ 15 - 15
test/cases/event/NarratorTest.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -47,9 +47,9 @@ namespace
     this->createCars();
     ls::std::event::Narrator paintingMachine{};
 
-    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes1)));
-    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes2)));
-    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes3)));
+    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes1)));
+    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes2)));
+    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes3)));
   }
 
   TEST_F(NarratorTest, addListener_listener_already_exists)
@@ -57,8 +57,8 @@ namespace
     this->createCars();
     ls::std::event::Narrator paintingMachine{};
 
-    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes1)));
-    ASSERT_FALSE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes1)));
+    ASSERT_TRUE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes1)));
+    ASSERT_FALSE(paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes1)));
   }
 
   TEST_F(NarratorTest, addListener_no_reference)
@@ -80,9 +80,9 @@ namespace
   {
     this->createCars();
     ls::std::event::Narrator paintingMachine{};
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes1));
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes2));
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes3));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes1));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes2));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes3));
 
     ASSERT_FALSE(paintingMachine.getListeners().empty());
     paintingMachine.clear();
@@ -99,9 +99,9 @@ namespace
   {
     this->createCars();
     ls::std::event::Narrator paintingMachine{};
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes1));
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes2));
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes3));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes1));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes2));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes3));
 
     ASSERT_TRUE(paintingMachine.removeListener(this->mercedes2));
     ASSERT_TRUE(paintingMachine.removeListener(this->mercedes1));
@@ -135,9 +135,9 @@ namespace
   {
     this->createCars();
     ls::std::event::Narrator paintingMachine{};
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes1));
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes2));
-    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface::IListener>(this->mercedes3));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes1));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes2));
+    paintingMachine.addListener(std::dynamic_pointer_cast<ls::std::core::interface_type::IListener>(this->mercedes3));
 
     ASSERT_STREQ("pink", this->mercedes1->getColor().c_str());
     ASSERT_STREQ("blue", this->mercedes2->getColor().c_str());

+ 9 - 9
test/cases/io/logging/LoggerTest.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-20
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -27,7 +27,7 @@ namespace
       void TearDown() override
       {}
 
-      static std::shared_ptr<ls::std::core::interface::IWriter> createFileLogger(const std::string &_logName)
+      static std::shared_ptr<ls::std::core::interface_type::IWriter> createFileLogger(const std::string &_logName)
       {
         std::string path = ls_std_test::TestHelper::getResourcesFolderLocation() + _logName;
         ls::std::io::File file{path};
@@ -37,7 +37,7 @@ namespace
           file.createNewFile();
         }
 
-        std::shared_ptr<ls::std::core::interface::IWriter> writer = std::dynamic_pointer_cast<ls::std::core::interface::IWriter>(std::make_shared<ls::std::io::FileOutputStream>(file));
+        std::shared_ptr<ls::std::core::interface_type::IWriter> writer = std::dynamic_pointer_cast<ls::std::core::interface_type::IWriter>(std::make_shared<ls::std::io::FileOutputStream>(file));
 
         return writer;
       }
@@ -72,7 +72,7 @@ namespace
     // write to log file
 
     std::string logName = "output_debug.log";
-    std::shared_ptr<ls::std::core::interface::IWriter> writer = createFileLogger(logName);
+    std::shared_ptr<ls::std::core::interface_type::IWriter> writer = createFileLogger(logName);
 
     ls::std::io::Logger logger{writer};
     logger.setLogLevel(ls::std::io::LogLevelValue::DEBUG);
@@ -101,7 +101,7 @@ namespace
     // write to log file
 
     std::string logName = "output_error.log";
-    std::shared_ptr<ls::std::core::interface::IWriter> writer = createFileLogger(logName);
+    std::shared_ptr<ls::std::core::interface_type::IWriter> writer = createFileLogger(logName);
 
     ls::std::io::Logger logger{writer};
     logger.setLogLevel(ls::std::io::LogLevelValue::ERR);
@@ -130,7 +130,7 @@ namespace
     // write to log file
 
     std::string logName = "output_fatal.log";
-    std::shared_ptr<ls::std::core::interface::IWriter> writer = createFileLogger(logName);
+    std::shared_ptr<ls::std::core::interface_type::IWriter> writer = createFileLogger(logName);
 
     ls::std::io::Logger logger{writer};
     logger.setLogLevel(ls::std::io::LogLevelValue::FATAL);
@@ -165,7 +165,7 @@ namespace
     // write to log file
 
     std::string logName = "output_info.log";
-    std::shared_ptr<ls::std::core::interface::IWriter> writer = createFileLogger(logName);
+    std::shared_ptr<ls::std::core::interface_type::IWriter> writer = createFileLogger(logName);
 
     ls::std::io::Logger logger{writer};
     logger.setLogLevel(ls::std::io::LogLevelValue::INFO);
@@ -202,7 +202,7 @@ namespace
     // write to log file
 
     std::string logName = "output_trace.log";
-    std::shared_ptr<ls::std::core::interface::IWriter> writer = createFileLogger(logName);
+    std::shared_ptr<ls::std::core::interface_type::IWriter> writer = createFileLogger(logName);
 
     ls::std::io::Logger logger{writer};
     logger.setLogLevel(ls::std::io::LogLevelValue::TRACE);
@@ -231,7 +231,7 @@ namespace
     // write to log file
 
     std::string logName = "output_warn.log";
-    std::shared_ptr<ls::std::core::interface::IWriter> writer = createFileLogger(logName);
+    std::shared_ptr<ls::std::core::interface_type::IWriter> writer = createFileLogger(logName);
 
     ls::std::io::Logger logger{writer};
     logger.setLogLevel(ls::std::io::LogLevelValue::WARN);

+ 2 - 2
test/classes/event/DailyNewsAgency.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@
 
 namespace ls_std_event_test
 {
-  class DailyNewsAgency : public ls_std_event_test::NewsAgency, public ls::std::core::interface::IListener
+  class DailyNewsAgency : public ls_std_event_test::NewsAgency, public ls::std::core::interface_type::IListener
   {
     public:
 

+ 2 - 2
test/classes/event/GossipNewsAgency.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -18,7 +18,7 @@
 
 namespace ls_std_event_test
 {
-  class GossipNewsAgency : public ls_std_event_test::NewsAgency, public ls::std::core::interface::IListener
+  class GossipNewsAgency : public ls_std_event_test::NewsAgency, public ls::std::core::interface_type::IListener
   {
     public:
 

+ 2 - 2
test/classes/event/TestDataMercedesCar.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-14
- * Changed:         2022-05-16
+ * Changed:         2022-05-19
  *
  * */
 
@@ -15,7 +15,7 @@
 
 namespace ls_std_event_test
 {
-  class TestDataMercedesCar : public ls_std_event_test::TestDataCar, public ls::std::core::interface::IListener
+  class TestDataMercedesCar : public ls_std_event_test::TestDataCar, public ls::std::core::interface_type::IListener
   {
     public: