Browse Source

Merge branch '2023.1.0-rc' of public/ls-standard-library into master

patrick-christopher.mattulat 1 year ago
parent
commit
ffdd791067
100 changed files with 3046 additions and 572 deletions
  1. 70 0
      .clang-format
  2. 147 0
      .clang-tidy
  3. 1 0
      .gitignore
  4. 322 232
      CMakeLists.txt
  5. 87 39
      README.md
  6. 0 47
      config/LynarStudiosStyle.xml
  7. 20 0
      config/clion-lynar-studios-analysis-profile.xml
  8. 0 0
      doc/check-list.txt
  9. 0 0
      doc/event-handling-uml.png
  10. 0 13
      doc/kv_file_definition.md
  11. BIN
      doc/section-pair-2023-standard.odt
  12. 0 0
      doc/state-machine-test.png
  13. 10 14
      include/ls-std/boxing/Boolean.hpp
  14. 8 12
      include/ls-std/boxing/Double.hpp
  15. 8 12
      include/ls-std/boxing/Float.hpp
  16. 6 10
      include/ls-std/boxing/Integer.hpp
  17. 7 11
      include/ls-std/boxing/Long.hpp
  18. 21 26
      include/ls-std/boxing/String.hpp
  19. 4 4
      include/ls-std/core/Class.hpp
  20. 33 0
      include/ls-std/core/ConditionalFunctionExecutor.hpp
  21. 10 4
      include/ls-std/core/LibraryVersion.hpp
  22. 8 8
      include/ls-std/core/Version.hpp
  23. 36 0
      include/ls-std/core/evaluator/EmptyStringArgumentEvaluator.hpp
  24. 37 0
      include/ls-std/core/evaluator/IndexOutOfBoundsEvaluator.hpp
  25. 37 0
      include/ls-std/core/evaluator/NullPointerArgumentEvaluator.hpp
  26. 37 0
      include/ls-std/core/evaluator/NullPointerEvaluator.hpp
  27. 31 0
      include/ls-std/core/exception/EventNotHandledException.hpp
  28. 31 0
      include/ls-std/core/exception/EventNotSubscribedException.hpp
  29. 36 0
      include/ls-std/core/exception/Exception.hpp
  30. 33 0
      include/ls-std/core/exception/ExceptionMessage.hpp
  31. 31 0
      include/ls-std/core/exception/FileNotFoundException.hpp
  32. 31 0
      include/ls-std/core/exception/FileOperationException.hpp
  33. 31 0
      include/ls-std/core/exception/IllegalArgumentException.hpp
  34. 31 0
      include/ls-std/core/exception/IllegalArithmeticOperationException.hpp
  35. 31 0
      include/ls-std/core/exception/IncompleteJsonException.hpp
  36. 31 0
      include/ls-std/core/exception/IndexOutOfBoundsException.hpp
  37. 31 0
      include/ls-std/core/exception/NullPointerException.hpp
  38. 5 4
      include/ls-std/core/interface/IBoxing.hpp
  39. 6 2
      include/ls-std/core/interface/IEncoding.hpp
  40. 28 0
      include/ls-std/core/interface/IEvaluator.hpp
  41. 7 6
      include/ls-std/core/interface/IEventSubscriber.hpp
  42. 6 5
      include/ls-std/core/interface/IListener.hpp
  43. 6 5
      include/ls-std/core/interface/IReader.hpp
  44. 8 7
      include/ls-std/core/interface/ISerializable.hpp
  45. 6 5
      include/ls-std/core/interface/IStorable.hpp
  46. 28 0
      include/ls-std/core/interface/IValidator.hpp
  47. 6 5
      include/ls-std/core/interface/IWriter.hpp
  48. 2 2
      include/ls-std/core/type/EventTypes.hpp
  49. 3 3
      include/ls-std/core/type/Types.hpp
  50. 50 0
      include/ls-std/encoding/Base64.hpp
  51. 11 11
      include/ls-std/event/Event.hpp
  52. 8 8
      include/ls-std/event/EventHandler.hpp
  53. 12 12
      include/ls-std/event/EventManager.hpp
  54. 10 8
      include/ls-std/event/Narrator.hpp
  55. 9 9
      include/ls-std/event/serialization/SerializableJsonEvent.hpp
  56. 117 0
      include/ls-std/io/File.hpp
  57. 6 6
      include/ls-std/io/FileOutputStream.hpp
  58. 31 0
      include/ls-std/io/FilePathSeparator.hpp
  59. 28 0
      include/ls-std/io/FilePathSeparatorMatch.hpp
  60. 6 8
      include/ls-std/io/FileReader.hpp
  61. 6 8
      include/ls-std/io/FileWriter.hpp
  62. 31 0
      include/ls-std/io/NewLine.hpp
  63. 6 6
      include/ls-std/io/StandardOutputWriter.hpp
  64. 8 8
      include/ls-std/io/StorableFile.hpp
  65. 35 0
      include/ls-std/io/evaluator/FileExistenceEvaluator.hpp
  66. 10 10
      include/ls-std/io/logging/LogLevel.hpp
  67. 7 2
      include/ls-std/io/logging/LogLevelValue.hpp
  68. 53 0
      include/ls-std/io/logging/Logger.hpp
  69. 29 0
      include/ls-std/io/section-pair/SectionPairMessageFormatter.hpp
  70. 23 0
      include/ls-std/io/section-pair/SectionPairRowEnumType.hpp
  71. 21 0
      include/ls-std/io/section-pair/SectionPairTypes.hpp
  72. 35 0
      include/ls-std/io/section-pair/evaluator/SectionPairIdentifierArgumentEvaluator.hpp
  73. 35 0
      include/ls-std/io/section-pair/evaluator/SectionPairRowArgumentEvaluator.hpp
  74. 35 0
      include/ls-std/io/section-pair/evaluator/SectionPairRowListValueArgumentEvaluator.hpp
  75. 35 0
      include/ls-std/io/section-pair/evaluator/SectionPairRowSingleValueArgumentEvaluator.hpp
  76. 35 0
      include/ls-std/io/section-pair/evaluator/SectionPairSectionArgumentEvaluator.hpp
  77. 36 0
      include/ls-std/io/section-pair/evaluator/SectionPairValueArgumentEvaluator.hpp
  78. 55 0
      include/ls-std/io/section-pair/model/SectionPairDocument.hpp
  79. 53 0
      include/ls-std/io/section-pair/model/SectionPairRow.hpp
  80. 46 0
      include/ls-std/io/section-pair/model/SectionPairRowListValue.hpp
  81. 45 0
      include/ls-std/io/section-pair/model/SectionPairRowSingleValue.hpp
  82. 38 0
      include/ls-std/io/section-pair/model/SectionPairRowValue.hpp
  83. 59 0
      include/ls-std/io/section-pair/model/SectionPairSection.hpp
  84. 42 0
      include/ls-std/io/section-pair/reader/SectionPairFileReader.hpp
  85. 47 0
      include/ls-std/io/section-pair/reader/SectionPairFileReaderParameter.hpp
  86. 43 0
      include/ls-std/io/section-pair/serialization/SerializableSectionPairDocument.hpp
  87. 39 0
      include/ls-std/io/section-pair/serialization/SerializableSectionPairParameter.hpp
  88. 43 0
      include/ls-std/io/section-pair/serialization/SerializableSectionPairRow.hpp
  89. 41 0
      include/ls-std/io/section-pair/serialization/SerializableSectionPairRowListValue.hpp
  90. 38 0
      include/ls-std/io/section-pair/serialization/SerializableSectionPairRowSingleValue.hpp
  91. 53 0
      include/ls-std/io/section-pair/serialization/SerializableSectionPairSection.hpp
  92. 23 0
      include/ls-std/io/section-pair/type/SectionPairDocumentTypes.hpp
  93. 23 0
      include/ls-std/io/section-pair/type/SectionPairSectionTypes.hpp
  94. 37 0
      include/ls-std/io/section-pair/validator/SectionPairDocumentValidator.hpp
  95. 35 0
      include/ls-std/io/section-pair/validator/SectionPairFileExtensionValidator.hpp
  96. 39 0
      include/ls-std/io/section-pair/validator/SectionPairIdentifierValidator.hpp
  97. 38 0
      include/ls-std/io/section-pair/validator/SectionPairRowListValueValidator.hpp
  98. 37 0
      include/ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.hpp
  99. 38 0
      include/ls-std/io/section-pair/validator/SectionPairRowValidator.hpp
  100. 38 0
      include/ls-std/io/section-pair/validator/SectionPairSectionValidator.hpp

+ 70 - 0
.clang-format

@@ -0,0 +1,70 @@
+# Generated from CLion C/C++ Code Style settings
+BasedOnStyle: LLVM
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: None
+AlignOperands: Align
+AllowAllArgumentsOnNextLine: false
+AllowAllConstructorInitializersOnNextLine: false
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortBlocksOnASingleLine: Always
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortIfStatementsOnASingleLine: Never
+AllowShortLambdasOnASingleLine: All
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterReturnType: None
+AlwaysBreakTemplateDeclarations: Yes
+BreakBeforeBraces: Custom
+BraceWrapping:
+  AfterCaseLabel: true
+  AfterClass: true
+  AfterControlStatement: Always
+  AfterEnum: true
+  AfterFunction: true
+  AfterNamespace: true
+  AfterStruct: true
+  AfterUnion: true
+  BeforeCatch: true
+  BeforeElse: true
+  IndentBraces: false
+  SplitEmptyFunction: false
+  SplitEmptyRecord: true
+BreakBeforeBinaryOperators: None
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: BeforeColon
+BreakInheritanceList: BeforeColon
+ColumnLimit: 700
+CompactNamespaces: true
+ContinuationIndentWidth: 4
+EmptyLineAfterAccessModifier: Always
+FixNamespaceComments: false
+IndentAccessModifiers: true
+IndentCaseLabels: true
+IndentPPDirectives: BeforeHash
+IndentWidth: 2
+KeepEmptyLinesAtTheStartOfBlocks: true
+MaxEmptyLinesToKeep: 2
+NamespaceIndentation: All
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PointerAlignment: Right
+ReflowComments: false
+SortIncludes: CaseSensitive
+SpaceAfterCStyleCast: true
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInCStyleCastParentheses: false
+SpacesInContainerLiterals: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+TabWidth: 2
+UseTab: Never

+ 147 - 0
.clang-tidy

@@ -0,0 +1,147 @@
+# Generated from CLion Inspection settings
+---
+Checks: '-*,
+bugprone-argument-comment,
+bugprone-assert-side-effect,
+bugprone-bad-signal-to-kill-thread,
+bugprone-branch-clone,
+bugprone-copy-constructor-init,
+bugprone-dangling-handle,
+bugprone-dynamic-static-initializers,
+bugprone-fold-init-type,
+bugprone-forward-declaration-namespace,
+bugprone-forwarding-reference-overload,
+bugprone-inaccurate-erase,
+bugprone-incorrect-roundings,
+bugprone-integer-division,
+bugprone-lambda-function-name,
+bugprone-macro-parentheses,
+bugprone-macro-repeated-side-effects,
+bugprone-misplaced-operator-in-strlen-in-alloc,
+bugprone-misplaced-pointer-arithmetic-in-alloc,
+bugprone-misplaced-widening-cast,
+bugprone-move-forwarding-reference,
+bugprone-multiple-statement-macro,
+bugprone-no-escape,
+bugprone-not-null-terminated-result,
+bugprone-parent-virtual-call,
+bugprone-posix-return,
+bugprone-reserved-identifier,
+bugprone-sizeof-container,
+bugprone-sizeof-expression,
+bugprone-spuriously-wake-up-functions,
+bugprone-string-constructor,
+bugprone-string-integer-assignment,
+bugprone-string-literal-with-embedded-nul,
+bugprone-suspicious-enum-usage,
+bugprone-suspicious-include,
+bugprone-suspicious-memory-comparison,
+bugprone-suspicious-memset-usage,
+bugprone-suspicious-missing-comma,
+bugprone-suspicious-semicolon,
+bugprone-suspicious-string-compare,
+bugprone-swapped-arguments,
+bugprone-terminating-continue,
+bugprone-throw-keyword-missing,
+bugprone-too-small-loop-variable,
+bugprone-undefined-memory-manipulation,
+bugprone-undelegated-constructor,
+bugprone-unhandled-self-assignment,
+bugprone-unused-raii,
+bugprone-unused-return-value,
+bugprone-use-after-move,
+bugprone-virtual-near-miss,
+cert-dcl21-cpp,
+cert-dcl58-cpp,
+cert-err34-c,
+cert-err52-cpp,
+cert-err60-cpp,
+cert-flp30-c,
+cert-msc50-cpp,
+cert-msc51-cpp,
+cert-str34-c,
+cppcoreguidelines-interfaces-global-init,
+cppcoreguidelines-narrowing-conversions,
+cppcoreguidelines-pro-type-member-init,
+cppcoreguidelines-pro-type-static-cast-downcast,
+cppcoreguidelines-slicing,
+google-default-arguments,
+google-explicit-constructor,
+google-runtime-operator,
+hicpp-exception-baseclass,
+hicpp-multiway-paths-covered,
+misc-misplaced-const,
+misc-new-delete-overloads,
+misc-no-recursion,
+misc-non-copyable-objects,
+misc-throw-by-value-catch-by-reference,
+misc-unconventional-assign-operator,
+misc-uniqueptr-reset-release,
+modernize-avoid-bind,
+modernize-concat-nested-namespaces,
+modernize-deprecated-headers,
+modernize-deprecated-ios-base-aliases,
+modernize-loop-convert,
+modernize-make-shared,
+modernize-make-unique,
+modernize-pass-by-value,
+modernize-raw-string-literal,
+modernize-redundant-void-arg,
+modernize-replace-auto-ptr,
+modernize-replace-disallow-copy-and-assign-macro,
+modernize-replace-random-shuffle,
+modernize-return-braced-init-list,
+modernize-shrink-to-fit,
+modernize-unary-static-assert,
+modernize-use-auto,
+modernize-use-bool-literals,
+modernize-use-emplace,
+modernize-use-equals-default,
+modernize-use-equals-delete,
+modernize-use-nodiscard,
+modernize-use-noexcept,
+modernize-use-nullptr,
+modernize-use-override,
+modernize-use-transparent-functors,
+modernize-use-uncaught-exceptions,
+mpi-buffer-deref,
+mpi-type-mismatch,
+openmp-use-default-none,
+performance-faster-string-find,
+performance-for-range-copy,
+performance-implicit-conversion-in-loop,
+performance-inefficient-algorithm,
+performance-inefficient-string-concatenation,
+performance-inefficient-vector-operation,
+performance-move-const-arg,
+performance-move-constructor-init,
+performance-no-automatic-move,
+performance-noexcept-move-constructor,
+performance-trivially-destructible,
+performance-type-promotion-in-math-fn,
+performance-unnecessary-copy-initialization,
+performance-unnecessary-value-param,
+portability-simd-intrinsics,
+readability-avoid-const-params-in-decls,
+readability-const-return-type,
+readability-container-size-empty,
+readability-convert-member-functions-to-static,
+readability-delete-null-pointer,
+readability-deleted-default,
+readability-inconsistent-declaration-parameter-name,
+readability-make-member-function-const,
+readability-misleading-indentation,
+readability-misplaced-array-index,
+readability-non-const-parameter,
+readability-redundant-control-flow,
+readability-redundant-declaration,
+readability-redundant-function-ptr-dereference,
+readability-redundant-smartptr-get,
+readability-redundant-string-cstr,
+readability-redundant-string-init,
+readability-simplify-subscript-expr,
+readability-static-accessed-through-instance,
+readability-static-definition-in-anonymous-namespace,
+readability-string-compare,
+readability-uniqueptr-delete-release,
+readability-use-anyofallof'

+ 1 - 0
.gitignore

@@ -3,4 +3,5 @@ cmake-build-debug
 cmake-build-release
 cmake-build-debug-coverage
 cmake-build-wsl_debug
+cmake-build-default
 test/TestHelper.hpp

+ 322 - 232
CMakeLists.txt

@@ -11,27 +11,27 @@
 ##########################################################
 
 cmake_minimum_required(VERSION 3.17)
-project(ls_std VERSION 2022.2.0)
+project(ls-std VERSION 2023.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)
-set(MODULE_NAME_TIME ls_std_time)
+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_TIME ls-std-time)
 
 set(GOOGLE_TEST_MODULE googletest-1.11.0)
 
+set(CLI_NAME_BASE64 cli-base64)
+
 ##########################################################
 # Options
 ##########################################################
 
 option(LS_STD_BUILD_WITH_TESTS "Build project with tests..." OFF)
 option(LS_STD_BUILD_WITH_SUPPORTED_COMPILER "Build project with supported compiler only..." 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)
+option(LS_STD_BUILD_STATIC "Build ls-std static library..." ON)
+option(LS_STD_BUILD_SHARED "Build ls-std shared library..." OFF)
 
 set(TARGET_COUNTER 0)
 
@@ -45,11 +45,6 @@ if (${LS_STD_BUILD_SHARED})
     set(GOAL "shared library")
 endif ()
 
-if (${LS_STD_BUILD_MODULE})
-    math(EXPR TARGET_COUNTER "${TARGET_COUNTER} + 1")
-    set(GOAL "module library")
-endif ()
-
 message("${PROJECT_NAME}: [Goal] ${GOAL}")
 
 if (TARGET_COUNTER GREATER 1)
@@ -82,28 +77,15 @@ if(${LS_STD_BUILD_WITH_SUPPORTED_COMPILER})
 
     if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC OR
             ${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
-            ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
+            ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang OR
+            ${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang)
         message("${PROJECT_NAME}: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} is supported...")
     else()
         message("${PROJECT_NAME}: [Error] ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} is not supported... terminated!")
         return()
     endif ()
-
-    # define which compilers are supported for shared or module goal
-
-    if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC AND ${LS_STD_BUILD_MODULE})
-        message("${PROJECT_NAME}: [Error] building \"${GOAL}\" with ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} is not supported... terminated!")
-        return()
-    endif ()
 endif()
 
-# define which goals can run tests
-
-if (${LS_STD_BUILD_WITH_TESTS} AND ${LS_STD_BUILD_MODULE})
-    message("${PROJECT_NAME}: [Error] building \"${GOAL}\" with tests is not supported... terminated!")
-    return()
-endif ()
-
 ######################################################
 # Include Directories
 ######################################################
@@ -137,68 +119,117 @@ endif ()
 ####################################################################################################################
 
 set(SOURCE_FILES_BOXING
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/boxing/Boolean.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/boxing/Double.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/boxing/Float.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/boxing/Integer.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/boxing/Long.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/boxing/String.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/boxing/Boolean.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/boxing/Double.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/boxing/Float.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/boxing/Integer.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/boxing/Long.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/boxing/String.cpp)
 
 set(SOURCE_FILES_CORE
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/core/Class.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/core/Version.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/evaluator/EmptyStringArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/evaluator/IndexOutOfBoundsEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/evaluator/NullPointerArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/evaluator/NullPointerEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/EventNotHandledException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/EventNotSubscribedException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/Exception.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/ExceptionMessage.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/FileNotFoundException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/FileOperationException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/IllegalArgumentException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/IllegalArithmeticOperationException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/IncompleteJsonException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/IndexOutOfBoundsException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/exception/NullPointerException.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IBoxing.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IEncoding.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IEventSubscriber.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IListener.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IReader.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/ISerializable.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IStorable.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/interface/IWriter.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/Class.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/ConditionalFunctionExecutor.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/core/LibraryVersion.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)
+        ${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
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/event/EventHandler.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/event/EventManager.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/event/Narrator.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/event/serialization/SerializableJsonEvent.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/event/Event.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/event/EventHandler.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/event/EventManager.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/event/Narrator.cpp)
 
 set(SOURCE_FILES_IO
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/kv/KvDocument.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/kv/KvFileReader.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/kv/KvPair.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/kv/KvParser.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/logging/Logger.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/logging/LogLevel.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/xml/XmlAttribute.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/xml/XmlDeclaration.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/xml/XmlDocument.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/xml/XmlNode.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/xml/XmlParser.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/xml/XmlReader.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/File.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/FileOutputStream.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/FileReader.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/FileWriter.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/StandardOutputWriter.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/StorableFile.cpp)
-
-set(SOURCE_FILES_LOGIC
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/logic/serialization/SerializableJsonState.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/logic/serialization/SerializableJsonStateConnection.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/logic/serialization/SerializableJsonStateMachine.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/logic/State.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/logic/StateConnection.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/logic/StateMachine.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/evaluator/FileExistenceEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/logging/Logger.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/logging/LogLevel.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/evaluator/SectionPairIdentifierArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/evaluator/SectionPairRowArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/evaluator/SectionPairRowListValueArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/evaluator/SectionPairRowSingleValueArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/evaluator/SectionPairSectionArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/evaluator/SectionPairValueArgumentEvaluator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairDocument.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairRow.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairRowListValue.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairRowSingleValue.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairRowValue.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairSection.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/reader/SectionPairFileReader.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/reader/SectionPairFileReaderParameter.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairDocument.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairParameter.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairRow.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairRowListValue.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairRowSingleValue.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairSection.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairDocumentValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairFileExtensionValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairIdentifierValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairRowListValueValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairRowValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairSectionValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairValueValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/SectionPairMessageFormatter.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlAttribute.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlDeclaration.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlDocument.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlNode.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlParseParameter.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlParser.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlReader.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/File.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/FileOutputStream.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/FilePathSeparator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/FilePathSeparatorMatch.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/FileReader.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/FileWriter.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/NewLine.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/StandardOutputWriter.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/StorableFile.cpp)
 
 set(SOURCE_FILES_TIME
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/time/Date.cpp)
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/time/Date.cpp)
 
 ####################################################################################################################
 ####################################################################################################################
 ####################################################################################################################
-# Test Files Modularization
+# Unit Test Files Modularization
 ####################################################################################################################
 ####################################################################################################################
 ####################################################################################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    set(TEST_FILES_BOXING
+    set(UNIT_TEST_FILES_BOXING
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/BooleanTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/DoubleTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/FloatTest.cpp
@@ -206,25 +237,32 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/LongTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/boxing/StringTest.cpp)
 
-    set(TEST_FILES_CORE
+    set(UNIT_TEST_FILES_CORE
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/evaluator/EmptyStringArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/evaluator/IndexOutOfBoundsEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/evaluator/NullPointerArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/evaluator/NullPointerEvaluatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/EventNotHandledExceptionTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/EventNotSubscribedExceptionTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/ExceptionMessageTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/FileNotFoundExceptionTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/FileOperationExceptionTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/IllegalArgumentExceptionTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/IllegalArithmeticOperationExceptionTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/IncompleteJsonExceptionTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/IndexOutOfBoundsExceptionTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/exception/NullPointerExceptionTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/utils/RegexUtilsTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/utils/STLUtilsTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/ClassTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/ConditionalFunctionExecutorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/LibraryVersionTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/VersionTest.cpp)
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/core/VersionTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/core/ClassWrapper.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/core/MathOddValidator.cpp)
 
-    set(TEST_FILES_ENCODING
+    set(UNIT_TEST_FILES_ENCODING
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/encoding/Base64Test.cpp)
 
-    set(TEST_FILES_EVENT
+    set(UNIT_TEST_FILES_EVENT
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/event/serialization/SerializableJsonEventTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/event/EventHandlerTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/event/EventManagerTest.cpp
@@ -239,17 +277,43 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/event/TestDataCar.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/event/TestDataMercedesCar.cpp)
 
-    set(TEST_FILES_IO
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/kv/KvDocumentTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/kv/KvFileReaderTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/kv/KvPairTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/kv/KvParserTest.cpp
+    set(UNIT_TEST_FILES_IO
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/evaluator/FileExistenceEvaluatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/logging/LoggerTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/logging/LogLevelTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairIdentifierArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairRowArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairRowListValueArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairRowSingleValueArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairSectionArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairValueArgumentEvaluatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairDocumentTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairRowListValueTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairRowSingleValueTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairRowTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairSectionTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/reader/SectionPairFileReaderParameterTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/reader/SectionPairFileReaderTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/serialization/SerializableSectionPairDocumentTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/serialization/SerializableSectionPairParameterTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/serialization/SerializableSectionPairRowListValueTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/serialization/SerializableSectionPairRowSingleValueTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/serialization/SerializableSectionPairRowTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/serialization/SerializableSectionPairSectionTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairDocumentValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairFileExtensionValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairIdentifierValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairRowListValueValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairRowSingleValueValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairRowValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairSectionValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairValueValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/SectionPairMessageFormatterTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlAttributeTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlDeclarationTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlDocumentTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlNodeTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlParseParameterTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlParserTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlParserTestWrapperTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlReaderTest.cpp
@@ -259,111 +323,154 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/FileWriterTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/StandardOutputWriterTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/StorableFileTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/section-pair/SectionPairDocumentProvider.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/section-pair/SectionPairSectionProvider.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/section-pair/SerializableSectionPairRowProvider.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/xml/TestDataFactory.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/xml/XmlParserTestWrapper.cpp)
-
-    set(TEST_FILES_LOGIC
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/logic/serialization/SerializableJsonStateConnectionTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/logic/serialization/SerializableJsonStateMachineTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/logic/serialization/SerializableJsonStateTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/logic/StateConnectionTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/logic/StateMachineTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/logic/StateTest.cpp
-            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/logic/TestDataFactory.cpp)
-
-    set(TEST_FILES_SERIALIZATION
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/xml/XmlParserTestWrapper.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/MockFileExistenceEvaluator.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/io/MockFileReader.cpp)
+
+    set(UNIT_TEST_FILES_SERIALIZATION
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/serialization/JsonTest.cpp)
 
-    set(TEST_FILES_TIME
+    set(UNIT_TEST_FILES_TIME
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/time/DateTest.cpp)
 endif ()
 
 ####################################################################################################################
 ####################################################################################################################
 ####################################################################################################################
-# Test Suite Builds
+# Unit Test Suite Builds
 ####################################################################################################################
 ####################################################################################################################
 ####################################################################################################################
 
 ##########################################################
-# Build Tests (boxing)
+# Unit Build Tests (boxing)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_BOXING}: Building tests...")
-    add_executable(${MODULE_NAME_BOXING}_test ${TEST_FILES_BOXING})
+    message("${MODULE_NAME_BOXING}: Building unit tests...")
+    add_executable(${MODULE_NAME_BOXING}-unit-test ${UNIT_TEST_FILES_BOXING})
 endif ()
 
 ##########################################################
-# Build Tests (core)
+# Unit Build Tests (core)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_CORE}: Building tests...")
-    add_executable(${MODULE_NAME_CORE}_test ${TEST_FILES_CORE})
+    message("${MODULE_NAME_CORE}: Building unit tests...")
+    add_executable(${MODULE_NAME_CORE}-unit-test ${UNIT_TEST_FILES_CORE})
 endif ()
 
 ##########################################################
-# Build Tests (encoding)
+# Unit Build Tests (encoding)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_ENCODING}: Building tests...")
-    add_executable(${MODULE_NAME_ENCODING}_test ${TEST_FILES_ENCODING})
+    message("${MODULE_NAME_ENCODING}: Building unit tests...")
+    add_executable(${MODULE_NAME_ENCODING}-unit-test ${UNIT_TEST_FILES_ENCODING})
 endif ()
 
 ##########################################################
-# Build Tests (event)
+# Unit Build Tests (event)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_EVENT}: Building tests...")
-    add_executable(${MODULE_NAME_EVENT}_test ${TEST_FILES_EVENT})
+    message("${MODULE_NAME_EVENT}: Building unit tests...")
+    add_executable(${MODULE_NAME_EVENT}-unit-test ${UNIT_TEST_FILES_EVENT})
 endif ()
 
 ##########################################################
-# Build Tests (io)
+# Unit Build Tests (io)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_IO}: Building tests...")
-    add_executable(${MODULE_NAME_IO}_test ${TEST_FILES_IO})
+    message("${MODULE_NAME_IO}: Building unit tests...")
+    add_executable(${MODULE_NAME_IO}-unit-test
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/TestHelper.cpp
+            ${UNIT_TEST_FILES_IO})
 endif ()
 
 ##########################################################
-# Build Tests (logic)
+# Unit Build Tests (time)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_LOGIC}: Building tests...")
-    add_executable(${MODULE_NAME_LOGIC}_test ${TEST_FILES_LOGIC})
+    message("${MODULE_NAME_TIME}: Building unit tests...")
+    add_executable(${MODULE_NAME_TIME}-unit-test ${UNIT_TEST_FILES_TIME})
 endif ()
 
 ##########################################################
-# Build Tests (time)
+# Unit Build Tests (all)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_TIME}: Building tests...")
-    add_executable(${MODULE_NAME_TIME}_test ${TEST_FILES_TIME})
+    message("${PROJECT_NAME}: Building unit tests...")
+    add_executable(${PROJECT_NAME}-unit-test
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/TestHelper.cpp
+            ${UNIT_TEST_FILES_BOXING}
+            ${UNIT_TEST_FILES_CORE}
+            ${UNIT_TEST_FILES_ENCODING}
+            ${UNIT_TEST_FILES_EVENT}
+            ${UNIT_TEST_FILES_IO}
+            ${UNIT_TEST_FILES_SERIALIZATION}
+            ${UNIT_TEST_FILES_TIME})
 endif ()
 
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Integration Test Files Modularization
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
+if (${LS_STD_BUILD_WITH_TESTS})
+    set(INTEGRATION_TEST_FILES_IO
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/reader/SectionPairFileReaderIT.cpp)
+endif ()
+
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Integration Test Suite Builds
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
 ##########################################################
-# Build Tests (all)
+# Integration Build Tests (io)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${PROJECT_NAME}: Building tests...")
-    add_executable(${PROJECT_NAME}_test
-            ${TEST_FILES_BOXING}
-            ${TEST_FILES_CORE}
-            ${TEST_FILES_ENCODING}
-            ${TEST_FILES_EVENT}
-            ${TEST_FILES_IO}
-            ${TEST_FILES_LOGIC}
-            ${TEST_FILES_SERIALIZATION}
-            ${TEST_FILES_TIME})
+    message("${MODULE_NAME_IO}: Building integration tests...")
+    add_executable(${MODULE_NAME_IO}-integration-test
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/TestHelper.cpp
+            ${INTEGRATION_TEST_FILES_IO})
+endif ()
+
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Whole Test Suite Builds
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
+if (${LS_STD_BUILD_WITH_TESTS})
+    message("${PROJECT_NAME}: Building all tests...")
+    add_executable(${PROJECT_NAME}-test
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/classes/TestHelper.cpp
+            ${UNIT_TEST_FILES_BOXING}
+            ${UNIT_TEST_FILES_CORE}
+            ${UNIT_TEST_FILES_ENCODING}
+            ${UNIT_TEST_FILES_EVENT}
+            ${UNIT_TEST_FILES_IO}
+            ${INTEGRATION_TEST_FILES_IO}
+            ${UNIT_TEST_FILES_SERIALIZATION}
+            ${UNIT_TEST_FILES_TIME})
 endif ()
 
 ####################################################################################################################
@@ -382,18 +489,13 @@ message("${PROJECT_NAME}: Building ${MODULE_NAME_BOXING} library version ${PROJE
 
 if (${LS_STD_BUILD_STATIC})
     add_library("${MODULE_NAME_BOXING}" STATIC ${SOURCE_FILES_BOXING})
-    set_target_properties("${MODULE_NAME_BOXING}" PROPERTIES DEBUG_POSTFIX "_d")
+    set_target_properties("${MODULE_NAME_BOXING}" PROPERTIES DEBUG_POSTFIX "-d")
 endif ()
 
 if (${LS_STD_BUILD_SHARED})
     add_library("${MODULE_NAME_BOXING}" SHARED ${SOURCE_FILES_BOXING})
     target_link_libraries("${MODULE_NAME_BOXING}" ${MODULE_NAME_CORE})
-    set_target_properties("${MODULE_NAME_BOXING}" PROPERTIES DEBUG_POSTFIX "_d")
-endif ()
-
-if (${LS_STD_BUILD_MODULE})
-    add_library("${MODULE_NAME_BOXING}" MODULE ${SOURCE_FILES_BOXING})
-    set_target_properties("${MODULE_NAME_BOXING}" PROPERTIES DEBUG_POSTFIX "_d")
+    set_target_properties("${MODULE_NAME_BOXING}" PROPERTIES DEBUG_POSTFIX "-d")
 endif ()
 
 ##########################################################
@@ -404,17 +506,12 @@ message("${PROJECT_NAME}: Building ${MODULE_NAME_CORE} library version ${PROJECT
 
 if (${LS_STD_BUILD_STATIC})
     add_library("${MODULE_NAME_CORE}" STATIC ${SOURCE_FILES_CORE})
-    set_target_properties("${MODULE_NAME_CORE}" PROPERTIES DEBUG_POSTFIX "_d")
+    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")
+    set_target_properties("${MODULE_NAME_CORE}" PROPERTIES DEBUG_POSTFIX "-d")
 endif ()
 
 ##########################################################
@@ -425,25 +522,19 @@ message("${PROJECT_NAME}: Building ${MODULE_NAME_ENCODING} library version ${PRO
 
 if (${LS_STD_BUILD_STATIC})
     add_library("${MODULE_NAME_ENCODING}" STATIC ${SOURCE_FILES_ENCODING})
-    set_target_properties("${MODULE_NAME_ENCODING}" PROPERTIES DEBUG_POSTFIX "_d")
+    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")
+    target_link_libraries("${MODULE_NAME_ENCODING}" ${MODULE_NAME_CORE})
+    set_target_properties("${MODULE_NAME_ENCODING}" PROPERTIES DEBUG_POSTFIX "-d")
 endif ()
 
 # CLI base64
 
-add_executable(cli_base64
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/encoding/cli/cli_base64_main.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/encoding/Base64.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/core/Version.cpp)
+add_executable(${CLI_NAME_BASE64}
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/encoding/cli/cli-base64-main.cpp)
 
 ##########################################################
 # Build Library (event)
@@ -453,18 +544,13 @@ message("${PROJECT_NAME}: Building ${MODULE_NAME_EVENT} library version ${PROJEC
 
 if (${LS_STD_BUILD_STATIC})
     add_library("${MODULE_NAME_EVENT}" STATIC ${SOURCE_FILES_EVENT})
-    set_target_properties("${MODULE_NAME_EVENT}" PROPERTIES DEBUG_POSTFIX "_d")
+    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})
     target_link_libraries("${MODULE_NAME_EVENT}" ${MODULE_NAME_CORE})
-    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")
+    set_target_properties("${MODULE_NAME_EVENT}" PROPERTIES DEBUG_POSTFIX "-d")
 endif ()
 
 ##########################################################
@@ -475,40 +561,13 @@ message("${PROJECT_NAME}: Building ${MODULE_NAME_IO} library version ${PROJECT_V
 
 if (${LS_STD_BUILD_STATIC})
     add_library("${MODULE_NAME_IO}" STATIC ${SOURCE_FILES_IO})
-    set_target_properties("${MODULE_NAME_IO}" PROPERTIES DEBUG_POSTFIX "_d")
+    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})
     target_link_libraries("${MODULE_NAME_IO}" ${MODULE_NAME_CORE})
-    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)
-##########################################################
-
-message("${PROJECT_NAME}: Building ${MODULE_NAME_LOGIC} library version ${PROJECT_VERSION}...")
-
-if (${LS_STD_BUILD_STATIC})
-    add_library("${MODULE_NAME_LOGIC}" STATIC ${SOURCE_FILES_LOGIC})
-    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})
-    target_link_libraries("${MODULE_NAME_LOGIC}" ${MODULE_NAME_CORE})
-    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")
+    set_target_properties("${MODULE_NAME_IO}" PROPERTIES DEBUG_POSTFIX "-d")
 endif ()
 
 ##########################################################
@@ -519,49 +578,43 @@ message("${PROJECT_NAME}: Building ${MODULE_NAME_TIME} library version ${PROJECT
 
 if (${LS_STD_BUILD_STATIC})
     add_library("${MODULE_NAME_TIME}" STATIC ${SOURCE_FILES_TIME})
-    set_target_properties("${MODULE_NAME_TIME}" PROPERTIES DEBUG_POSTFIX "_d")
+    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})
     target_link_libraries("${MODULE_NAME_TIME}" ${MODULE_NAME_CORE})
-    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")
+    set_target_properties("${MODULE_NAME_TIME}" PROPERTIES DEBUG_POSTFIX "-d")
 endif ()
 
 ####################################################################################################################
 ####################################################################################################################
 ####################################################################################################################
-# Test Suite: Linking
+# Unit Test Suite: Linking
 ####################################################################################################################
 ####################################################################################################################
 ####################################################################################################################
 
 ##########################################################
-# Linking (boxing)
+# Unit Linking (boxing)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_BOXING}: Linking libraries for test application...")
-    target_link_libraries(${MODULE_NAME_BOXING}_test
+    message("${MODULE_NAME_BOXING}: Linking libraries for unit test application...")
+    target_link_libraries(${MODULE_NAME_BOXING}-unit-test
             gtest
-            gmock
             gtest_main
             "${MODULE_NAME_BOXING}"
             "${MODULE_NAME_CORE}")
 endif ()
 
 ##########################################################
-# Linking (core)
+# Unit Linking (core)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_CORE}: Linking libraries for test application...")
-    target_link_libraries(${MODULE_NAME_CORE}_test
+    message("${MODULE_NAME_CORE}: Linking libraries for unit test application...")
+    target_link_libraries(${MODULE_NAME_CORE}-unit-test
             gtest
             gmock
             gtest_main
@@ -569,40 +622,38 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking (encoding)
+# Unit Linking (encoding)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_ENCODING}: Linking libraries for test application...")
-    target_link_libraries(${MODULE_NAME_ENCODING}_test
+    message("${MODULE_NAME_ENCODING}: Linking libraries for unit test application...")
+    target_link_libraries(${MODULE_NAME_ENCODING}-unit-test
             gtest
-            gmock
             gtest_main
             "${MODULE_NAME_ENCODING}"
             "${MODULE_NAME_CORE}")
 endif ()
 
 ##########################################################
-# Linking (event)
+# Unit Linking (event)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_EVENT}: Linking libraries for test application...")
-    target_link_libraries(${MODULE_NAME_EVENT}_test
+    message("${MODULE_NAME_EVENT}: Linking libraries for unit test application...")
+    target_link_libraries(${MODULE_NAME_EVENT}-unit-test
             gtest
-            gmock
             gtest_main
             "${MODULE_NAME_EVENT}"
             "${MODULE_NAME_CORE}")
 endif ()
 
 ##########################################################
-# Linking (io)
+# Unit Linking (io)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_IO}: Linking libraries for test application...")
-    target_link_libraries(${MODULE_NAME_IO}_test
+    message("${MODULE_NAME_IO}: Linking libraries for unit test application...")
+    target_link_libraries(${MODULE_NAME_IO}-unit-test
             gtest
             gmock
             gtest_main
@@ -611,48 +662,87 @@ if (${LS_STD_BUILD_WITH_TESTS})
 endif ()
 
 ##########################################################
-# Linking (logic)
+# Unit Linking (time)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_LOGIC}: Linking libraries for test application...")
-    target_link_libraries(${MODULE_NAME_LOGIC}_test
+    message("${MODULE_NAME_TIME}: Linking libraries for unit test application...")
+    target_link_libraries(${MODULE_NAME_TIME}-unit-test
             gtest
-            gmock
             gtest_main
-            "${MODULE_NAME_LOGIC}"
+            "${MODULE_NAME_TIME}"
             "${MODULE_NAME_CORE}")
 endif ()
 
 ##########################################################
-# Linking (time)
+# Unit Linking (all)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${MODULE_NAME_TIME}: Linking libraries for test application...")
-    target_link_libraries(${MODULE_NAME_TIME}_test
+    message("${PROJECT_NAME}: Linking libraries for unit test application...")
+    target_link_libraries(${PROJECT_NAME}-unit-test
             gtest
             gmock
             gtest_main
+            "${MODULE_NAME_BOXING}"
+            "${MODULE_NAME_ENCODING}"
+            "${MODULE_NAME_EVENT}"
+            "${MODULE_NAME_IO}"
             "${MODULE_NAME_TIME}"
             "${MODULE_NAME_CORE}")
 endif ()
 
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Integration Test Suite: Linking
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
 ##########################################################
-# Linking (all)
+# Integration Linking (io)
 ##########################################################
 
 if (${LS_STD_BUILD_WITH_TESTS})
-    message("${PROJECT_NAME}: Linking libraries for test application...")
-    target_link_libraries(${PROJECT_NAME}_test
+    message("${MODULE_NAME_IO}: Linking libraries for integration test application...")
+    target_link_libraries(${MODULE_NAME_IO}-integration-test
+            gtest
+            gtest_main
+            "${MODULE_NAME_IO}"
+            "${MODULE_NAME_CORE}")
+endif ()
+
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# Whole Test Suite: Linking
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
+if (${LS_STD_BUILD_WITH_TESTS})
+    message("${PROJECT_NAME}: Linking libraries for whole 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}")
+            "${MODULE_NAME_TIME}"
+            "${MODULE_NAME_CORE}")
 endif ()
+
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+# CLI - Base64: Linking
+####################################################################################################################
+####################################################################################################################
+####################################################################################################################
+
+target_link_libraries(${CLI_NAME_BASE64}
+        "${MODULE_NAME_ENCODING}"
+        "${MODULE_NAME_CORE}")

+ 87 - 39
README.md

@@ -1,33 +1,29 @@
-# Lynar Studios - Standard Library 2022.2.0 #
+# Lynar Studios - Standard Library 2023.1.0 #
 
 This is a cross-platform standard library written in C++ offering functionalities you would usually miss in C++'s standard template library (STL), especially if you would 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:
+Following a modularized approach the following independent submodules are defined in scope of this library:
  
 #### Boxing ####
 
-This library module provides boxing classes for primitive data types (e.g. string, int, long, float...) to provide additional functionalities.
+This library module provides boxing classes for primitive data types (e.g. string, int, long, float...), adding additional functionalities.
 
 #### Core ####
 
-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. 
+The core module is a base module providing common functionalities being shared among other library submodules. Functionalities provided by this module include interfaces, exceptions and base classes, which provide basic reflection functionalities.
 
 #### Encoding ####
 
-To encode a byte field (e.g. a binary file) for transfer the __Base64__ encoding / decoding functionality is being provided by this submodule as a first feature.
+To encode a byte field (e.g. a binary file) for network transfer the __Base64__ encoding / decoding functionality is being provided by this submodule as a first feature.
 
 #### Event ####
 
-This submodule comes with an __Event__ class, as well as with handlers and managers to provide an intuitive event handling for your application.
+This submodule comes with events in a primitive form, as well as with handlers and managers to provide an intuitive event handling for your application.
 
 #### IO ####
 
 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.
-
-#### Logic (Deprecated) ####
-
-Functionalities provided by this submodule support your project with some nice logical features. The first one being provided by it is a state machine.
+Additionally __XML__ and __KV__ parsing functionalities are provided.
 
 #### Time ####
 
@@ -38,19 +34,33 @@ A __Date__ class comes with this submodule, which you can use to represent a dat
 
 #### Features ####
 
-- this library is now being compiled with C++ 17 standard
-- this library can now build shared libraries by using MSVC
-- Clang support has been added to this library
-- added Base64 CLI Tool, which enables a user to use Base64 encoding and decoding functionalities via CLI
+- __AppleClang__ compiler is now officially supported
+- exceptions provided by __core__ submodule now offer a constructor for passing dedicated messages
+- evaluators have been added, which can check a state of variables and throw a dedicated exception in a single line and
+  more convenient way
+- a section-pair file standard has been implemented and is provided via __ls-std-io__ module, a definition of this
+  standard can be found in the libraries __doc__ folder
+- a base Exception class has been added, which provides basic reflection functionality - all existing library exceptions
+  inherit from this class now
 
 #### Improvements ####
 
-- JSON type alias has been added to avoid direct nlohmann library usage
-- logic module is now officially deprecated
+- __logic__ module has been removed from this library and can now be found in __ls-game-tool-kit__ library
+- __core.utils__ module has been removed from this library to provide more clean implementations where it's needed
+- the complexity of source files has been reduced by declaring usages of namespaces at the file beginning sections
+  instead of using those in every definition implementation, this overall improves the readability of the libraries
+  source files
+- a new naming convention for files and directories has been introduced, where underscores were replaced by dashes
+  entirely
+- fetching the library version can now be achieved by using a dedicated __LibraryVersion__ class - the usage of a static function for this purpose has been removed completely
+- missing nodiscard attributes have been added to library classes
+- rename "types" folder in __core__ submodule to stick to naming convention
+- key-value file standard has been removed from this library and is replaced by section-pair file standard
 
 #### Fixes ####
 
-- none
+- potential memory leaks have been resolved by strictly splitting prototypes and implementation project-wide, which enabled the usage of virtual or overridden destructors
+- memory leaks inside exception test suite have been fixed
 
 ---
 ### Documentation ###
@@ -65,53 +75,91 @@ This software is licensed and uses MIT-license. You can find a __LICENSE.MIT__ f
 ---
 ### Building ###
 
-To build this library you'd need a recent version of __cmake__ and your OS specific compiler collection, like __gcc__ or __MinGW__ installed.  
-Inside project's root directory create the following folder:
+Building this library would result into providing binaries for each library module and CLI tool: 
+
+| binary              | type                       |
+|---------------------|----------------------------|
+| __cli-base64__      | CLI executable             |
+| __ls-std-boxing__   | library (static / dynamic) |
+| __ls-std-core__     | library (static / dynamic) |
+| __ls-std-encoding__ | library (static / dynamic) |
+| __ls-std-event__    | library (static / dynamic) |
+| __ls-std-io__       | library (static / dynamic) |
+| __ls-std-time__     | library (static / dynamic) |
+
+#### Prerequisites ####
+
+To build this library you'd need a supported __toolchain__ in place, consisting of a build tool and compiler. The following table is a listing of supported compilers and build tools associated with operating systems, where this library has been tested:
+
+| Supported Compiler<br/>(mandatory) | OS              | Supported Compiler Version<br/>(mandatory) | Build Tool<br/>(mandatory) | Build Tool Version (mandatory) |
+|------------------------------------|-----------------|--------------------------------------------|----------------------------|--------------------------------|
+| GCC                                | Linux Mint 20.3 | 12.2.0                                     | CMake                      | \>= 3.24.0                     |
+| Clang                              | Linux Mint 20.3 | 12.0.0-3ubuntu1~20.04.5                    | CMake                      | \>= 3.24.0                     |
+| MinGW-w64 / GCC                    | Windows 10      | 11.2.0                                     | CMake                      | \>= 3.24.0                     |
+| MSVC                               | Windows 10      | 19.32.31332.0                              | CMake                      | \>= 3.24.0                     |
+| AppleClang                         | MacOS Monterey  | 14.0.0                                     | CMake                      | \>= 3.24.0                     |
+
+Please note, that where the underlying operating system is optional in this listing, the toolchain itself is not! This means, that by default you should use one of the supported listed toolchains.  
+In case you'd like to use an unsupported toolchain, you can enforce this during CMake project generation. For that have a look at the CMake flag usage section below.
+
+#### Generate CMake Project (Unix) ####
+
+To prepare a CMake project, create a build folder within the project's root folder (where the CMakeLists.txt file is located) via CLI and navigate to it:
 
 ```
-cmake_build_release
+mkdir cmake-build-release
+cd cmake-build-release
 ```
 
-Open your OS specific command line interface (CLI) and navigate to this new folder and run the following command to configure the project and generate a native build system:  
+Inside this folder generate the CMake project:
 
 ```
 cmake ../
 ```
 
-Inside __cmake_build_release__ folder you will now find cmake generated files. To compile the library now, just run:   
+Alternatively, the CMake project generation can be controlled by providing library specific CMake flags. The following table is a listing of available flags:
+
+| CMake Flag                               | Default Value | Description                                                                                                                                          |
+|------------------------------------------|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
+| __LS_STD_BUILD_WITH_TESTS__              | OFF           | This flag can be enabled to build automated tests, like unit or integration tests.                                                                   |
+| __LS_STD_BUILD_WITH_SUPPORTED_COMPILER__ | ON            | This flag enforces the usage of supported compilers, only.<br/>For usage of an unsupported toolchain, set this flag to __OFF__.                      |
+| __LS_STD_BUILD_STATIC__                  | ON            | This flag indicates, that all library modules should be built as static goals.  <br/>Please note, that __LS_STD_BUILD_SHARED__ has to be turned off. |
+| __LS_STD_BUILD_SHARED__                  | OFF           | This flag indicates, that all library modules should be built as shared goals.  <br/>Please note, that __LS_STD_BUILD_STATIC__ has to be turned off. |
+
+To use one or more of these flags, you'd have to adjust previous command, like:
 
 ```
-cmake --build . --config Release
+cmake -DLS_STD_BUILD_WITH_TESTS=ON ../
 ```
 
-__Please note__: Currently only a small set of compilers is officially supported. If you'd like to compile with an unsupported compiler, you have to set __LS_STD_BUILD_WITH_SUPPORTED_COMPILER__ - option in _CMakeLists.txt_ file to __OFF__ - then reset and reload the cmake project.  
+#### Compile Project ####
+
+Now, that the CMake project is generated, you should find CMake generated files inside previously created build folder. In order to compile the project run:   
 
-Find below a table of compiler/OS combinations which have been tested during library version development:
+```
+cmake --build . --config Release
+```
 
-| Supported Compiler | OS              | Compiler Version        |
-|--------------------|-----------------|-------------------------|
-| GCC                | Linux Mint 20.3 | 12.1.0                  |
-| Clang              | Linux Mint 20.3 | 12.0.0-3ubuntu1~20.04.5 |
-| MinGW-w64 / GCC    | Windows 10      | 11.2.0                  |
-| MSVC               | Windows 10      | 19.32.31332.0           |
+Once compilation is done, you should find generated binaries within __cmake-build-release__ folder.
 
 ---
-### Add Library To Your CMake Project ###
+### Link ls-std Libraries (CMake) ###
 
-If you would like to add this library to your CMake project (__CMakeLists.txt__ file), make sure that you would add the libraries' include directory:
+If you would like to add this library's modules to your own CMake project, make sure that you would add the libraries' include directory:
 
 ```
 include_directories(${CMAKE_CURRENT_LIST_DIR}/path/to/this/library/include)
 ```
 
-Then link the libraries' binary file inside your __CMakeLists.txt__ file:
+Then link the libraries' binary files, like:
 
 ```
-target_link_libraries(... libls_std_core libls_std_boxing ...)
+target_link_libraries(... ls-std-core ls-std-boxing ...)
 ```
 
 ---
-### Testing ###
 
-This project contains unit tests to provide test coverage.  
-To run those tests you have to build this project with option __LS_STD_BUILD_WITH_TESTS__ set to __ON__ - then reset and reload the CMake project.
+### Run Automated Tests ###
+
+When enabling test build CMake flag during CMake project generation, executable test suite binaries will be generated during project compilation.  
+You would then find individual module test suites, as well as a whole project test suite, which can be run via CLI.

+ 0 - 47
config/LynarStudiosStyle.xml

@@ -1,47 +0,0 @@
-<code_scheme name="LynarStudiosStyle" version="173">
-  <HTMLCodeStyleSettings>
-    <option name="HTML_KEEP_LINE_BREAKS" value="false" />
-    <option name="HTML_KEEP_BLANK_LINES" value="4" />
-  </HTMLCodeStyleSettings>
-  <MarkdownNavigatorCodeStyleSettings>
-    <option name="RIGHT_MARGIN" value="72" />
-  </MarkdownNavigatorCodeStyleSettings>
-  <Objective-C>
-    <option name="INDENT_NAMESPACE_MEMBERS" value="2" />
-    <option name="INDENT_C_STRUCT_MEMBERS" value="2" />
-    <option name="INDENT_VISIBILITY_KEYWORDS" value="2" />
-    <option name="INDENT_INSIDE_CODE_BLOCK" value="2" />
-    <option name="INDENT_PREPROCESSOR_DIRECTIVE" value="2" />
-    <option name="INDENT_DIRECTIVE_AS_CODE" value="true" />
-    <option name="NAMESPACE_BRACE_PLACEMENT" value="2" />
-    <option name="FUNCTION_BRACE_PLACEMENT" value="2" />
-    <option name="BLOCK_BRACE_PLACEMENT" value="2" />
-    <option name="FUNCTION_CALL_ARGUMENTS_WRAP" value="0" />
-    <option name="CLASS_CONSTRUCTOR_INIT_LIST_WRAP" value="2" />
-  </Objective-C>
-  <Objective-C-extensions>
-    <extensions>
-      <pair source="cpp" header="hpp" fileNamingConvention="NONE" />
-      <pair source="c" header="h" fileNamingConvention="NONE" />
-    </extensions>
-  </Objective-C-extensions>
-  <codeStyleSettings language="HTML">
-    <indentOptions>
-      <option name="CONTINUATION_INDENT_SIZE" value="4" />
-    </indentOptions>
-  </codeStyleSettings>
-  <codeStyleSettings language="ObjectiveC">
-    <option name="RIGHT_MARGIN" value="700" />
-    <option name="KEEP_LINE_BREAKS" value="false" />
-    <option name="BLANK_LINES_AROUND_METHOD_IN_INTERFACE" value="0" />
-    <option name="BRACE_STYLE" value="2" />
-    <option name="CLASS_BRACE_STYLE" value="2" />
-    <option name="ELSE_ON_NEW_LINE" value="true" />
-    <option name="CATCH_ON_NEW_LINE" value="true" />
-    <indentOptions>
-      <option name="INDENT_SIZE" value="2" />
-      <option name="CONTINUATION_INDENT_SIZE" value="4" />
-      <option name="TAB_SIZE" value="2" />
-    </indentOptions>
-  </codeStyleSettings>
-</code_scheme>

+ 20 - 0
config/clion-lynar-studios-analysis-profile.xml

@@ -0,0 +1,20 @@
+<profile version="1.0">
+    <option name="myName" value="lynar-studios-analysis-profile"/>
+    <option name="scopesOrder">
+        <list>
+            <option value="All Changed Files"/>
+            <option value="Open Files"/>
+            <option value="Project Files"/>
+            <option value="Project Non-Source Files"/>
+            <option value="Project Source Files"/>
+            <option value="Scratches and Consoles"/>
+            <option value="ls-std"/>
+        </list>
+    </option>
+    <inspection_tool class="Cppcheck" enabled="true" level="WARNING" enabled_by_default="false">
+        <scope name="ls-std" level="WARNING" enabled="true"/>
+    </inspection_tool>
+    <inspection_tool class="UnusedValue" enabled="true" level="WARNING" enabled_by_default="true">
+        <option name="showUnusedInitializers" value="false"/>
+    </inspection_tool>
+</profile>

+ 0 - 0
doc/check_list.txt → doc/check-list.txt


+ 0 - 0
doc/event_handling_uml.png → doc/event-handling-uml.png


+ 0 - 13
doc/kv_file_definition.md

@@ -1,13 +0,0 @@
-# Key Value File - Definition #
-
-This document defines the standard of a key value file (__.kv__).
-
-1. A Key Value File needs to have the file extension "__.kv__".
-2. A Key Value Pair, which is defined in such a file, has the following format:
-   ```
-   port=8080;
-   ```
-   The key is defined at the beginning of a line followed by an "__=__" sign for assignment.  
-   The value (which is the assigment) comes write after the "__=__" sign. Please note that no quotes are required.
-   To mark the end of a pair definition a semicolon "__;__" is required.
-3. Every line in a __.kv__ file, which does not contain a "__=__" and a "__;__" sign, will be considered as a comment. Also, adding any text to a line after a semicolon has been set - to mark the end of a pair definition - will be ignored.

BIN
doc/section-pair-2023-standard.odt


+ 0 - 0
doc/state_machine_test.png → doc/state-machine-test.png


+ 10 - 14
include/ls_std/boxing/Boolean.hpp → include/ls-std/boxing/Boolean.hpp

@@ -3,18 +3,18 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-09
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_BOOLEAN_HPP
 #define LS_STD_BOOLEAN_HPP
 
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IBoxing.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
 #include <sstream>
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/IBoxing.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::boxing
 {
@@ -24,11 +24,7 @@ namespace ls::std::boxing
 
       explicit Boolean(bool _value);
       Boolean();
-      ~Boolean() override = default;
-
-      // conversion operator
-
-      operator bool() const;
+      ~Boolean() noexcept override;
 
       // assignment operators
 
@@ -61,15 +57,15 @@ namespace ls::std::boxing
       // implementation
 
       void parse(::std::string _parseText) override;
-      ::std::string toString() override;
+      [[nodiscard]] ::std::string toString() override;
 
       // additional functionality
 
       [[nodiscard]] bool getValue() const;
-      static bool XOR(const ls::std::boxing::Boolean &_leftExpression, const ls::std::boxing::Boolean &_rightExpression);
-      static bool XOR(const ls::std::boxing::Boolean &_leftExpression, bool _rightExpression);
-      static bool XOR(bool _leftExpression, const ls::std::boxing::Boolean &_rightExpression);
-      static bool XOR(bool _leftExpression, bool _rightExpression);
+      [[nodiscard]] static bool XOR(const ls::std::boxing::Boolean &_leftExpression, const ls::std::boxing::Boolean &_rightExpression);
+      [[nodiscard]] static bool XOR(const ls::std::boxing::Boolean &_leftExpression, bool _rightExpression);
+      [[nodiscard]] static bool XOR(bool _leftExpression, const ls::std::boxing::Boolean &_rightExpression);
+      [[nodiscard]] static bool XOR(bool _leftExpression, bool _rightExpression);
 
     private:
 

+ 8 - 12
include/ls_std/boxing/Double.hpp → include/ls-std/boxing/Double.hpp

@@ -3,17 +3,17 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-14
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_DOUBLE_HPP
 #define LS_STD_DOUBLE_HPP
 
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IBoxing.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/IBoxing.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::boxing
 {
@@ -23,11 +23,7 @@ namespace ls::std::boxing
 
       Double();
       explicit Double(double _value);
-      ~Double() override = default;
-
-      // conversion operator
-
-      operator double() const; // do not make explicit!
+      ~Double() noexcept override;
 
       // assignment operators
 
@@ -79,12 +75,12 @@ namespace ls::std::boxing
       // implementation
 
       void parse(::std::string _parseText) override;
-      ::std::string toString() override;
+      [[nodiscard]] ::std::string toString() override;
 
       // additional functionality
 
-      double getEpsilon();
-      double getValue();
+      [[nodiscard]] double getEpsilon() const;
+      [[nodiscard]] double getValue() const;
       void setEpsilon(double _epsilon);
 
     private:

+ 8 - 12
include/ls_std/boxing/Float.hpp → include/ls-std/boxing/Float.hpp

@@ -3,17 +3,17 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-14
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_FLOAT_HPP
 #define LS_STD_FLOAT_HPP
 
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IBoxing.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/IBoxing.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::boxing
 {
@@ -23,11 +23,7 @@ namespace ls::std::boxing
 
       Float();
       explicit Float(float _value);
-      ~Float() override = default;
-
-      // conversion operator
-
-      operator float() const; // do not make explicit!
+      ~Float() noexcept override;
 
       // assignment operators
 
@@ -79,12 +75,12 @@ namespace ls::std::boxing
       // implementation
 
       void parse(::std::string _parseText) override;
-      ::std::string toString() override;
+      [[nodiscard]] ::std::string toString() override;
 
       // additional functionality
 
-      float getEpsilon();
-      float getValue();
+      [[nodiscard]] float getEpsilon() const;
+      [[nodiscard]] float getValue() const;
       void setEpsilon(float _epsilon);
 
     private:

+ 6 - 10
include/ls_std/boxing/Integer.hpp → include/ls-std/boxing/Integer.hpp

@@ -3,17 +3,17 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-07
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_INTEGER_HPP
 #define LS_STD_INTEGER_HPP
 
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IBoxing.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/IBoxing.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::boxing
 {
@@ -23,11 +23,7 @@ namespace ls::std::boxing
 
       explicit Integer(int _value);
       Integer();
-      ~Integer() override = default;
-
-      // conversion operator
-
-      operator int() const;
+      ~Integer() noexcept override;
 
       // assignment operators
 
@@ -95,7 +91,7 @@ namespace ls::std::boxing
       // implementation
 
       void parse(::std::string _parseText) override;
-      ::std::string toString() override;
+      [[nodiscard]] ::std::string toString() override;
 
       // additional functionality
 

+ 7 - 11
include/ls_std/boxing/Long.hpp → include/ls-std/boxing/Long.hpp

@@ -3,18 +3,18 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_LONG_HPP
 #define LS_STD_LONG_HPP
 
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IBoxing.hpp>
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/IBoxing.hpp>
-#include <ls_std/core/types/Types.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::boxing
 {
@@ -24,11 +24,7 @@ namespace ls::std::boxing
 
       explicit Long(ls::std::core::type::long_type _value);
       Long();
-      ~Long() override = default;
-
-      // conversion operator
-
-      operator ls::std::core::type::long_type() const;
+      ~Long() noexcept override;
 
       // assignment operators
 
@@ -96,7 +92,7 @@ namespace ls::std::boxing
       // implementation
 
       void parse(::std::string _parseText) override;
-      ::std::string toString() override;
+      [[nodiscard]] ::std::string toString() override;
 
       // additional functionality
 

+ 21 - 26
include/ls_std/boxing/String.hpp → include/ls-std/boxing/String.hpp

@@ -3,20 +3,20 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-14
- * Changed:         2022-07-03
+ * Changed:         2023-02-23
  *
  * */
 
 #ifndef LS_STD_STRING_HPP
 #define LS_STD_STRING_HPP
 
-#include <ls_std/core/interface/IBoxing.hpp>
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/types/Types.hpp>
-#include <string>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IBoxing.hpp>
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
+#include <string>
 #include <vector>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::boxing
 {
@@ -26,12 +26,7 @@ namespace ls::std::boxing
 
       String();
       explicit String(::std::string _value);
-      ~String() override = default;
-
-      // conversion operator
-
-      operator const char *() const; // do not make explicit!
-      operator ::std::string() const; // do not make explicit!
+      ~String() noexcept override;
 
       // assignment operators
 
@@ -61,28 +56,28 @@ namespace ls::std::boxing
       // implementation
 
       void parse(::std::string _parseText) override;
-      ::std::string toString() override;
+      [[nodiscard]] ::std::string toString() override;
 
       // additional functionality
 
-      bool contains(const ::std::string &_text);
-      bool endsWith(const ::std::string &_text);
-      bool equalsIgnoreCase(ls::std::boxing::String _string);
-      bool equalsIgnoreCase(::std::string _text);
-      ::std::vector<ls::std::core::type::byte> getByteData();
-      ::std::string padLeft(size_t _width, char _fillCharacter);
-      ::std::string padRight(size_t _width, char _fillCharacter);
-      ::std::string reverse();
-      bool startsWith(const ::std::string &_text);
-      ::std::string toLowerCase();
-      ::std::string toUpperCase();
+      [[nodiscard]] bool contains(const ::std::string &_text);
+      [[nodiscard]] bool endsWith(const ::std::string &_text);
+      [[nodiscard]] bool equalsIgnoreCase(ls::std::boxing::String _string);
+      [[nodiscard]] bool equalsIgnoreCase(::std::string _text);
+      [[nodiscard]] ::std::vector<ls::std::core::type::byte_type> getByteData();
+      [[nodiscard]] ::std::string padLeft(size_t _width, char _fillCharacter);
+      [[nodiscard]] ::std::string padRight(size_t _width, char _fillCharacter);
+      [[nodiscard]] ::std::string reverse();
+      [[nodiscard]] bool startsWith(const ::std::string &_text);
+      [[nodiscard]] ::std::string toLowerCase();
+      [[nodiscard]] ::std::string toUpperCase();
 
     private:
 
       ::std::string value{};
 
-      static ::std::string _buildCharacterChain(size_t _amount, char _fillCharacter);
-      static ::std::string _createFillContent(const ::std::string &_text, size_t _width, char _fillCharacter);
+      [[nodiscard]] static ::std::string _buildCharacterChain(size_t _amount, char _fillCharacter);
+      [[nodiscard]] static ::std::string _createFillContent(const ::std::string &_text, size_t _width, char _fillCharacter);
   };
 }
 

+ 4 - 4
include/ls_std/core/Class.hpp → include/ls-std/core/Class.hpp

@@ -3,15 +3,15 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-07
- * Changed:         2022-07-03
+ * Changed:         2023-02-06
  *
  * */
 
 #ifndef LS_STD_CLASS_HPP
 #define LS_STD_CLASS_HPP
 
+#include <ls-std/os/dynamic-goal.hpp>
 #include <string>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::core
 {
@@ -20,9 +20,9 @@ namespace ls::std::core
     public:
 
       explicit Class(const ::std::string &_name);
-      virtual ~Class() = default;
+      virtual ~Class();
 
-      ::std::string getClassName();
+      [[nodiscard]] ::std::string getClassName();
 
     private:
 

+ 33 - 0
include/ls-std/core/ConditionalFunctionExecutor.hpp

@@ -0,0 +1,33 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-13
+* Changed:         2023-02-21
+*
+* */
+
+#ifndef LS_STD_CONDITIONAL_FUNCTION_EXECUTOR_HPP
+#define LS_STD_CONDITIONAL_FUNCTION_EXECUTOR_HPP
+
+#include <functional>
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL ConditionalFunctionExecutor
+  {
+    public:
+
+      explicit ConditionalFunctionExecutor(bool _condition);
+      ~ConditionalFunctionExecutor();
+
+      void execute(const ::std::function<void()> &_function) const;
+
+    private:
+
+      bool condition{};
+  };
+}
+
+#endif

+ 10 - 4
include/ls_std/core/LibraryVersion.hpp → include/ls-std/core/LibraryVersion.hpp

@@ -3,21 +3,27 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2021-05-02
- * Changed:         2022-07-02
+ * Changed:         2023-02-06
  *
  * */
 
 #ifndef LS_STD_LIBRARY_VERSION_HPP
 #define LS_STD_LIBRARY_VERSION_HPP
 
+#include <ls-std/os/dynamic-goal.hpp>
 #include <string>
 
 namespace ls::std::core
 {
-  static ::std::string getVersion()
+  class LS_STD_DYNAMIC_GOAL LibraryVersion
   {
-    return "2022.2.0";
-  }
+    public:
+
+      LibraryVersion();
+      ~LibraryVersion();
+
+      [[nodiscard]] static ::std::string getVersion();
+  };
 }
 
 #endif

+ 8 - 8
include/ls_std/core/Version.hpp → include/ls-std/core/Version.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-09-27
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
@@ -11,9 +11,9 @@
 #define LS_STD_VERSION_HPP
 
 #include "Class.hpp"
-#include <ls_std/core/interface/ISerializable.hpp>
-#include <ls_std/core/types/Types.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::core
 {
@@ -22,11 +22,11 @@ namespace ls::std::core
     public:
 
       explicit Version(ls::std::core::type::version_type _majorVersion, ls::std::core::type::version_type _minorVersion, ls::std::core::type::version_type _patchVersion);
-      ~Version() = default;
+      ~Version() noexcept override;
 
       // implementation
 
-      ls::std::core::type::byte_field marshal() override;
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
       void unmarshal(const ls::std::core::type::byte_field &_data) override;
 
       // other functionality
@@ -34,7 +34,7 @@ namespace ls::std::core
       [[nodiscard]] ls::std::core::type::version_type getMajorVersion() const;
       [[nodiscard]] ls::std::core::type::version_type getMinorVersion() const;
       [[nodiscard]] ls::std::core::type::version_type getPatchVersion() const;
-      static bool isValid(const ::std::string &_versionString);
+      [[nodiscard]] static bool isValid(const ::std::string &_versionString);
       void setMajorVersion(ls::std::core::type::version_type _major);
       void setMinorVersion(ls::std::core::type::version_type _minor);
       void setPatchVersion(ls::std::core::type::version_type _patch);
@@ -45,7 +45,7 @@ namespace ls::std::core
       ls::std::core::type::version_type minorVersion{};
       ls::std::core::type::version_type patchVersion{};
 
-      static bool _isValid(const ::std::string &_versionString);
+      [[nodiscard]] static bool _isValid(const ::std::string &_versionString);
   };
 }
 

+ 36 - 0
include/ls-std/core/evaluator/EmptyStringArgumentEvaluator.hpp

@@ -0,0 +1,36 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-08
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_EMPTY_STRING_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_EMPTY_STRING_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL EmptyStringArgumentEvaluator : public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit EmptyStringArgumentEvaluator(::std::string _argument);
+      explicit EmptyStringArgumentEvaluator(::std::string _argument, ::std::string _message);
+      ~EmptyStringArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::string argument{};
+      ::std::string message{};
+  };
+}
+
+#endif

+ 37 - 0
include/ls-std/core/evaluator/IndexOutOfBoundsEvaluator.hpp

@@ -0,0 +1,37 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-10
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_INDEX_OUT_OF_BOUNDS_EVALUATOR_EVALUATOR_HPP
+#define LS_STD_INDEX_OUT_OF_BOUNDS_EVALUATOR_EVALUATOR_HPP
+
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL IndexOutOfBoundsEvaluator : public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit IndexOutOfBoundsEvaluator(size_t _index, size_t _size);
+      explicit IndexOutOfBoundsEvaluator(size_t _index, size_t _size, ::std::string _message);
+      ~IndexOutOfBoundsEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      size_t index{};
+      ::std::string message{};
+      size_t size{};
+  };
+}
+
+#endif

+ 37 - 0
include/ls-std/core/evaluator/NullPointerArgumentEvaluator.hpp

@@ -0,0 +1,37 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-08
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_NULL_POINTER_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_NULL_POINTER_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL NullPointerArgumentEvaluator : public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit NullPointerArgumentEvaluator(const ::std::shared_ptr<void> &_argument);
+      explicit NullPointerArgumentEvaluator(const ::std::shared_ptr<void> &_argument, ::std::string _message);
+      ~NullPointerArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::shared_ptr<void> argument{};
+      ::std::string message{};
+  };
+}
+
+#endif

+ 37 - 0
include/ls-std/core/evaluator/NullPointerEvaluator.hpp

@@ -0,0 +1,37 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-08
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_NULL_POINTER_EVALUATOR_HPP
+#define LS_STD_NULL_POINTER_EVALUATOR_HPP
+
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL NullPointerEvaluator : public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit NullPointerEvaluator(const ::std::shared_ptr<void> &_argument);
+      explicit NullPointerEvaluator(const ::std::shared_ptr<void> &_argument, ::std::string _message);
+      ~NullPointerEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::shared_ptr<void> argument{};
+      ::std::string message{};
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/EventNotHandledException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2021-05-27
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_EVENT_NOT_HANDLED_EXCEPTION_HPP
+#define LS_STD_EVENT_NOT_HANDLED_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL EventNotHandledException : public ls::std::core::Exception
+  {
+    public:
+
+      EventNotHandledException();
+      explicit EventNotHandledException(::std::string _message);
+      ~EventNotHandledException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/EventNotSubscribedException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2021-05-27
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_EVENT_NOT_SUBSCRIBED_EXCEPTION_HPP
+#define LS_STD_EVENT_NOT_SUBSCRIBED_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL EventNotSubscribedException : public ls::std::core::Exception
+  {
+    public:
+
+      EventNotSubscribedException();
+      explicit EventNotSubscribedException(::std::string _message);
+      ~EventNotSubscribedException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 36 - 0
include/ls-std/core/exception/Exception.hpp

@@ -0,0 +1,36 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-22
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_EXCEPTION_HPP
+#define LS_STD_EXCEPTION_HPP
+
+#include <exception>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL Exception : public ::std::exception
+  {
+    public:
+
+      explicit Exception(::std::string _name);
+      ~Exception() noexcept override;
+
+      [[nodiscard]] ::std::string getName() const;
+      [[nodiscard]] const char *what() const noexcept override;
+
+    protected:
+
+      ::std::string message{};
+      ::std::string name{};
+  };
+}
+
+#endif

+ 33 - 0
include/ls-std/core/exception/ExceptionMessage.hpp

@@ -0,0 +1,33 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-07
+* Changed:         2023-02-07
+*
+* */
+
+#ifndef LS_STD_EXCEPTION_MESSAGE_HPP
+#define LS_STD_EXCEPTION_MESSAGE_HPP
+
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL ExceptionMessage
+  {
+    public:
+
+      explicit ExceptionMessage(::std::string _message);
+      ~ExceptionMessage();
+
+      char *toCharacterPointer();
+
+    private:
+
+      ::std::string message{};
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/FileNotFoundException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-17
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_FILE_NOT_FOUND_EXCEPTION_HPP
+#define LS_STD_FILE_NOT_FOUND_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL FileNotFoundException : public ls::std::core::Exception
+  {
+    public:
+
+      FileNotFoundException();
+      explicit FileNotFoundException(::std::string _message);
+      ~FileNotFoundException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/FileOperationException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-15
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_FILE_OPERATION_EXCEPTION_HPP
+#define LS_STD_FILE_OPERATION_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL FileOperationException : public ls::std::core::Exception
+  {
+    public:
+
+      FileOperationException();
+      explicit FileOperationException(::std::string _message);
+      ~FileOperationException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/IllegalArgumentException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-09
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_ILLEGAL_ARGUMENT_EXCEPTION_HPP
+#define LS_STD_ILLEGAL_ARGUMENT_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL IllegalArgumentException : public ls::std::core::Exception
+  {
+    public:
+
+      IllegalArgumentException();
+      explicit IllegalArgumentException(::std::string _message);
+      ~IllegalArgumentException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/IllegalArithmeticOperationException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-07
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_ILLEGAL_ARITHMETIC_OPERATION_EXCEPTION_HPP
+#define LS_STD_ILLEGAL_ARITHMETIC_OPERATION_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL IllegalArithmeticOperationException : public ls::std::core::Exception
+  {
+    public:
+
+      IllegalArithmeticOperationException();
+      explicit IllegalArithmeticOperationException(::std::string _message);
+      ~IllegalArithmeticOperationException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/IncompleteJsonException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2021-04-30
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_INCOMPLETE_JSON_EXCEPTION_HPP
+#define LS_STD_INCOMPLETE_JSON_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL IncompleteJsonException : public ls::std::core::Exception
+  {
+    public:
+
+      IncompleteJsonException();
+      explicit IncompleteJsonException(::std::string _message);
+      ~IncompleteJsonException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/IndexOutOfBoundsException.hpp

@@ -0,0 +1,31 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-10
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_INDEX_OUT_OF_BOUNDS_EXCEPTION_HPP
+#define LS_STD_INDEX_OUT_OF_BOUNDS_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL IndexOutOfBoundsException : public ls::std::core::Exception
+  {
+    public:
+
+      IndexOutOfBoundsException();
+      explicit IndexOutOfBoundsException(::std::string _message);
+      ~IndexOutOfBoundsException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 31 - 0
include/ls-std/core/exception/NullPointerException.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-11-06
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_NULL_POINTER_EXCEPTION_HPP
+#define LS_STD_NULL_POINTER_EXCEPTION_HPP
+
+#include <ls-std/core/exception/Exception.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::core
+{
+  class LS_STD_DYNAMIC_GOAL NullPointerException : public ls::std::core::Exception
+  {
+    public:
+
+      NullPointerException();
+      explicit NullPointerException(::std::string _message);
+      ~NullPointerException() noexcept override;
+
+      [[nodiscard]] const char *what() const noexcept override;
+  };
+}
+
+#endif

+ 5 - 4
include/ls_std/core/interface/IBoxing.hpp → include/ls-std/core/interface/IBoxing.hpp

@@ -3,23 +3,24 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-07
- * Changed:         2022-07-02
+ * Changed:         2023-02-05
  *
  * */
 
 #ifndef LS_STD_I_BOXING_HPP
 #define LS_STD_I_BOXING_HPP
 
+#include <ls-std/os/dynamic-goal.hpp>
 #include <string>
 
 namespace ls::std::core::interface_type
 {
-  class IBoxing
+  class LS_STD_DYNAMIC_GOAL IBoxing
   {
     public:
 
-      IBoxing() = default;
-      ~IBoxing() = default;
+      IBoxing();
+      virtual ~IBoxing();
 
       virtual void parse(::std::string _parseText) = 0;
       virtual ::std::string toString() = 0;

+ 6 - 2
include/ls_std/core/interface/IEncoding.hpp → include/ls-std/core/interface/IEncoding.hpp

@@ -3,21 +3,25 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-01-03
- * Changed:         2022-07-02
+ * Changed:         2023-02-05
  *
  * */
 
 #ifndef LS_STD_I_ENCODING_HPP
 #define LS_STD_I_ENCODING_HPP
 
+#include <ls-std/os/dynamic-goal.hpp>
 #include <string>
 
 namespace ls::std::core::interface_type
 {
-  class IEncoding
+  class LS_STD_DYNAMIC_GOAL IEncoding
   {
     public:
 
+      IEncoding();
+      virtual ~IEncoding();
+
       virtual ::std::string encode(const ::std::string &_sequence) = 0;
       virtual ::std::string decode(const ::std::string &_sequence) = 0;
   };

+ 28 - 0
include/ls-std/core/interface/IEvaluator.hpp

@@ -0,0 +1,28 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-08
+* Changed:         2023-02-08
+*
+* */
+
+#ifndef LS_STD_I_EVALUATOR_HPP
+#define LS_STD_I_EVALUATOR_HPP
+
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::core::interface_type
+{
+  class LS_STD_DYNAMIC_GOAL IEvaluator
+  {
+    public:
+
+      IEvaluator();
+      virtual ~IEvaluator();
+
+      virtual void evaluate() = 0;
+  };
+}
+
+#endif

+ 7 - 6
include/ls_std/core/interface/IEventSubscriber.hpp → include/ls-std/core/interface/IEventSubscriber.hpp

@@ -3,25 +3,26 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-07-02
+ * Changed:         2023-02-08
  *
  * */
 
 #ifndef LS_STD_I_EVENT_SUBSCRIBER_HPP
 #define LS_STD_I_EVENT_SUBSCRIBER_HPP
 
-#include <ls_std/core/types/EventTypes.hpp>
-#include <memory>
 #include "IListener.hpp"
+#include <ls-std/core/type/EventTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
 
 namespace ls::std::core::interface_type
 {
-  class IEventSubscriber
+  class LS_STD_DYNAMIC_GOAL IEventSubscriber
   {
     public:
 
-      IEventSubscriber() = default;
-      ~IEventSubscriber() = default;
+      IEventSubscriber();
+      virtual ~IEventSubscriber();
 
       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;

+ 6 - 5
include/ls_std/core/interface/IListener.hpp → include/ls-std/core/interface/IListener.hpp

@@ -3,23 +3,24 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-14
- * Changed:         2022-07-02
+ * Changed:         2023-02-05
  *
  * */
 
 #ifndef LS_STD_I_LISTENER_HPP
 #define LS_STD_I_LISTENER_HPP
 
-#include <ls_std/core/Class.hpp>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::core::interface_type
 {
-  class IListener
+  class LS_STD_DYNAMIC_GOAL IListener
   {
     public:
 
-      IListener() = default;
-      ~IListener() = default;
+      IListener();
+      virtual ~IListener();
 
       virtual void listen(const ls::std::core::Class &_info) = 0;
   };

+ 6 - 5
include/ls_std/core/interface/IReader.hpp → include/ls-std/core/interface/IReader.hpp

@@ -3,23 +3,24 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-07-02
+ * Changed:         2023-02-08
  *
  * */
 
 #ifndef LS_STD_I_READER_HPP
 #define LS_STD_I_READER_HPP
 
-#include <ls_std/core/types/Types.hpp>
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::core::interface_type
 {
-  class IReader
+  class LS_STD_DYNAMIC_GOAL IReader
   {
     public:
 
-      IReader() = default;
-      ~IReader() = default;
+      IReader();
+      virtual ~IReader();
 
       virtual ls::std::core::type::byte_field read() = 0;
   };

+ 8 - 7
include/ls_std/core/interface/ISerializable.hpp → include/ls-std/core/interface/ISerializable.hpp

@@ -3,23 +3,24 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-21
- * Changed:         2022-07-02
+ * Changed:         2023-02-08
  *
  * */
 
-#ifndef LS_STD_SERIALIZABLE_HPP
-#define LS_STD_SERIALIZABLE_HPP
+#ifndef LS_STD_I_SERIALIZABLE_HPP
+#define LS_STD_I_SERIALIZABLE_HPP
 
-#include <ls_std/core/types/Types.hpp>
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::core::interface_type
 {
-  class ISerializable
+  class LS_STD_DYNAMIC_GOAL ISerializable
   {
     public:
 
-      ISerializable() = default;
-      ~ISerializable() = default;
+      ISerializable();
+      virtual ~ISerializable();
 
       virtual ls::std::core::type::byte_field marshal() = 0;
       virtual void unmarshal(const ls::std::core::type::byte_field &_data) = 0;

+ 6 - 5
include/ls_std/core/interface/IStorable.hpp → include/ls-std/core/interface/IStorable.hpp

@@ -3,23 +3,24 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-19
- * Changed:         2022-07-02
+ * Changed:         2023-02-08
  *
  * */
 
 #ifndef LS_STD_I_STORABLE_HPP
 #define LS_STD_I_STORABLE_HPP
 
-#include <ls_std/core/types/Types.hpp>
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::core::interface_type
 {
-  class IStorable
+  class LS_STD_DYNAMIC_GOAL IStorable
   {
     public:
 
-      IStorable() = default;
-      ~IStorable() = default;
+      IStorable();
+      virtual ~IStorable();
 
       virtual ls::std::core::type::byte_field load() = 0;
       virtual void save(const ls::std::core::type::byte_field &_data) = 0;

+ 28 - 0
include/ls-std/core/interface/IValidator.hpp

@@ -0,0 +1,28 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-08
+* Changed:         2023-02-08
+*
+* */
+
+#ifndef LS_STD_I_VALIDATOR_HPP
+#define LS_STD_I_VALIDATOR_HPP
+
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::core::interface_type
+{
+  class LS_STD_DYNAMIC_GOAL IValidator
+  {
+    public:
+
+      IValidator();
+      virtual ~IValidator();
+
+      virtual bool isValid() = 0;
+  };
+}
+
+#endif

+ 6 - 5
include/ls_std/core/interface/IWriter.hpp → include/ls-std/core/interface/IWriter.hpp

@@ -3,24 +3,25 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-07-02
+ * Changed:         2023-02-08
  *
  * */
 
 #ifndef LS_STD_I_WRITER_HPP
 #define LS_STD_I_WRITER_HPP
 
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <vector>
-#include <ls_std/core/types/Types.hpp>
 
 namespace ls::std::core::interface_type
 {
-  class IWriter
+  class LS_STD_DYNAMIC_GOAL IWriter
   {
     public:
 
-      IWriter() = default;
-      ~IWriter() = default;
+      IWriter();
+      virtual ~IWriter();
 
       virtual bool write(const ls::std::core::type::byte_field &_data) = 0;
   };

+ 2 - 2
include/ls_std/core/types/EventTypes.hpp → include/ls-std/core/type/EventTypes.hpp

@@ -3,16 +3,16 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-26
- * Changed:         2022-07-02
+ * Changed:         2023-02-08
  *
  * */
 
 #ifndef LS_STD_EVENT_TYPES_HPP
 #define LS_STD_EVENT_TYPES_HPP
 
+#include <map>
 #include <string>
 #include <vector>
-#include <map>
 
 namespace ls::std::core::type
 {

+ 3 - 3
include/ls_std/core/types/Types.hpp → include/ls-std/core/type/Types.hpp

@@ -3,19 +3,19 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-07
- * Changed:         2022-07-14
+ * Changed:         2023-02-23
  *
  * */
 
 #ifndef LS_STD_TYPES_HPP
 #define LS_STD_TYPES_HPP
 
+#include <ls-std/lib/nlohmann_json/include/nlohmann/json.hpp>
 #include <string>
-#include <ls_std/lib/nlohmann_json/include/nlohmann/json.hpp>
 
 namespace ls::std::core::type
 {
-  using byte = char;
+  using byte_type = char;
   using byte_field = ::std::string;
   using long_type = long long int;
   using version_type = uint16_t;

+ 50 - 0
include/ls-std/encoding/Base64.hpp

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

+ 11 - 11
include/ls_std/event/Event.hpp → include/ls-std/event/Event.hpp

@@ -3,18 +3,18 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-26
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_EVENT_HPP
 #define LS_STD_EVENT_HPP
 
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/ISerializable.hpp>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/core/type/EventTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
-#include <ls_std/core/types/EventTypes.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::event
 {
@@ -23,15 +23,15 @@ namespace ls::std::event
     public:
 
       explicit Event(const ls::std::core::type::event_id &_id);
-      ~Event() override = default;
+      ~Event() noexcept override;
 
       // additional functionality
 
-      bool addParameter(const ls::std::core::type::event_parameter &_eventParameter);
+      bool addParameter(const ls::std::core::type::event_parameter &_eventParameter); // nodiscard is optional here
       void clearParameterList();
-      ls::std::core::type::event_id getId();
-      ls::std::core::type::event_parameter_list getParameterList();
-      bool removeParameter(const ls::std::core::type::event_parameter_id &_id);
+      [[nodiscard]] ls::std::core::type::event_id getId();
+      [[nodiscard]] ls::std::core::type::event_parameter_list getParameterList();
+      bool removeParameter(const ls::std::core::type::event_parameter_id &_id); // nodiscard is optional here
       void setId(const ls::std::core::type::event_id &_id);
 
     private:
@@ -40,7 +40,7 @@ namespace ls::std::event
       ls::std::core::type::event_parameter_list parameterList{};
 
       void _assignId(const ls::std::core::type::event_id &_id);
-      bool _hasParameter(const ls::std::core::type::event_id &_id);
+      [[nodiscard]] bool _hasParameter(const ls::std::core::type::event_id &_id);
   };
 }
 

+ 8 - 8
include/ls_std/event/EventHandler.hpp → include/ls-std/event/EventHandler.hpp

@@ -3,20 +3,20 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_EVENT_HANDLER_HPP
 #define LS_STD_EVENT_HANDLER_HPP
 
-#include <ls_std/core/Class.hpp>
-#include <list>
-#include <memory>
-#include <ls_std/core/interface/IListener.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 #include "Event.hpp"
 #include "Narrator.hpp"
+#include <list>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IListener.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
 
 namespace ls::std::event
 {
@@ -25,9 +25,9 @@ namespace ls::std::event
     public:
 
       explicit EventHandler(const ls::std::core::type::event_id &_id);
-      ~EventHandler() override = default;
+      ~EventHandler() noexcept override;
 
-      ls::std::core::type::event_id getId();
+      [[nodiscard]] ls::std::core::type::event_id getId();
 
     private:
 

+ 12 - 12
include/ls_std/event/EventManager.hpp → include/ls-std/event/EventManager.hpp

@@ -3,20 +3,20 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_EVENT_MANAGER_HPP
 #define LS_STD_EVENT_MANAGER_HPP
 
-#include <ls_std/core/Class.hpp>
+#include "EventHandler.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEventSubscriber.hpp>
+#include <ls-std/core/type/EventTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <map>
-#include <ls_std/core/types/EventTypes.hpp>
 #include <memory>
-#include "EventHandler.hpp"
-#include <ls_std/core/interface/IEventSubscriber.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::event
 {
@@ -25,7 +25,7 @@ namespace ls::std::event
     public:
 
       explicit EventManager();
-      ~EventManager() override = default;
+      ~EventManager() noexcept override;
 
       // implementation
 
@@ -34,17 +34,17 @@ namespace ls::std::event
 
       // additional functionality
 
-      bool addEventHandler(const ::std::shared_ptr<ls::std::event::EventHandler> &_eventHandler);
+      bool addEventHandler(const ::std::shared_ptr<ls::std::event::EventHandler> &_eventHandler); // nodiscard is optional here
       void fire(ls::std::event::Event _event);
-      bool hasEventHandler(const ls::std::core::type::event_id &_id);
-      bool removeEventHandler(const ::std::shared_ptr<ls::std::event::EventHandler> &_eventHandler);
+      [[nodiscard]] bool hasEventHandler(const ls::std::core::type::event_id &_id);
+      bool removeEventHandler(const ::std::shared_ptr<ls::std::event::EventHandler> &_eventHandler); // nodiscard is optional here
 
     private:
 
       ::std::map<ls::std::core::type::event_id, ::std::shared_ptr<ls::std::event::EventHandler>> eventHandlers{};
 
-      bool _hasEventHandler(const ls::std::core::type::event_id &_id);
-      bool _removeEventHandler(const ::std::shared_ptr<ls::std::event::EventHandler> &_eventHandler);
+      [[nodiscard]] bool _hasEventHandler(const ls::std::core::type::event_id &_id);
+      [[nodiscard]] bool _removeEventHandler(const ::std::shared_ptr<ls::std::event::EventHandler> &_eventHandler);
   };
 }
 

+ 10 - 8
include/ls_std/event/Narrator.hpp → include/ls-std/event/Narrator.hpp

@@ -3,17 +3,17 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-14
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_NARRATOR_HPP
 #define LS_STD_NARRATOR_HPP
 
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/IListener.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 #include <list>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IListener.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
 
 namespace ls::std::event
@@ -23,17 +23,19 @@ namespace ls::std::event
     public:
 
       Narrator();
-      ~Narrator() override = default;
+      ~Narrator() noexcept override;
 
-      bool addListener(const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener);
+      bool addListener(const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener); // nodiscard is optional here
       void clear();
-      ::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);
+      [[nodiscard]] ::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); // nodiscard is optional here
       void tell(const ls::std::core::Class &_info);
 
     private:
 
       ::std::list<::std::shared_ptr<ls::std::core::interface_type::IListener>> listeners{};
+
+      [[nodiscard]] bool _hasListener(const ::std::shared_ptr<ls::std::core::interface_type::IListener> &_listener);
   };
 }
 

+ 9 - 9
include/ls_std/event/serialization/SerializableJsonEvent.hpp → include/ls-std/event/serialization/SerializableJsonEvent.hpp

@@ -3,19 +3,19 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-12-07
- * Changed:         2022-07-14
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_SERIALIZABLE_JSON_EVENT_HPP
 #define LS_STD_SERIALIZABLE_JSON_EVENT_HPP
 
-#include <ls_std/core/interface/ISerializable.hpp>
-#include <ls_std/core/Class.hpp>
-#include <ls_std/event/Event.hpp>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/core/type/Types.hpp>
+#include <ls-std/event/Event.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 #include <memory>
-#include <ls_std/core/types/Types.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
 
 namespace ls::std::event
 {
@@ -24,16 +24,16 @@ namespace ls::std::event
     public:
 
       explicit SerializableJsonEvent(const ::std::shared_ptr<ls::std::event::Event> &_value);
-      ~SerializableJsonEvent() override = default;
+      ~SerializableJsonEvent() noexcept override;
 
       // implementation
 
-      ls::std::core::type::byte_field marshal() override;
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
       void unmarshal(const ls::std::core::type::byte_field &_data) override;
 
       // additional functionality
 
-      ::std::shared_ptr<ls::std::event::Event> getValue();
+      [[nodiscard]] ::std::shared_ptr<ls::std::event::Event> getValue();
       void setValue(const ::std::shared_ptr<ls::std::event::Event> &_value);
 
     private:

+ 117 - 0
include/ls-std/io/File.hpp

@@ -0,0 +1,117 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-15
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_FILE_HPP
+#define LS_STD_FILE_HPP
+
+#include <ctime>
+#if defined(unix) || defined(__APPLE__)
+  #include <dirent.h>
+#endif
+#include <list>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+#include <vector>
+#ifdef _WIN32
+  #include <windows.h>
+#endif
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL File : public ls::std::core::Class
+  {
+    public:
+
+      explicit File(::std::string _absoluteFilePath);
+      ~File() noexcept override;
+
+      // comparison operators
+
+      bool operator==(ls::std::io::File &_file);
+      bool operator!=(ls::std::io::File &_file);
+
+      // additional functionality
+
+      [[nodiscard]] bool canExecute();
+      [[nodiscard]] bool canRead();
+      [[nodiscard]] bool canWrite();
+      void createNewFile();
+      [[nodiscard]] bool exists();
+      [[nodiscard]] ::std::string getAbsoluteFilePath();
+      [[nodiscard]] ::std::string getName();
+      [[nodiscard]] ::std::string getParent();
+      [[nodiscard]] long getSize();
+      [[nodiscard]] static ::std::string getWorkingDirectory();
+      [[nodiscard]] bool isDirectory();
+      [[nodiscard]] bool isFile();
+      [[nodiscard]] time_t lastModified();
+      [[nodiscard]] ::std::list<::std::string> list();
+      [[nodiscard]] ::std::list<::std::string> listFiles();
+      void makeDirectory();
+      void makeDirectories();
+      void remove();
+      bool renameTo(const ::std::string &_newName); // nodiscard is optional here
+      void reset(const ::std::string &_newPath);
+
+    private:
+
+      ::std::string absoluteFilePath{};
+
+#if defined(unix) || defined(__APPLE__)
+      static void _addToFileListUnix(const ::std::string &_path, bool _withDirectories, dirent *directoryEntity, ::std::list<::std::string> &_list);
+#endif
+#ifdef _WIN32
+      static void _addToFileListWindows(const ::std::string &_path, bool _withDirectories, WIN32_FIND_DATA _data, ::std::list<::std::string> &_list);
+#endif
+      [[nodiscard]] static bool _equals(ls::std::io::File &_file, ls::std::io::File &_foreignFile);
+      [[nodiscard]] static bool _exists(const ::std::string &_path);
+      [[nodiscard]] static ::std::string _getParent(const ::std::string &_path);
+#if defined(unix) || defined(__APPLE__)
+      [[nodiscard]] static ::std::string _getWorkingDirectoryUnix();
+#endif
+#ifdef _WIN32
+      [[nodiscard]] static ::std::string _getWorkingDirectoryWindows();
+#endif
+      [[nodiscard]] static bool _isDirectory(const ::std::string &_path);
+      [[nodiscard]] static bool _isExecutable(const ::std::string &_path);
+      [[nodiscard]] static bool _isFile(const ::std::string &_path);
+#if defined(unix) || defined(__APPLE__)
+      [[nodiscard]] static bool _isReadableUnix(const ::std::string &_path);
+#endif
+#ifdef _WIN32
+      [[nodiscard]] static bool _isReadableWindows(const ::std::string &_path);
+#endif
+      [[nodiscard]] static bool _isWritable(const ::std::string &_path);
+      [[nodiscard]] static time_t _lastModified(const ::std::string &_path);
+      [[nodiscard]] static ::std::list<::std::string> _list(const ::std::string &_path);
+      [[nodiscard]] static ::std::list<::std::string> _listFiles(const ::std::string &_path);
+#if defined(unix) || defined(__APPLE__)
+      [[nodiscard]] static ::std::list<::std::string> _listUnix(const ::std::string &_path, bool withDirectories);
+#endif
+#ifdef _WIN32
+      [[nodiscard]] static ::std::list<::std::string> _listWindows(const ::std::string &_path, bool withDirectories);
+#endif
+      [[nodiscard]] static bool _makeDirectory(const ::std::string &_path);
+      [[nodiscard]] static ::std::string _normalizePath(::std::string _path);
+      [[nodiscard]] static ::std::string _reduceSeparators(const ::std::string &_path);
+      static void _remove(const ::std::string &_path);
+#if defined(unix) || defined(__APPLE__)
+      static void _removeUnix(const ::std::string &_path);
+#endif
+#ifdef _WIN32
+      static void _removeWindows(const ::std::string &_path);
+#endif
+      [[nodiscard]] static bool _renameTo(const ::std::string &_oldName, const ::std::string &_newName);
+      [[nodiscard]] static ::std::string _replaceWrongSeparator(::std::string _path);
+      [[nodiscard]] static ::std::vector<::std::string> _splitIntoSubDirectoryNames(const ::std::string &_path);
+  };
+}
+
+#endif

+ 6 - 6
include/ls_std/io/FileOutputStream.hpp → include/ls-std/io/FileOutputStream.hpp

@@ -3,18 +3,18 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-20
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_FILE_OUTPUT_STREAM_HPP
 #define LS_STD_FILE_OUTPUT_STREAM_HPP
 
-#include <ls_std/core/Class.hpp>
 #include "File.hpp"
-#include <ls_std/core/interface/IWriter.hpp>
 #include <fstream>
-#include <ls_std/os/dynamic_goal.hpp>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IWriter.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::io
 {
@@ -24,10 +24,10 @@ namespace ls::std::io
 
       explicit FileOutputStream(ls::std::io::File &_file);
       explicit FileOutputStream(ls::std::io::File &_file, bool _append);
-      ~FileOutputStream() override;
+      ~FileOutputStream() noexcept override;
 
       void close();
-      bool write(const ls::std::core::type::byte_field &_data) override;
+      bool write(const ls::std::core::type::byte_field &_data) override; // nodiscard is optional here
 
     private:
 

+ 31 - 0
include/ls-std/io/FilePathSeparator.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-15
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_FILE_PATH_SEPARATOR_HPP
+#define LS_STD_FILE_PATH_SEPARATOR_HPP
+
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL FilePathSeparator
+  {
+    public:
+
+      FilePathSeparator();
+      ~FilePathSeparator();
+
+      [[nodiscard]] static char get();
+      [[nodiscard]] static char getUnixFilePathSeparator();
+      [[nodiscard]] static char getWindowsFilePathSeparator();
+  };
+}
+
+#endif

+ 28 - 0
include/ls-std/io/FilePathSeparatorMatch.hpp

@@ -0,0 +1,28 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-15
+ * Changed:         2023-02-22
+ *
+ * */
+
+#ifndef LS_STD_FILE_PATH_SEPARATOR_MATCH_HPP
+#define LS_STD_FILE_PATH_SEPARATOR_MATCH_HPP
+
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL FilePathSeparatorMatch
+  {
+    public:
+
+      FilePathSeparatorMatch();
+      ~FilePathSeparatorMatch();
+
+      bool operator()(char _char) const;
+  };
+}
+
+#endif

+ 6 - 8
include/ls_std/io/FileReader.hpp → include/ls-std/io/FileReader.hpp

@@ -3,17 +3,17 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_FILE_READER_HPP
 #define LS_STD_FILE_READER_HPP
 
-#include <ls_std/core/Class.hpp>
 #include "File.hpp"
-#include <ls_std/core/interface/IReader.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IReader.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::io
 {
@@ -22,16 +22,14 @@ namespace ls::std::io
     public:
 
       explicit FileReader(ls::std::io::File &_file);
-      ~FileReader() override = default;
+      ~FileReader() noexcept override;
 
-      ls::std::core::type::byte_field read() override;
+      [[nodiscard]] ls::std::core::type::byte_field read() override;
       void reset(ls::std::io::File &_file);
 
     private:
 
       ls::std::io::File file;
-
-      static void _init(ls::std::io::File &_file);
   };
 }
 

+ 6 - 8
include/ls_std/io/FileWriter.hpp → include/ls-std/io/FileWriter.hpp

@@ -3,17 +3,17 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-17
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_FILE_WRITER_HPP
 #define LS_STD_FILE_WRITER_HPP
 
-#include <ls_std/core/Class.hpp>
-#include <ls_std/core/interface/IWriter.hpp>
 #include "File.hpp"
-#include <ls_std/os/dynamic_goal.hpp>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IWriter.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::io
 {
@@ -22,16 +22,14 @@ namespace ls::std::io
     public:
 
       explicit FileWriter(ls::std::io::File &_file);
-      ~FileWriter() override = default;
+      ~FileWriter() noexcept override;
 
       void reset(ls::std::io::File &_file);
-      bool write(const ls::std::core::type::byte_field &_data) override;
+      bool write(const ls::std::core::type::byte_field &_data) override; // nodiscard is optional here
 
     private:
 
       ls::std::io::File file;
-
-      static void _init(ls::std::io::File &_file);
   };
 }
 

+ 31 - 0
include/ls-std/io/NewLine.hpp

@@ -0,0 +1,31 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-18
+ * Changed:         2023-02-06
+ *
+ * */
+
+#ifndef LS_STD_NEW_LINE_HPP
+#define LS_STD_NEW_LINE_HPP
+
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL NewLine
+  {
+    public:
+
+      NewLine();
+      ~NewLine();
+
+      [[nodiscard]] static ::std::string get();
+      [[nodiscard]] static ::std::string getUnixNewLine();
+      [[nodiscard]] static ::std::string getWindowsNewLine();
+  };
+}
+
+#endif

+ 6 - 6
include/ls_std/io/StandardOutputWriter.hpp → include/ls-std/io/StandardOutputWriter.hpp

@@ -3,15 +3,15 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-06
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_STANDARD_OUTPUT_WRITER_HPP
 #define LS_STD_STANDARD_OUTPUT_WRITER_HPP
 
-#include <ls_std/core/interface/IWriter.hpp>
-#include <ls_std/os/dynamic_goal.hpp>
+#include <ls-std/core/interface/IWriter.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
 
 namespace ls::std::io
 {
@@ -19,10 +19,10 @@ namespace ls::std::io
   {
     public:
 
-      StandardOutputWriter() = default;
-      ~StandardOutputWriter() = default;
+      StandardOutputWriter();
+      ~StandardOutputWriter() noexcept override;
 
-      bool write(const ls::std::core::type::byte_field &_data) override;
+      bool write(const ls::std::core::type::byte_field &_data) override; // nodiscard is optional here
   };
 }
 

+ 8 - 8
include/ls_std/io/StorableFile.hpp → include/ls-std/io/StorableFile.hpp

@@ -3,18 +3,18 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-19
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_STORABLE_FILE_HPP
 #define LS_STD_STORABLE_FILE_HPP
 
-#include <string>
-#include <memory>
-#include <ls_std/core/interface/IStorable.hpp>
 #include "File.hpp"
-#include <ls_std/os/dynamic_goal.hpp>
+#include <ls-std/core/interface/IStorable.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
 
 namespace ls::std::io
 {
@@ -23,10 +23,10 @@ namespace ls::std::io
     public:
 
       explicit StorableFile(const ::std::string &_path);
-      ~StorableFile() = default;
+      ~StorableFile() noexcept override;
 
-      ::std::shared_ptr<ls::std::io::File> getFile();
-      ls::std::core::type::byte_field load() override;
+      [[nodiscard]] ::std::shared_ptr<ls::std::io::File> getFile();
+      [[nodiscard]] ls::std::core::type::byte_field load() override;
       void reset(const ::std::string &_path);
       void save(const ls::std::core::type::byte_field &_data) override;
 

+ 35 - 0
include/ls-std/io/evaluator/FileExistenceEvaluator.hpp

@@ -0,0 +1,35 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-21
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_FILE_EXISTENCE_EVALUATOR_HPP
+#define LS_STD_FILE_EXISTENCE_EVALUATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL FileExistenceEvaluator : public ls::std::core::Class, public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit FileExistenceEvaluator(::std::string _filePath);
+      ~FileExistenceEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::string filePath{};
+  };
+}
+
+#endif

+ 10 - 10
include/ls_std/io/logging/LogLevel.hpp → include/ls-std/io/logging/LogLevel.hpp

@@ -3,17 +3,17 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-20
- * Changed:         2022-07-03
+ * Changed:         2023-02-22
  *
  * */
 
 #ifndef LS_STD_LOG_LEVEL_HPP
 #define LS_STD_LOG_LEVEL_HPP
 
-#include <unordered_map>
-#include <ls_std/core/Class.hpp>
 #include "LogLevelValue.hpp"
-#include <ls_std/os/dynamic_goal.hpp>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <unordered_map>
 
 namespace ls::std::io
 {
@@ -23,9 +23,8 @@ namespace ls::std::io
 
       explicit LogLevel(const ls::std::io::LogLevelValue &_value);
       LogLevel();
-      ~LogLevel() override = default;
-
-      operator unsigned char() const;
+      ~LogLevel() noexcept override;
+      ;
       ls::std::io::LogLevel &operator=(const ls::std::io::LogLevelValue &_value);
       bool operator<(const ls::std::io::LogLevelValue &_value);
       bool operator<=(const ls::std::io::LogLevelValue &_value);
@@ -33,18 +32,19 @@ namespace ls::std::io
       bool operator>=(const ls::std::io::LogLevelValue &_value);
       bool operator==(const ls::std::io::LogLevelValue &_value);
 
+      [[nodiscard]] ls::std::io::LogLevelValue getValue();
       void setLogLevel(const ls::std::io::LogLevelValue &_value);
       void setLogLevel(const ::std::string &_value);
-      ::std::string toString() const;
+      [[nodiscard]] ::std::string toString() const;
 
     private:
 
       ::std::unordered_map<uint8_t, ::std::string> level{};
       ls::std::io::LogLevelValue value{};
 
-      ls::std::io::LogLevelValue _getValueFromString(const ::std::string &_value);
+      [[nodiscard]] ls::std::io::LogLevelValue _getValueFromString(const ::std::string &_value);
       void _init();
-      bool _isValidLogLevelString(const ::std::string &_value);
+      [[nodiscard]] bool _isValidLogLevelString(const ::std::string &_value);
   };
 }
 

+ 7 - 2
include/ls_std/io/logging/LogLevelValue.hpp → include/ls-std/io/logging/LogLevelValue.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-08-20
- * Changed:         2022-07-02
+ * Changed:         2023-02-04
  *
  * */
 
@@ -14,7 +14,12 @@ namespace ls::std::io
 {
   enum LogLevelValue
   {
-    FATAL = 0, ERR, WARN, INFO, DEBUG, TRACE
+    FATAL = 0,
+    ERR,
+    WARN,
+    INFO,
+    DEBUG,
+    TRACE
   };
 }
 

+ 53 - 0
include/ls-std/io/logging/Logger.hpp

@@ -0,0 +1,53 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2020-08-20
+ * Changed:         2023-02-23
+ *
+ * */
+
+#ifndef LS_STD_LOGGER_HPP
+#define LS_STD_LOGGER_HPP
+
+#include "LogLevel.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IWriter.hpp>
+#include <ls-std/io/File.hpp>
+#include <ls-std/io/FileOutputStream.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL Logger : public ls::std::core::Class
+  {
+    public:
+
+      explicit Logger(const ::std::shared_ptr<ls::std::core::interface_type::IWriter> &_writer);
+      ~Logger() noexcept override;
+
+      void debug(const ls::std::core::type::byte_type *_data);
+      void error(const ls::std::core::type::byte_type *_data);
+      void fatal(const ls::std::core::type::byte_type *_data);
+      [[nodiscard]] ls::std::io::LogLevel getLogLevel();
+      void info(const ls::std::core::type::byte_type *_data);
+      void setLogLevel(const ls::std::io::LogLevelValue &_logLevelValue);
+      void trace(const ls::std::core::type::byte_type *_data);
+      void warn(const ls::std::core::type::byte_type *_data);
+
+    private:
+
+      ls::std::io::LogLevel logLevel{};
+      ::std::shared_ptr<ls::std::core::interface_type::IWriter> writer{};
+
+      void _assignWriter(const ::std::shared_ptr<ls::std::core::interface_type::IWriter> &_writer);
+      [[nodiscard]] static ::std::string _buildCharacterChain(size_t _amount);
+      [[nodiscard]] static ::std::string _createFillContent(const ::std::string &_text);
+      [[nodiscard]] static ::std::string _generateTimeString(tm *_localTime);
+      void _log(const ls::std::core::type::byte_type *_data, const ls::std::io::LogLevel &_logLevel);
+      [[nodiscard]] static ::std::string _padRight(const ::std::string &_text);
+  };
+}
+
+#endif

+ 29 - 0
include/ls-std/io/section-pair/SectionPairMessageFormatter.hpp

@@ -0,0 +1,29 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-22
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_MESSAGE_FORMATTER_HPP
+#define LS_STD_SECTION_PAIR_MESSAGE_FORMATTER_HPP
+
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairMessageFormatter
+  {
+    public:
+
+      SectionPairMessageFormatter();
+      ~SectionPairMessageFormatter();
+
+      [[nodiscard]] static ::std::string getFormattedMessage(const ::std::string &_message);
+  };
+}
+
+#endif

+ 23 - 0
include/ls-std/io/section-pair/SectionPairRowEnumType.hpp

@@ -0,0 +1,23 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-08
+* Changed:         2023-02-10
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_ENUM_TYPE_HPP
+#define LS_STD_SECTION_PAIR_ROW_ENUM_TYPE_HPP
+
+namespace ls::std::io
+{
+  enum SectionPairRowEnumType
+  {
+    SECTION_PAIR_ROW_NOT_IMPLEMENTED = 0,
+    SECTION_PAIR_ROW_LIST_VALUE,
+    SECTION_PAIR_ROW_SINGLE_VALUE
+  };
+}
+
+#endif

+ 21 - 0
include/ls-std/io/section-pair/SectionPairTypes.hpp

@@ -0,0 +1,21 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-10
+* Changed:         2023-02-10
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_TYPES_HPP
+#define LS_STD_SECTION_PAIR_TYPES_HPP
+
+#include <string>
+
+namespace ls::std::io
+{
+  using section_pair_identifier = ::std::string;
+  using section_pair_row_value = ::std::string;
+}
+
+#endif

+ 35 - 0
include/ls-std/io/section-pair/evaluator/SectionPairIdentifierArgumentEvaluator.hpp

@@ -0,0 +1,35 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-09
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_IDENTIFIER_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_SECTION_PAIR_IDENTIFIER_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairIdentifierArgumentEvaluator : public ls::std::core::interface_type::IEvaluator, public ls::std::core::Class
+  {
+    public:
+
+      explicit SectionPairIdentifierArgumentEvaluator(ls::std::io::section_pair_identifier _identifier);
+      ~SectionPairIdentifierArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ls::std::io::section_pair_identifier identifier{};
+  };
+}
+
+#endif

+ 35 - 0
include/ls-std/io/section-pair/evaluator/SectionPairRowArgumentEvaluator.hpp

@@ -0,0 +1,35 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_SECTION_PAIR_ROW_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowArgumentEvaluator : public ls::std::core::Class, public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit SectionPairRowArgumentEvaluator(::std::string _sectionPairRow);
+      ~SectionPairRowArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::string sectionPairRow{};
+  };
+}
+
+#endif

+ 35 - 0
include/ls-std/io/section-pair/evaluator/SectionPairRowListValueArgumentEvaluator.hpp

@@ -0,0 +1,35 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_LIST_VALUE_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_SECTION_PAIR_ROW_LIST_VALUE_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowListValueArgumentEvaluator : public ls::std::core::Class, public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit SectionPairRowListValueArgumentEvaluator(::std::string _listValueRow);
+      ~SectionPairRowListValueArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::string listValueRow{};
+  };
+}
+
+#endif

+ 35 - 0
include/ls-std/io/section-pair/evaluator/SectionPairRowSingleValueArgumentEvaluator.hpp

@@ -0,0 +1,35 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-19
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_SINGLE_VALUE_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_SECTION_PAIR_ROW_SINGLE_VALUE_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowSingleValueArgumentEvaluator : public ls::std::core::Class, public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit SectionPairRowSingleValueArgumentEvaluator(::std::string _singleValueRow);
+      ~SectionPairRowSingleValueArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::string singleValueRow{};
+  };
+}
+
+#endif

+ 35 - 0
include/ls-std/io/section-pair/evaluator/SectionPairSectionArgumentEvaluator.hpp

@@ -0,0 +1,35 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_SECTION_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_SECTION_PAIR_SECTION_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairSectionArgumentEvaluator : public ls::std::core::Class, public ls::std::core::interface_type::IEvaluator
+  {
+    public:
+
+      explicit SectionPairSectionArgumentEvaluator(::std::string _section);
+      ~SectionPairSectionArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ::std::string section{};
+  };
+}
+
+#endif

+ 36 - 0
include/ls-std/io/section-pair/evaluator/SectionPairValueArgumentEvaluator.hpp

@@ -0,0 +1,36 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-10
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_VALUE_ARGUMENT_EVALUATOR_HPP
+#define LS_STD_SECTION_PAIR_VALUE_ARGUMENT_EVALUATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairValueArgumentEvaluator : public ls::std::core::interface_type::IEvaluator, public ls::std::core::Class
+  {
+    public:
+
+      explicit SectionPairValueArgumentEvaluator(ls::std::io::section_pair_row_value _value);
+      ~SectionPairValueArgumentEvaluator() noexcept override;
+
+      void evaluate() override;
+
+    private:
+
+      ls::std::io::section_pair_row_value value{};
+  };
+}
+
+#endif

+ 55 - 0
include/ls-std/io/section-pair/model/SectionPairDocument.hpp

@@ -0,0 +1,55 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-15
+* Changed:         2023-02-23
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_DOCUMENT_HPP
+#define LS_STD_SECTION_PAIR_DOCUMENT_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/io/section-pair/type/SectionPairDocumentTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairDocument : public ::std::enable_shared_from_this<SectionPairDocument>, public ls::std::core::Class, public ls::std::core::interface_type::ISerializable
+  {
+    public:
+
+      SectionPairDocument();
+      ~SectionPairDocument() noexcept override;
+
+      void add(const ls::std::io::section_pair_document_section_list_element &_section);
+      void clear();
+      [[nodiscard]] ls::std::io::section_pair_document_section_list_element get(size_t _index);
+      [[nodiscard]] ls::std::io::section_pair_document_section_list_element get(const ls::std::io::section_pair_identifier &_sectionId);
+      [[nodiscard]] size_t getAmountOfSections();
+      [[nodiscard]] ::std::string getHeader();
+      [[nodiscard]] ls::std::io::section_pair_document_section_list getSectionList();
+      [[nodiscard]] bool hasSection(const ls::std::io::section_pair_identifier &_sectionId);
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void reserveNewLine(const ::std::string &_reservedNewLine);
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      const ::std::string header = "# section-pair document";
+      ::std::string reservedNewLine{};
+      ls::std::io::section_pair_document_section_list sections{};
+      ::std::shared_ptr<ls::std::core::interface_type::ISerializable> serializable{};
+
+      void _checkSectionExistence(const ls::std::io::section_pair_identifier &_sectionId);
+      void _createSerializable();
+      [[nodiscard]] ls::std::io::section_pair_document_section_list_element _get(const ls::std::io::section_pair_identifier &_sectionId);
+      [[nodiscard]] bool _hasSection(const ls::std::io::section_pair_identifier &_identifier);
+  };
+}
+
+#endif

+ 53 - 0
include/ls-std/io/section-pair/model/SectionPairRow.hpp

@@ -0,0 +1,53 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-08
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_HPP
+#define LS_STD_SECTION_PAIR_ROW_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/io/section-pair/SectionPairRowEnumType.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/io/section-pair/model/SectionPairRowValue.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRow : public ::std::enable_shared_from_this<SectionPairRow>, public ls::std::core::Class, public ls::std::core::interface_type::ISerializable
+  {
+    public:
+
+      explicit SectionPairRow(const ls::std::io::section_pair_identifier &_key, const ls::std::io::SectionPairRowEnumType &_type);
+      ~SectionPairRow() noexcept override;
+
+      [[nodiscard]] ls::std::io::section_pair_identifier getKey();
+      [[nodiscard]] ::std::shared_ptr<ls::std::io::SectionPairRowValue> getValue();
+      [[nodiscard]] bool isList();
+      [[nodiscard]] bool isSingleValue();
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void reserveNewLine(const ::std::string &_reservedNewLine);
+      void setKey(const ls::std::io::section_pair_identifier &_key);
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ls::std::io::section_pair_identifier key{};
+      ::std::string reservedNewLine{};
+      ::std::shared_ptr<ls::std::core::interface_type::ISerializable> serializable{};
+      ::std::shared_ptr<ls::std::io::SectionPairRowValue> value{};
+
+      void _createSerializable();
+      void _initValue(const ls::std::io::SectionPairRowEnumType &_type);
+      void _setKey(const ls::std::io::section_pair_identifier &_key);
+  };
+}
+
+#endif

+ 46 - 0
include/ls-std/io/section-pair/model/SectionPairRowListValue.hpp

@@ -0,0 +1,46 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-10
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_LIST_VALUE_HPP
+#define LS_STD_SECTION_PAIR_ROW_LIST_VALUE_HPP
+
+#include "SectionPairRowValue.hpp"
+#include <list>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowListValue : public ::std::enable_shared_from_this<SectionPairRowListValue>, public ls::std::core::Class, public ls::std::io::SectionPairRowValue
+  {
+    public:
+
+      SectionPairRowListValue();
+      ~SectionPairRowListValue() noexcept override;
+
+      void add(const ls::std::io::section_pair_row_value &_value);
+      void clear();
+      [[nodiscard]] ls::std::io::section_pair_row_value get(size_t _index);
+      [[nodiscard]] ::std::list<ls::std::io::section_pair_row_value> getList();
+      [[nodiscard]] size_t getSize();
+      [[nodiscard]] ls::std::io::SectionPairRowEnumType getType() override;
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ::std::shared_ptr<ls::std::core::interface_type::ISerializable> serializable{};
+      ::std::list<ls::std::io::section_pair_row_value> values{};
+
+      void _createSerializable();
+  };
+}
+
+#endif

+ 45 - 0
include/ls-std/io/section-pair/model/SectionPairRowSingleValue.hpp

@@ -0,0 +1,45 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-10
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_SINGLE_VALUE_HPP
+#define LS_STD_SECTION_PAIR_ROW_SINGLE_VALUE_HPP
+
+#include "SectionPairRowValue.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowSingleValue : public ::std::enable_shared_from_this<SectionPairRowSingleValue>, public ls::std::core::Class, public ls::std::io::SectionPairRowValue
+  {
+    public:
+
+      explicit SectionPairRowSingleValue(const ls::std::io::section_pair_row_value &_value);
+      ~SectionPairRowSingleValue() noexcept override;
+
+      [[nodiscard]] ls::std::io::section_pair_row_value get();
+      [[nodiscard]] ls::std::io::SectionPairRowEnumType getType() override;
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void set(const ls::std::io::section_pair_row_value &_value);
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ::std::shared_ptr<ls::std::core::interface_type::ISerializable> serializable{};
+      ls::std::io::section_pair_row_value value{};
+
+      void _createSerializable();
+      void _set(const ls::std::io::section_pair_row_value &_value);
+  };
+}
+
+#endif

+ 38 - 0
include/ls-std/io/section-pair/model/SectionPairRowValue.hpp

@@ -0,0 +1,38 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-10
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_VALUE_HPP
+#define LS_STD_SECTION_PAIR_ROW_VALUE_HPP
+
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/io/section-pair/SectionPairRowEnumType.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowValue : public ls::std::core::interface_type::ISerializable
+  {
+    public:
+
+      explicit SectionPairRowValue(const ls::std::io::SectionPairRowEnumType &_type);
+      ~SectionPairRowValue() noexcept override;
+
+      virtual ls::std::io::SectionPairRowEnumType getType() = 0;
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void reserveNewLine(const ::std::string &_reservedNewLine);
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    protected:
+
+      ::std::string reservedNewLine{};
+      ls::std::io::SectionPairRowEnumType type{};
+  };
+}
+
+#endif

+ 59 - 0
include/ls-std/io/section-pair/model/SectionPairSection.hpp

@@ -0,0 +1,59 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-13
+* Changed:         2023-02-23
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_SECTION_HPP
+#define LS_STD_SECTION_PAIR_SECTION_HPP
+
+#include <list>
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/io/section-pair/type/SectionPairSectionTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairSection : public ::std::enable_shared_from_this<SectionPairSection>, public ls::std::core::Class, public ls::std::core::interface_type::ISerializable
+  {
+    public:
+
+      explicit SectionPairSection(const ls::std::io::section_pair_identifier &_sectionId);
+      ~SectionPairSection() noexcept override;
+
+      void add(const ls::std::io::section_pair_row_list_element &_row);
+      void clear();
+      [[nodiscard]] ls::std::io::section_pair_row_list_element get(size_t _index);
+      [[nodiscard]] ls::std::io::section_pair_row_list_element get(const ls::std::io::section_pair_identifier &_key);
+      [[nodiscard]] ls::std::io::section_pair_row_list getList();
+      [[nodiscard]] size_t getRowAmount();
+      [[nodiscard]] ls::std::io::section_pair_identifier getSectionId();
+      [[nodiscard]] bool hasRow(const ls::std::io::section_pair_identifier &_key);
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void reserveNewLine(const ::std::string &_reservedNewLine);
+      void setSectionId(const ls::std::io::section_pair_identifier &_sectionId);
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ::std::string reservedNewLine{};
+      ls::std::io::section_pair_row_list rows{};
+      ls::std::io::section_pair_identifier sectionId{};
+      ::std::shared_ptr<ls::std::core::interface_type::ISerializable> serializable{};
+
+      void _createSerializable();
+      [[nodiscard]] ls::std::io::section_pair_row_list_element _get(const ls::std::io::section_pair_identifier &_key);
+      [[nodiscard]] bool _hasRow(const ls::std::io::section_pair_identifier &_key);
+      void _rowExistenceCheck(const ls::std::io::section_pair_identifier &_key);
+      void _setSectionId(const ls::std::io::section_pair_identifier &_sectionId);
+  };
+}
+
+#endif

+ 42 - 0
include/ls-std/io/section-pair/reader/SectionPairFileReader.hpp

@@ -0,0 +1,42 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-21
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_FILE_READER_HPP
+#define LS_STD_SECTION_PAIR_FILE_READER_HPP
+
+#include "SectionPairFileReaderParameter.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IReader.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairFileReader : public ls::std::core::Class, public ls::std::core::interface_type::IReader
+  {
+    public:
+
+      explicit SectionPairFileReader(const ls::std::io::SectionPairFileReaderParameter &_parameter);
+      ~SectionPairFileReader() noexcept override;
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::io::SectionPairDocument> getDocument();
+      ls::std::core::type::byte_field read() override; // nodiscard is optional here
+
+    private:
+
+      ls::std::io::SectionPairFileReaderParameter parameter{};
+
+      void _checkFileExtension();
+      void _createDocument();
+      void _createFileExistenceEvaluator();
+      void _createReader();
+  };
+}
+
+#endif

+ 47 - 0
include/ls-std/io/section-pair/reader/SectionPairFileReaderParameter.hpp

@@ -0,0 +1,47 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-21
+* Changed:         2023-02-21
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_FILE_READER_PARAMETER_HPP
+#define LS_STD_SECTION_PAIR_FILE_READER_PARAMETER_HPP
+
+#include <ls-std/core/interface/IEvaluator.hpp>
+#include <ls-std/core/interface/IReader.hpp>
+#include <ls-std/io/section-pair/model/SectionPairDocument.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairFileReaderParameter
+  {
+    public:
+
+      SectionPairFileReaderParameter();
+      ~SectionPairFileReaderParameter();
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::io::SectionPairDocument> getDocument();
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::interface_type::IEvaluator> getFileExistenceEvaluator();
+      [[nodiscard]] ::std::string getFilePath();
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::interface_type::IReader> getReader();
+      void setDocument(const ::std::shared_ptr<ls::std::io::SectionPairDocument> &_document);
+      void setFileExistenceEvaluator(const ::std::shared_ptr<ls::std::core::interface_type::IEvaluator> &_fileExistenceEvaluator);
+      void setFilePath(const ::std::string &_filePath);
+      void setReader(const ::std::shared_ptr<ls::std::core::interface_type::IReader> &_reader);
+
+    private:
+
+      ::std::shared_ptr<ls::std::io::SectionPairDocument> document{};
+      ::std::shared_ptr<ls::std::core::interface_type::IEvaluator> fileExistenceEvaluator{};
+      ::std::string filePath{};
+      ::std::shared_ptr<ls::std::core::interface_type::IReader> reader{};
+  };
+}
+
+#endif

+ 43 - 0
include/ls-std/io/section-pair/serialization/SerializableSectionPairDocument.hpp

@@ -0,0 +1,43 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-16
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SERIALIZABLE_SECTION_PAIR_DOCUMENT_HPP
+#define LS_STD_SERIALIZABLE_SECTION_PAIR_DOCUMENT_HPP
+
+#include "SerializableSectionPairParameter.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SerializableSectionPairDocument : public ls::std::core::interface_type::ISerializable, public ls::std::core::Class
+  {
+    public:
+
+      explicit SerializableSectionPairDocument(const ls::std::io::SerializableSectionPairParameter &_parameter);
+      ~SerializableSectionPairDocument() noexcept override;
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::Class> getValue();
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ls::std::io::SerializableSectionPairParameter parameter{};
+
+      [[nodiscard]] ls::std::core::type::byte_field _getCurrentRow(size_t _iterations, const ls::std::core::type::byte_field &_serializedDocument);
+      [[nodiscard]] ls::std::core::type::byte_field _getNextSerializedSection(const ls::std::core::type::byte_field &_serializedDocument);
+      [[nodiscard]] bool _isNotNewSection(const ls::std::core::type::byte_field &_currentRow);
+      void _addSection(const ls::std::core::type::byte_field &_serializedSection);
+  };
+}
+
+#endif

+ 39 - 0
include/ls-std/io/section-pair/serialization/SerializableSectionPairParameter.hpp

@@ -0,0 +1,39 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-17
+* Changed:         2023-02-17
+*
+* */
+
+#ifndef LS_STD_SERIALIZABLE_SECTION_PAIR_PARAMETER_HPP
+#define LS_STD_SERIALIZABLE_SECTION_PAIR_PARAMETER_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SerializableSectionPairParameter
+  {
+    public:
+
+      SerializableSectionPairParameter();
+      ~SerializableSectionPairParameter();
+
+      [[nodiscard]] ::std::string getNewLine();
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::Class> getValue() const;
+      void setNewLine(const ::std::string &_newLine);
+      void setValue(const ::std::shared_ptr<ls::std::core::Class> &_value);
+
+    private:
+
+      ::std::string parseNewLine{};
+      ::std::shared_ptr<ls::std::core::Class> value{};
+  };
+}
+
+#endif

+ 43 - 0
include/ls-std/io/section-pair/serialization/SerializableSectionPairRow.hpp

@@ -0,0 +1,43 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-11
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_HPP
+#define LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_HPP
+
+#include "SerializableSectionPairParameter.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SerializableSectionPairRow : public ls::std::core::interface_type::ISerializable, public ls::std::core::Class
+  {
+    public:
+
+      explicit SerializableSectionPairRow(const ls::std::io::SerializableSectionPairParameter &_parameter);
+      ~SerializableSectionPairRow() noexcept override;
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::Class> getValue();
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ls::std::io::SerializableSectionPairParameter parameter{};
+
+      [[nodiscard]] ::std::string _marshalKey();
+      void _unmarshalListValue(const ls::std::core::type::byte_field &_data);
+      void _unmarshalSingleValue(const ls::std::core::type::byte_field &_data);
+  };
+}
+
+#endif

+ 41 - 0
include/ls-std/io/section-pair/serialization/SerializableSectionPairRowListValue.hpp

@@ -0,0 +1,41 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-11
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_LIST_VALUE_HPP
+#define LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_LIST_VALUE_HPP
+
+#include "SerializableSectionPairParameter.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SerializableSectionPairRowListValue : public ls::std::core::interface_type::ISerializable, public ls::std::core::Class
+  {
+    public:
+
+      explicit SerializableSectionPairRowListValue(const ls::std::io::SerializableSectionPairParameter &_parameter);
+      ~SerializableSectionPairRowListValue() noexcept override;
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::Class> getValue();
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ls::std::io::SerializableSectionPairParameter parameter{};
+
+      [[nodiscard]] static ::std::string _getLine(::std::string::size_type _position, const ls::std::core::type::byte_field &_searchText);
+      void _updateSearchText(::std::string::size_type _position, ls::std::core::type::byte_field &_searchText);
+  };
+}
+
+#endif

+ 38 - 0
include/ls-std/io/section-pair/serialization/SerializableSectionPairRowSingleValue.hpp

@@ -0,0 +1,38 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-11
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_SINGLE_VALUE_HPP
+#define LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_SINGLE_VALUE_HPP
+
+#include "SerializableSectionPairParameter.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SerializableSectionPairRowSingleValue : public ls::std::core::interface_type::ISerializable, public ls::std::core::Class
+  {
+    public:
+
+      explicit SerializableSectionPairRowSingleValue(const ls::std::io::SerializableSectionPairParameter &_parameter);
+      ~SerializableSectionPairRowSingleValue() noexcept override;
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::Class> getValue();
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ls::std::io::SerializableSectionPairParameter parameter{};
+  };
+}
+
+#endif

+ 53 - 0
include/ls-std/io/section-pair/serialization/SerializableSectionPairSection.hpp

@@ -0,0 +1,53 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-14
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SERIALIZABLE_SECTION_PAIR_SECTION_HPP
+#define LS_STD_SERIALIZABLE_SECTION_PAIR_SECTION_HPP
+
+#include "SerializableSectionPairParameter.hpp"
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/io/section-pair/SectionPairRowEnumType.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SerializableSectionPairSection : public ls::std::core::interface_type::ISerializable, public ls::std::core::Class
+  {
+    public:
+
+      explicit SerializableSectionPairSection(const ls::std::io::SerializableSectionPairParameter &_parameter);
+      ~SerializableSectionPairSection() noexcept override;
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::Class> getValue();
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ls::std::io::SerializableSectionPairParameter parameter{};
+
+      [[nodiscard]] ls::std::core::type::byte_field _collectSectionRow(const ls::std::core::type::byte_field &_currentRows, ls::std::io::SectionPairRowEnumType &_type);
+      [[nodiscard]] ls::std::core::type::byte_field _collectSectionListValueRow(const core::type::byte_field &_currentRows, ls::std::io::SectionPairRowEnumType &_type);
+      [[nodiscard]] static core::type::byte_field _collectSectionSingleValueRow(const ls::std::core::type::byte_field &_firstRow, ls::std::io::SectionPairRowEnumType &type);
+      [[nodiscard]] static size_t _getNthSubStringPosition(const ls::std::core::type::byte_field &_text, const ls::std::core::type::byte_field &_subText);
+      [[nodiscard]] ls::std::core::type::byte_field _getSectionHeader(const ls::std::core::type::byte_field &_data);
+      [[nodiscard]] static ls::std::core::type::byte_field _getSectionId(const ls::std::core::type::byte_field &_sectionHeader);
+      [[nodiscard]] static bool _isListValueRow(const ::std::string &_currentRow);
+      [[nodiscard]] static bool _isStartingValueRow(const ::std::string &_currentRow);
+      [[nodiscard]] static bool _isSingleValueRow(const ::std::string &_currentRow);
+      [[nodiscard]] ls::std::core::type::byte_field _marshalRows();
+      [[nodiscard]] ls::std::core::type::byte_field _marshalSectionId();
+      void _unmarshalRow(const ::std::string &_sectionRow, ls::std::io::SectionPairRowEnumType _type);
+      void _unmarshalRows(const ls::std::core::type::byte_field &_serializedRows);
+      [[nodiscard]] size_t _unmarshalSectionHeader(const ls::std::core::type::byte_field &_data);
+  };
+}
+
+#endif

+ 23 - 0
include/ls-std/io/section-pair/type/SectionPairDocumentTypes.hpp

@@ -0,0 +1,23 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-15
+* Changed:         2023-02-15
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_DOCUMENT_TYPES_HPP
+#define LS_STD_SECTION_PAIR_DOCUMENT_TYPES_HPP
+
+#include <list>
+#include <ls-std/io/section-pair/model/SectionPairSection.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  using section_pair_document_section_list_element = ::std::shared_ptr<ls::std::io::SectionPairSection>;
+  using section_pair_document_section_list = ::std::list<ls::std::io::section_pair_document_section_list_element>;
+}
+
+#endif

+ 23 - 0
include/ls-std/io/section-pair/type/SectionPairSectionTypes.hpp

@@ -0,0 +1,23 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-13
+* Changed:         2023-02-13
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_SECTION_TYPES_HPP
+#define LS_STD_SECTION_PAIR_SECTION_TYPES_HPP
+
+#include <list>
+#include <ls-std/io/section-pair/model/SectionPairRow.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  using section_pair_row_list_element = ::std::shared_ptr<ls::std::io::SectionPairRow>;
+  using section_pair_row_list = ::std::list<ls::std::io::section_pair_row_list_element>;
+}
+
+#endif

+ 37 - 0
include/ls-std/io/section-pair/validator/SectionPairDocumentValidator.hpp

@@ -0,0 +1,37 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-21
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_DOCUMENT_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_DOCUMENT_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairDocumentValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairDocumentValidator(::std::string _document);
+      ~SectionPairDocumentValidator() noexcept override;
+
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string document{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

+ 35 - 0
include/ls-std/io/section-pair/validator/SectionPairFileExtensionValidator.hpp

@@ -0,0 +1,35 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-21
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_FILE_EXTENSION_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_FILE_EXTENSION_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairFileExtensionValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairFileExtensionValidator(::std::string _fileName);
+      ~SectionPairFileExtensionValidator() noexcept override;
+
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string fileName{};
+  };
+}
+
+#endif

+ 39 - 0
include/ls-std/io/section-pair/validator/SectionPairIdentifierValidator.hpp

@@ -0,0 +1,39 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-09
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_IDENTIFIER_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_IDENTIFIER_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairIdentifierValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairIdentifierValidator(ls::std::io::section_pair_identifier _identifier);
+      ~SectionPairIdentifierValidator() noexcept override;
+
+      [[nodiscard]] static ::std::string getValidationRegex();
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ls::std::io::section_pair_identifier identifier{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

+ 38 - 0
include/ls-std/io/section-pair/validator/SectionPairRowListValueValidator.hpp

@@ -0,0 +1,38 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-19
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_LIST_VALUE_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_ROW_LIST_VALUE_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowListValueValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairRowListValueValidator(::std::string _listValueRow);
+      ~SectionPairRowListValueValidator() noexcept override;
+
+      [[nodiscard]] static ::std::string getValidationRegex();
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string listValueRow{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

+ 37 - 0
include/ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.hpp

@@ -0,0 +1,37 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-19
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_SINGLE_VALUE_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_ROW_SINGLE_VALUE_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowSingleValueValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairRowSingleValueValidator(::std::string _singleValueRow);
+      ~SectionPairRowSingleValueValidator() noexcept override;
+
+      [[nodiscard]] static ::std::string getValidationRegex();
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string singleValueRow{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

+ 38 - 0
include/ls-std/io/section-pair/validator/SectionPairRowValidator.hpp

@@ -0,0 +1,38 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_ROW_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_ROW_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairRowValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairRowValidator(::std::string _row);
+      ~SectionPairRowValidator() noexcept override;
+
+      [[nodiscard]] static ::std::string getValidationRegex();
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string row{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

+ 38 - 0
include/ls-std/io/section-pair/validator/SectionPairSectionValidator.hpp

@@ -0,0 +1,38 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-22
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_SECTION_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_SECTION_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairSectionValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairSectionValidator(::std::string _section);
+      ~SectionPairSectionValidator() noexcept override;
+
+      [[nodiscard]] static ::std::string getValidationRegex();
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string section{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

Some files were not shown because too many files changed in this diff