From 6684073e4ab07eb3ee967ee82bf6c9a117cf19d6 Mon Sep 17 00:00:00 2001 From: Tibor Molnar Date: Mon, 18 Dec 2017 15:12:31 +0100 Subject: [PATCH] yasmine 1.5.0 --- CMakeHelpers/addBoost.cmake | 2 +- CMakeHelpers/addSeadexOptions.cmake | 30 + CMakeHelpers/addYasmineOptions.cmake | 23 +- CMakeLists.txt | 2 +- build/rapidjson.props | 2 +- build/use_boost.props | 4 +- build/use_essentials.props | 4 +- build/use_essentials_examples.props | 4 +- build/use_genesis.props | 2 +- build/use_hermes.props | 5 +- build/use_hermes_examples.props | 5 +- examples/classic_farmroad/CMakeLists.txt | 6 +- .../event_collector_example/CMakeLists.txt | 7 +- .../event_collector_example.vcxproj | 1 + examples/event_collector_example/events.hpp | 18 +- .../events_with_parameters/CMakeLists.txt | 7 +- examples/forty_two/CMakeLists.txt | 7 +- examples/generator_example/CMakeLists.txt | 7 +- examples/hello_yasmine/CMakeLists.txt | 7 +- .../CMakeLists.txt | 7 +- .../substatemachines_and_variables.vcxproj | 1 + .../CMakeLists.txt | 5 +- externals/CMakeLists.txt | 37 + externals/essentials/CMakeLists.txt | 7 + .../source/CMakeHelpers/addBoost.cmake | 34 + .../CMakeHelpers/addSeadexOptions.cmake | 30 + .../CMakeHelpers/addSpecificFlags.cmake | 112 ++ .../CMakeHelpers/addYasmineOptions.cmake | 34 + .../source/CMakeHelpers/functions.cmake | 22 + .../functionsAddCompilerFlags.cmake | 15 + .../CMakeHelpers/functionsRapidJSON.cmake | 30 + .../source/CMakeHelpers/setVariables.cmake | 12 + externals/essentials/source/CMakeLists.txt | 16 + externals/essentials/source/build/c++03.props | 31 + .../essentials/source/build/debug_info.props | 18 + .../essentials/source/build/essentials.props | 31 + .../essentials/source/build/use_boost.props | 30 + .../source/build/use_boost_as_external.props | 30 + .../source/build/use_boost_externals.props | 30 + .../source/build/use_essentials.props | 32 + .../source/build/use_essentials_base.props | 28 + externals/essentials/source/changelog.txt | 38 + externals/essentials/source/essentials.sln | 156 ++ .../source/essentials/CMakeLists.txt | 41 + .../source/essentials/essentials.vcxproj | 545 ++++++ .../essentials/essentials.vcxproj.filters | 107 ++ .../essentials}/include/essentials/base.hpp | 82 +- .../include/essentials/build_number.hpp | 70 +- .../essentials/compatibility/chrono.hpp | 118 +- .../compatibility/compatibility.hpp | 368 ++-- .../essentials_backward_compatibility.hpp | 62 +- .../essentials/compatibility/thread.hpp | 126 +- .../include/essentials/conversion.hpp | 106 +- .../include/essentials/essentials_version.hpp | 82 +- .../include/essentials/exception.hpp | 60 +- .../include/essentials/exception_template.hpp | 320 ++-- .../include/essentials/format_settings.hpp | 90 +- .../include/essentials/macro_helpers.hpp | 92 +- .../include/essentials/non_copyable.hpp | 136 +- .../include/essentials/sxprintf.hpp | 484 +++--- .../essentials}/include/essentials/uri.hpp | 110 +- .../{ => essentials/source}/conversion.cpp | 206 +-- .../source}/essentials_version.cpp | 148 +- .../source}/format_settings.cpp | 64 +- .../{ => essentials/source}/sxprintf.cpp | 1256 +++++++------- .../source/{ => essentials/source}/uri.cpp | 272 +-- externals/genesis/CMakeLists.txt | 7 + externals/genesis/changelog.txt | 16 + .../genesis_Anhang_Appendix_20170406.pdf | Bin ...eschaeftliche_Nutzung_Fassung_20170406.pdf | Bin ...haeftliche_Nutzung_Fassung_20170406_en.pdf | Bin ...enschaftliche_Nutzung_Fassung_20170406.pdf | Bin ...chaftliche_Nutzung_Fassung_20170406_en.pdf | Bin .../source/CMakeHelpers/addBoost.cmake | 34 + .../CMakeHelpers/addSeadexOptions.cmake | 30 + .../CMakeHelpers/addSpecificFlags.cmake | 112 ++ .../CMakeHelpers/addYasmineOptions.cmake | 34 + .../source/CMakeHelpers/functions.cmake | 22 + .../functionsAddCompilerFlags.cmake | 15 + .../CMakeHelpers/functionsRapidJSON.cmake | 30 + .../source/CMakeHelpers/setVariables.cmake | 12 + externals/genesis/source/CMakeLists.txt | 14 + .../genesis/source/build/debug_info.props | 18 + externals/genesis/source/build/genesis.props | 31 + .../genesis/source/build/use_boost.props | 30 + .../source/build/use_boost_externals.props | 30 + .../genesis/source/build/use_essentials.props | 18 + .../build/use_essentials_examples.props | 18 + .../genesis/source/build/use_genesis.props | 18 + .../source/build/use_genesis_examples.props | 18 + externals/genesis/source/build/vs2013.props | 16 + .../genesis/source/build/yasmine_clang.props | 26 + .../genesis/source/examples/CMakeLists.txt | 1 + .../html_page_generator/CMakeLists.txt | 35 + .../examples/html_page_generator/city.hpp | 32 + .../examples/html_page_generator/config.cpp | 146 ++ .../examples/html_page_generator/config.hpp | 36 + .../examples/html_page_generator/country.hpp | 35 + .../html_generator_grammar.cpp | 25 + .../html_generator_grammar.hpp | 34 + .../html_page_generator.vcxproj | 266 +++ .../html_page_generator.vcxproj.filters | 48 + .../examples/html_page_generator/main.cpp | 51 + .../recipe_callback_impl.cpp | 186 +++ .../recipe_callback_impl.hpp | 52 + .../templates/city_type.gtpl | 10 + .../templates/countries.gtpl | 47 + .../templates/country_table.gtpl | 14 + .../genesis/source/externals/CMakeLists.txt | 11 + .../externals/essentials/CMakeLists.txt | 7 + .../essentials_Anhang_Appendix_20170406.pdf | Bin 0 -> 144257 bytes ...eschaeftliche_Nutzung_Fassung_20170406.pdf | Bin 0 -> 137055 bytes ...haeftliche_Nutzung_Fassung_20170406_en.pdf | Bin 0 -> 158255 bytes ...enschaftliche_Nutzung_Fassung_20170406.pdf | Bin 0 -> 137900 bytes ...chaftliche_Nutzung_Fassung_20170406_en.pdf | Bin 0 -> 158334 bytes .../source/CMakeHelpers/addBoost.cmake | 34 + .../CMakeHelpers/addSeadexOptions.cmake | 30 + .../CMakeHelpers/addSpecificFlags.cmake | 112 ++ .../CMakeHelpers/addYasmineOptions.cmake | 34 + .../source/CMakeHelpers/functions.cmake | 22 + .../functionsAddCompilerFlags.cmake | 15 + .../CMakeHelpers/functionsRapidJSON.cmake | 30 + .../source/CMakeHelpers/setVariables.cmake | 12 + .../essentials/source/CMakeLists.txt | 16 + .../essentials/source/build/c++03.props | 31 + .../essentials/source/build/debug_info.props | 18 + .../essentials/source/build/essentials.props | 31 + .../essentials/source/build/use_boost.props | 30 + .../source/build/use_boost_as_external.props | 30 + .../source/build/use_boost_externals.props | 30 + .../source/build/use_essentials.props | 32 + .../source/build/use_essentials_base.props | 28 + .../externals/essentials/source/changelog.txt | 38 + .../essentials/source/essentials.sln | 156 ++ .../source/essentials/CMakeLists.txt | 41 + .../source/essentials/essentials.vcxproj | 545 ++++++ .../essentials/essentials.vcxproj.filters | 107 ++ .../essentials/include/essentials/base.hpp | 41 + .../include/essentials/build_number.hpp | 35 + .../essentials/compatibility/chrono.hpp | 59 + .../compatibility/compatibility.hpp | 184 ++ .../essentials_backward_compatibility.hpp | 31 + .../essentials/compatibility/thread.hpp | 63 + .../include/essentials/conversion.hpp | 53 + .../include/essentials/essentials_version.hpp | 41 + .../include/essentials/exception.hpp | 30 + .../include/essentials/exception_template.hpp | 160 ++ .../include/essentials/format_settings.hpp | 45 + .../include/essentials/macro_helpers.hpp | 46 + .../include/essentials/non_copyable.hpp | 68 + .../include/essentials/sxprintf.hpp | 242 +++ .../essentials/include/essentials/uri.hpp | 55 + .../source/essentials/source/conversion.cpp | 103 ++ .../essentials/source/essentials_version.cpp | 74 + .../essentials/source/format_settings.cpp | 32 + .../source/essentials/source/sxprintf.cpp | 628 +++++++ .../source/essentials/source/uri.cpp | 136 ++ externals/genesis/source/genesis.sln | 163 ++ .../genesis/source/genesis}/CMakeLists.txt | 26 +- .../genesis/source/genesis/changelog.txt | 33 + .../genesis/source/genesis}/genesis.vcxproj | 1485 ++++++++--------- .../source/genesis}/genesis.vcxproj.filters | 374 ++--- .../source/genesis}/include/build_number.hpp | 84 +- .../genesis}/include/condition_block.hpp | 124 +- .../genesis}/include/condition_modifier.hpp | 204 +-- .../source/genesis}/include/file_reader.hpp | 78 +- .../source/genesis}/include/file_writer.hpp | 74 +- .../genesis}/include/genesis_exception.hpp | 70 +- .../source/genesis}/include/grammar.hpp | 112 +- .../source/genesis}/include/loop_block.hpp | 108 +- .../source/genesis}/include/messages.hpp | 70 +- .../source/genesis}/include/recipe.hpp | 128 +- .../source/genesis}/include/recipe_block.hpp | 116 +- .../genesis}/include/recipe_callback.hpp | 196 +-- .../source/genesis}/include/recipe_step.hpp | 126 +- .../source/genesis}/include/switch_block.hpp | 150 +- .../genesis}/include/template_block.hpp | 206 +-- .../source/genesis}/include/text_step.hpp | 108 +- .../source/genesis}/include/variable_step.hpp | 108 +- .../source/genesis}/include/version.hpp | 96 +- .../genesis}/source/condition_block.cpp | 148 +- .../genesis}/source/condition_modifier.cpp | 104 +- .../source/genesis}/source/file_reader.cpp | 84 +- .../source/genesis}/source/file_writer.cpp | 98 +- .../source/genesis}/source/grammar.cpp | 98 +- .../source/genesis}/source/loop_block.cpp | 108 +- .../source/genesis}/source/messages.cpp | 54 +- .../genesis/source/genesis}/source/recipe.cpp | 122 +- .../source/genesis}/source/recipe_block.cpp | 106 +- .../source/genesis}/source/switch_block.cpp | 176 +- .../source/genesis}/source/template_block.cpp | 1032 ++++++------ .../source/genesis}/source/text_step.cpp | 98 +- .../source/genesis}/source/variable_step.cpp | 92 +- .../source/genesis}/source/version.cpp | 162 +- externals/hermes/CMakeLists.txt | 7 + .../hermes/source/CMakeHelpers/addBoost.cmake | 34 + .../CMakeHelpers/addSeadexOptions.cmake | 30 + .../CMakeHelpers/addSpecificFlags.cmake | 112 ++ .../CMakeHelpers/addYasmineOptions.cmake | 34 + .../source/CMakeHelpers/functions.cmake | 22 + .../functionsAddCompilerFlags.cmake | 15 + .../CMakeHelpers/functionsRapidJSON.cmake | 30 + .../source/CMakeHelpers/setVariables.cmake | 12 + externals/hermes/source/CMakeLists.txt | 13 + externals/hermes/source/build/c++03.props | 31 + .../hermes/source/build/debug_info.props | 18 + externals/hermes/source/build/hermes.props | 32 + .../source/build/use_boost_externals.props | 30 + .../hermes/source/build/use_essentials.props | 21 + externals/hermes/source/changelog.txt | 29 + .../hermes/source/externals/CMakeLists.txt | 11 + .../externals/essentials/CMakeLists.txt | 7 + .../essentials_Anhang_Appendix_20170406.pdf | Bin 0 -> 144257 bytes ...eschaeftliche_Nutzung_Fassung_20170406.pdf | Bin 0 -> 137055 bytes ...haeftliche_Nutzung_Fassung_20170406_en.pdf | Bin 0 -> 158255 bytes ...enschaftliche_Nutzung_Fassung_20170406.pdf | Bin 0 -> 137900 bytes ...chaftliche_Nutzung_Fassung_20170406_en.pdf | Bin 0 -> 158334 bytes .../source/CMakeHelpers/addBoost.cmake | 34 + .../CMakeHelpers/addSeadexOptions.cmake | 30 + .../CMakeHelpers/addSpecificFlags.cmake | 112 ++ .../CMakeHelpers/addYasmineOptions.cmake | 34 + .../source/CMakeHelpers/functions.cmake | 22 + .../functionsAddCompilerFlags.cmake | 15 + .../CMakeHelpers/functionsRapidJSON.cmake | 30 + .../source/CMakeHelpers/setVariables.cmake | 12 + .../essentials/source/CMakeLists.txt | 16 + .../essentials/source/build/c++03.props | 31 + .../essentials/source/build/debug_info.props | 18 + .../essentials/source/build/essentials.props | 31 + .../essentials/source/build/use_boost.props | 30 + .../source/build/use_boost_as_external.props | 30 + .../source/build/use_boost_externals.props | 30 + .../source/build/use_essentials.props | 32 + .../source/build/use_essentials_base.props | 28 + .../externals/essentials/source/changelog.txt | 38 + .../essentials/source/essentials.sln | 156 ++ .../source/essentials/CMakeLists.txt | 41 + .../source/essentials/essentials.vcxproj | 545 ++++++ .../essentials/essentials.vcxproj.filters | 107 ++ .../essentials/include/essentials/base.hpp | 41 + .../include/essentials/build_number.hpp | 35 + .../essentials/compatibility/chrono.hpp | 59 + .../compatibility/compatibility.hpp | 184 ++ .../essentials_backward_compatibility.hpp | 31 + .../essentials/compatibility/thread.hpp | 63 + .../include/essentials/conversion.hpp | 53 + .../include/essentials/essentials_version.hpp | 41 + .../include/essentials/exception.hpp | 30 + .../include/essentials/exception_template.hpp | 160 ++ .../include/essentials/format_settings.hpp | 45 + .../include/essentials/macro_helpers.hpp | 46 + .../include/essentials/non_copyable.hpp | 68 + .../include/essentials/sxprintf.hpp | 242 +++ .../essentials/include/essentials/uri.hpp | 55 + .../source/essentials/source/conversion.cpp | 103 ++ .../essentials/source/essentials_version.cpp | 74 + .../essentials/source/format_settings.cpp | 32 + .../source/essentials/source/sxprintf.cpp | 628 +++++++ .../source/essentials/source/uri.cpp | 136 ++ externals/hermes/source/hermes.sln | 109 ++ externals/hermes/source/hermes/CMakeLists.txt | 57 + externals/hermes/source/hermes/hermes.vcxproj | 566 +++++++ .../source/hermes/hermes.vcxproj.filters | 146 ++ .../hermes}/include/hermes/build_number.hpp | 70 +- .../hermes}/include/hermes/color.hpp | 190 +-- .../hermes}/include/hermes/color_mapping.hpp | 124 +- .../hermes}/include/hermes/cout_logger.hpp | 126 +- .../hermes}/include/hermes/file_logger.hpp | 168 +- .../hermes}/include/hermes/file_system.hpp | 90 +- .../hermes}/include/hermes/globals.hpp | 52 +- .../hermes/hermes_backward_compatibility.hpp | 58 +- .../hermes}/include/hermes/hermes_version.hpp | 82 +- .../hermes}/include/hermes/log.hpp | 304 ++-- .../hermes}/include/hermes/log_and_throw.hpp | 248 +-- .../include/hermes/log_and_throw_helper.hpp | 420 ++--- .../hermes}/include/hermes/log_callback.hpp | 118 +- .../hermes}/include/hermes/log_helper.hpp | 684 ++++---- .../hermes}/include/hermes/log_level.hpp | 236 +-- .../include/hermes/log_manager_template.hpp | 1188 ++++++------- .../hermes}/include/hermes/log_message.hpp | 132 +- .../hermes}/include/hermes/logger.hpp | 128 +- .../hermes}/include/hermes/logger_fwd.hpp | 88 +- .../include/hermes/std_timestamp_policy.hpp | 94 +- .../hermes}/include/hermes/waiter.hpp | 120 +- .../{ => hermes/source}/color_mapping.cpp | 156 +- .../{ => hermes/source}/cout_logger.cpp | 192 +-- .../{ => hermes/source}/file_logger.cpp | 372 ++--- .../{ => hermes/source}/file_system.cpp | 140 +- .../source/{ => hermes/source}/globals.cpp | 42 +- .../{ => hermes/source}/hermes_version.cpp | 152 +- .../source}/log_and_throw_helper.cpp | 100 +- .../source/{ => hermes/source}/log_helper.cpp | 94 +- .../source/{ => hermes/source}/log_level.cpp | 252 +-- .../{ => hermes/source}/log_message.cpp | 116 +- .../source}/std_timestamp_policy.cpp | 120 +- .../source/{ => hermes/source}/waiter.cpp | 118 +- genesis/changelog.txt | 22 - libyasmine/CMakeLists.txt | 18 +- libyasmine/changelog.txt | 15 +- libyasmine/include/assembly_common.hpp | 113 +- libyasmine/include/assembly_cpp11.hpp | 30 +- libyasmine/include/async_state_machine.hpp | 21 +- libyasmine/include/event_handle.hpp | 13 +- libyasmine/include/event_template.hpp | 2 +- libyasmine/include/simple_state_base.hpp | 4 +- libyasmine/include/state_machine_base.hpp | 3 - libyasmine/include_impl/build_number.hpp | 2 +- libyasmine/libyasmine.vcxproj | 53 - libyasmine/libyasmine.vcxproj.filters | 180 -- libyasmine/source/event_handle.cpp | 10 +- libyasmine/source/version.cpp | 3 +- libygen/CMakeLists.txt | 22 +- libygen/changelog.txt | 10 +- libygen/include/libygen_build_number.hpp | 2 +- libygen/source/libygen_version.cpp | 4 +- libygen/source/recipe_callback_impl.cpp | 14 +- version.txt | 10 + yasmine.sln | 193 ++- yasmine_model/CMakeLists.txt | 8 +- yasmine_model/changelog.txt | 24 + yasmine_model/include/build_number.hpp | 2 +- yasmine_model/include/choice_model_fwd.hpp | 4 +- yasmine_model/include/choice_model_impl.hpp | 1 + .../include/composite_state_model.hpp | 5 + .../include/composite_state_model_impl.hpp | 40 + yasmine_model/include/consts.hpp | 1 + yasmine_model/include/deep_history_model.hpp | 1 + .../include/deep_history_model_fwd.hpp | 4 +- .../include/deep_history_model_impl.hpp | 1 + yasmine_model/include/delete_visitor.hpp | 80 + yasmine_model/include/entry_point_model.hpp | 1 + .../include/entry_point_model_fwd.hpp | 4 +- .../include/entry_point_model_impl.hpp | 1 + yasmine_model/include/event_model.hpp | 32 +- yasmine_model/include/event_model_id.hpp | 11 +- .../include/exit_point_model_fwd.hpp | 4 +- .../include/exit_point_model_impl.hpp | 1 + yasmine_model/include/externals_fwd.hpp | 37 + .../include/final_state_model_fwd.hpp | 4 +- .../include/final_state_model_impl.hpp | 3 +- yasmine_model/include/fork_model_fwd.hpp | 4 +- yasmine_model/include/fork_model_impl.hpp | 1 + .../include/initial_pseudostate_model_fwd.hpp | 4 +- .../initial_pseudostate_model_impl.hpp | 1 + yasmine_model/include/join_model_fwd.hpp | 4 +- yasmine_model/include/join_model_impl.hpp | 5 +- yasmine_model/include/json_reader.hpp | 32 +- yasmine_model/include/json_writer.hpp | 30 +- yasmine_model/include/junction_model_fwd.hpp | 4 +- yasmine_model/include/junction_model_impl.hpp | 1 + yasmine_model/include/model.hpp | 15 +- .../include/pseudostate_model_fwd.hpp | 5 +- .../include/pseudostate_model_impl.hpp | 5 + yasmine_model/include/rapidjson_document.hpp | 3 +- yasmine_model/include/region_model.hpp | 6 + yasmine_model/include/region_model_impl.hpp | 36 +- .../include/shallow_history_model_fwd.hpp | 4 +- .../include/shallow_history_model_impl.hpp | 1 + yasmine_model/include/simple_state_model.hpp | 1 + .../include/simple_state_model_fwd.hpp | 4 +- .../include/simple_state_model_impl.hpp | 38 +- .../include/state_machine_element_model.hpp | 14 +- .../state_machine_element_model_impl.hpp | 20 +- .../state_machine_external_element.hpp | 54 + yasmine_model/include/state_machine_model.hpp | 61 +- yasmine_model/include/state_model.hpp | 6 + yasmine_model/include/state_model_impl.hpp | 28 +- .../terminate_pseudostate_model_fwd.hpp | 4 +- .../terminate_pseudostate_model_impl.hpp | 1 + yasmine_model/include/transition_model.hpp | 9 + .../include/transition_model_impl.hpp | 59 +- yasmine_model/source/choice_model_impl.cpp | 7 + .../source/composite_state_model_impl.cpp | 140 +- yasmine_model/source/consts.cpp | 1 + .../source/deep_history_model_impl.cpp | 7 + yasmine_model/source/delete_visitor.cpp | 219 +++ .../source/entry_point_model_impl.cpp | 7 + yasmine_model/source/event_model.cpp | 72 +- yasmine_model/source/event_model_id.cpp | 26 - .../source/exit_point_model_impl.cpp | 7 + .../source/final_state_model_impl.cpp | 6 + yasmine_model/source/fork_model_impl.cpp | 7 + .../source/initial_pseudostate_model_impl.cpp | 7 + yasmine_model/source/join_model_impl.cpp | 7 + yasmine_model/source/json_reader.cpp | 143 +- yasmine_model/source/json_writer.cpp | 131 +- yasmine_model/source/junction_model_impl.cpp | 7 + yasmine_model/source/model_version.cpp | 4 +- .../source/pseudostate_model_impl.cpp | 10 + yasmine_model/source/region_model_impl.cpp | 113 +- .../source/shallow_history_model_impl.cpp | 7 + .../source/simple_state_model_impl.cpp | 49 +- .../state_machine_element_model_impl.cpp | 8 +- .../source/state_machine_external_element.cpp | 61 + yasmine_model/source/state_machine_model.cpp | 111 +- yasmine_model/source/state_model_impl.cpp | 54 + .../terminate_pseudostate_model_impl.cpp | 7 + .../source/transition_model_impl.cpp | 81 + yasmine_model/yasmine_model.vcxproj | 27 +- yasmine_model/yasmine_model.vcxproj.filters | 91 +- ygen/CMakeLists.txt | 4 +- ygen/changelog.txt | 15 +- ygen/include/ygen_build_number.hpp | 2 +- ygen/source/ygen_version.cpp | 2 +- ygen/ygen.vcxproj | 5 +- 405 files changed, 22654 insertions(+), 9480 deletions(-) create mode 100644 CMakeHelpers/addSeadexOptions.cmake create mode 100644 externals/CMakeLists.txt create mode 100644 externals/essentials/CMakeLists.txt create mode 100644 externals/essentials/source/CMakeHelpers/addBoost.cmake create mode 100644 externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake create mode 100644 externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake create mode 100644 externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake create mode 100644 externals/essentials/source/CMakeHelpers/functions.cmake create mode 100644 externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake create mode 100644 externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake create mode 100644 externals/essentials/source/CMakeHelpers/setVariables.cmake create mode 100644 externals/essentials/source/CMakeLists.txt create mode 100644 externals/essentials/source/build/c++03.props create mode 100644 externals/essentials/source/build/debug_info.props create mode 100644 externals/essentials/source/build/essentials.props create mode 100644 externals/essentials/source/build/use_boost.props create mode 100644 externals/essentials/source/build/use_boost_as_external.props create mode 100644 externals/essentials/source/build/use_boost_externals.props create mode 100644 externals/essentials/source/build/use_essentials.props create mode 100644 externals/essentials/source/build/use_essentials_base.props create mode 100644 externals/essentials/source/changelog.txt create mode 100644 externals/essentials/source/essentials.sln create mode 100644 externals/essentials/source/essentials/CMakeLists.txt create mode 100644 externals/essentials/source/essentials/essentials.vcxproj create mode 100644 externals/essentials/source/essentials/essentials.vcxproj.filters rename externals/essentials/{ => source/essentials}/include/essentials/base.hpp (97%) rename externals/essentials/{ => source/essentials}/include/essentials/build_number.hpp (93%) rename externals/essentials/{ => source/essentials}/include/essentials/compatibility/chrono.hpp (96%) rename externals/essentials/{ => source/essentials}/include/essentials/compatibility/compatibility.hpp (95%) rename externals/essentials/{ => source/essentials}/include/essentials/compatibility/essentials_backward_compatibility.hpp (97%) rename externals/essentials/{ => source/essentials}/include/essentials/compatibility/thread.hpp (96%) rename externals/essentials/{ => source/essentials}/include/essentials/conversion.hpp (97%) rename externals/essentials/{ => source/essentials}/include/essentials/essentials_version.hpp (96%) rename externals/essentials/{ => source/essentials}/include/essentials/exception.hpp (97%) rename externals/essentials/{ => source/essentials}/include/essentials/exception_template.hpp (97%) rename externals/essentials/{ => source/essentials}/include/essentials/format_settings.hpp (96%) rename externals/essentials/{ => source/essentials}/include/essentials/macro_helpers.hpp (97%) rename externals/essentials/{ => source/essentials}/include/essentials/non_copyable.hpp (96%) rename externals/essentials/{ => source/essentials}/include/essentials/sxprintf.hpp (97%) rename externals/essentials/{ => source/essentials}/include/essentials/uri.hpp (96%) rename externals/essentials/source/{ => essentials/source}/conversion.cpp (95%) rename externals/essentials/source/{ => essentials/source}/essentials_version.cpp (93%) rename externals/essentials/source/{ => essentials/source}/format_settings.cpp (97%) rename externals/essentials/source/{ => essentials/source}/sxprintf.cpp (96%) rename externals/essentials/source/{ => essentials/source}/uri.cpp (95%) create mode 100644 externals/genesis/CMakeLists.txt create mode 100644 externals/genesis/changelog.txt rename {genesis => externals/genesis}/license/genesis_Anhang_Appendix_20170406.pdf (100%) rename {genesis => externals/genesis}/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf (100%) rename {genesis => externals/genesis}/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf (100%) rename {genesis => externals/genesis}/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406.pdf (100%) rename {genesis => externals/genesis}/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf (100%) create mode 100644 externals/genesis/source/CMakeHelpers/addBoost.cmake create mode 100644 externals/genesis/source/CMakeHelpers/addSeadexOptions.cmake create mode 100644 externals/genesis/source/CMakeHelpers/addSpecificFlags.cmake create mode 100644 externals/genesis/source/CMakeHelpers/addYasmineOptions.cmake create mode 100644 externals/genesis/source/CMakeHelpers/functions.cmake create mode 100644 externals/genesis/source/CMakeHelpers/functionsAddCompilerFlags.cmake create mode 100644 externals/genesis/source/CMakeHelpers/functionsRapidJSON.cmake create mode 100644 externals/genesis/source/CMakeHelpers/setVariables.cmake create mode 100644 externals/genesis/source/CMakeLists.txt create mode 100644 externals/genesis/source/build/debug_info.props create mode 100644 externals/genesis/source/build/genesis.props create mode 100644 externals/genesis/source/build/use_boost.props create mode 100644 externals/genesis/source/build/use_boost_externals.props create mode 100644 externals/genesis/source/build/use_essentials.props create mode 100644 externals/genesis/source/build/use_essentials_examples.props create mode 100644 externals/genesis/source/build/use_genesis.props create mode 100644 externals/genesis/source/build/use_genesis_examples.props create mode 100644 externals/genesis/source/build/vs2013.props create mode 100644 externals/genesis/source/build/yasmine_clang.props create mode 100644 externals/genesis/source/examples/CMakeLists.txt create mode 100644 externals/genesis/source/examples/html_page_generator/CMakeLists.txt create mode 100644 externals/genesis/source/examples/html_page_generator/city.hpp create mode 100644 externals/genesis/source/examples/html_page_generator/config.cpp create mode 100644 externals/genesis/source/examples/html_page_generator/config.hpp create mode 100644 externals/genesis/source/examples/html_page_generator/country.hpp create mode 100644 externals/genesis/source/examples/html_page_generator/html_generator_grammar.cpp create mode 100644 externals/genesis/source/examples/html_page_generator/html_generator_grammar.hpp create mode 100644 externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj create mode 100644 externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj.filters create mode 100644 externals/genesis/source/examples/html_page_generator/main.cpp create mode 100644 externals/genesis/source/examples/html_page_generator/recipe_callback_impl.cpp create mode 100644 externals/genesis/source/examples/html_page_generator/recipe_callback_impl.hpp create mode 100644 externals/genesis/source/examples/html_page_generator/templates/city_type.gtpl create mode 100644 externals/genesis/source/examples/html_page_generator/templates/countries.gtpl create mode 100644 externals/genesis/source/examples/html_page_generator/templates/country_table.gtpl create mode 100644 externals/genesis/source/externals/CMakeLists.txt create mode 100644 externals/genesis/source/externals/essentials/CMakeLists.txt create mode 100644 externals/genesis/source/externals/essentials/license/essentials_Anhang_Appendix_20170406.pdf create mode 100644 externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf create mode 100644 externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf create mode 100644 externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406.pdf create mode 100644 externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/addBoost.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/functions.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeHelpers/setVariables.cmake create mode 100644 externals/genesis/source/externals/essentials/source/CMakeLists.txt create mode 100644 externals/genesis/source/externals/essentials/source/build/c++03.props create mode 100644 externals/genesis/source/externals/essentials/source/build/debug_info.props create mode 100644 externals/genesis/source/externals/essentials/source/build/essentials.props create mode 100644 externals/genesis/source/externals/essentials/source/build/use_boost.props create mode 100644 externals/genesis/source/externals/essentials/source/build/use_boost_as_external.props create mode 100644 externals/genesis/source/externals/essentials/source/build/use_boost_externals.props create mode 100644 externals/genesis/source/externals/essentials/source/build/use_essentials.props create mode 100644 externals/genesis/source/externals/essentials/source/build/use_essentials_base.props create mode 100644 externals/genesis/source/externals/essentials/source/changelog.txt create mode 100644 externals/genesis/source/externals/essentials/source/essentials.sln create mode 100644 externals/genesis/source/externals/essentials/source/essentials/CMakeLists.txt create mode 100644 externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj create mode 100644 externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj.filters create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/base.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/build_number.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/conversion.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/include/essentials/uri.hpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/source/conversion.cpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/source/essentials_version.cpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/source/format_settings.cpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/source/sxprintf.cpp create mode 100644 externals/genesis/source/externals/essentials/source/essentials/source/uri.cpp create mode 100644 externals/genesis/source/genesis.sln rename {genesis => externals/genesis/source/genesis}/CMakeLists.txt (56%) create mode 100644 externals/genesis/source/genesis/changelog.txt rename {genesis => externals/genesis/source/genesis}/genesis.vcxproj (93%) rename {genesis => externals/genesis/source/genesis}/genesis.vcxproj.filters (64%) rename {genesis => externals/genesis/source/genesis}/include/build_number.hpp (92%) rename {genesis => externals/genesis/source/genesis}/include/condition_block.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/condition_modifier.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/file_reader.hpp (97%) rename {genesis => externals/genesis/source/genesis}/include/file_writer.hpp (97%) rename {genesis => externals/genesis/source/genesis}/include/genesis_exception.hpp (97%) rename {genesis => externals/genesis/source/genesis}/include/grammar.hpp (97%) rename {genesis => externals/genesis/source/genesis}/include/loop_block.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/messages.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/recipe.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/recipe_block.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/recipe_callback.hpp (97%) rename {genesis => externals/genesis/source/genesis}/include/recipe_step.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/switch_block.hpp (97%) rename {genesis => externals/genesis/source/genesis}/include/template_block.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/text_step.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/variable_step.hpp (96%) rename {genesis => externals/genesis/source/genesis}/include/version.hpp (96%) rename {genesis => externals/genesis/source/genesis}/source/condition_block.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/condition_modifier.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/file_reader.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/file_writer.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/grammar.cpp (97%) rename {genesis => externals/genesis/source/genesis}/source/loop_block.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/messages.cpp (97%) rename {genesis => externals/genesis/source/genesis}/source/recipe.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/recipe_block.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/switch_block.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/template_block.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/text_step.cpp (95%) rename {genesis => externals/genesis/source/genesis}/source/variable_step.cpp (96%) rename {genesis => externals/genesis/source/genesis}/source/version.cpp (92%) create mode 100644 externals/hermes/CMakeLists.txt create mode 100644 externals/hermes/source/CMakeHelpers/addBoost.cmake create mode 100644 externals/hermes/source/CMakeHelpers/addSeadexOptions.cmake create mode 100644 externals/hermes/source/CMakeHelpers/addSpecificFlags.cmake create mode 100644 externals/hermes/source/CMakeHelpers/addYasmineOptions.cmake create mode 100644 externals/hermes/source/CMakeHelpers/functions.cmake create mode 100644 externals/hermes/source/CMakeHelpers/functionsAddCompilerFlags.cmake create mode 100644 externals/hermes/source/CMakeHelpers/functionsRapidJSON.cmake create mode 100644 externals/hermes/source/CMakeHelpers/setVariables.cmake create mode 100644 externals/hermes/source/CMakeLists.txt create mode 100644 externals/hermes/source/build/c++03.props create mode 100644 externals/hermes/source/build/debug_info.props create mode 100644 externals/hermes/source/build/hermes.props create mode 100644 externals/hermes/source/build/use_boost_externals.props create mode 100644 externals/hermes/source/build/use_essentials.props create mode 100644 externals/hermes/source/changelog.txt create mode 100644 externals/hermes/source/externals/CMakeLists.txt create mode 100644 externals/hermes/source/externals/essentials/CMakeLists.txt create mode 100644 externals/hermes/source/externals/essentials/license/essentials_Anhang_Appendix_20170406.pdf create mode 100644 externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf create mode 100644 externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf create mode 100644 externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406.pdf create mode 100644 externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/addBoost.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/functions.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeHelpers/setVariables.cmake create mode 100644 externals/hermes/source/externals/essentials/source/CMakeLists.txt create mode 100644 externals/hermes/source/externals/essentials/source/build/c++03.props create mode 100644 externals/hermes/source/externals/essentials/source/build/debug_info.props create mode 100644 externals/hermes/source/externals/essentials/source/build/essentials.props create mode 100644 externals/hermes/source/externals/essentials/source/build/use_boost.props create mode 100644 externals/hermes/source/externals/essentials/source/build/use_boost_as_external.props create mode 100644 externals/hermes/source/externals/essentials/source/build/use_boost_externals.props create mode 100644 externals/hermes/source/externals/essentials/source/build/use_essentials.props create mode 100644 externals/hermes/source/externals/essentials/source/build/use_essentials_base.props create mode 100644 externals/hermes/source/externals/essentials/source/changelog.txt create mode 100644 externals/hermes/source/externals/essentials/source/essentials.sln create mode 100644 externals/hermes/source/externals/essentials/source/essentials/CMakeLists.txt create mode 100644 externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj create mode 100644 externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj.filters create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/base.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/build_number.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/conversion.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/include/essentials/uri.hpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/source/conversion.cpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/source/essentials_version.cpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/source/format_settings.cpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/source/sxprintf.cpp create mode 100644 externals/hermes/source/externals/essentials/source/essentials/source/uri.cpp create mode 100644 externals/hermes/source/hermes.sln create mode 100644 externals/hermes/source/hermes/CMakeLists.txt create mode 100644 externals/hermes/source/hermes/hermes.vcxproj create mode 100644 externals/hermes/source/hermes/hermes.vcxproj.filters rename externals/hermes/{ => source/hermes}/include/hermes/build_number.hpp (93%) rename externals/hermes/{ => source/hermes}/include/hermes/color.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/color_mapping.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/cout_logger.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/file_logger.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/file_system.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/globals.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/hermes_backward_compatibility.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/hermes_version.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/log.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/log_and_throw.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/log_and_throw_helper.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/log_callback.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/log_helper.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/log_level.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/log_manager_template.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/log_message.hpp (97%) rename externals/hermes/{ => source/hermes}/include/hermes/logger.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/logger_fwd.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/std_timestamp_policy.hpp (96%) rename externals/hermes/{ => source/hermes}/include/hermes/waiter.hpp (96%) rename externals/hermes/source/{ => hermes/source}/color_mapping.cpp (96%) rename externals/hermes/source/{ => hermes/source}/cout_logger.cpp (96%) rename externals/hermes/source/{ => hermes/source}/file_logger.cpp (96%) rename externals/hermes/source/{ => hermes/source}/file_system.cpp (96%) rename externals/hermes/source/{ => hermes/source}/globals.cpp (97%) rename externals/hermes/source/{ => hermes/source}/hermes_version.cpp (91%) rename externals/hermes/source/{ => hermes/source}/log_and_throw_helper.cpp (97%) rename externals/hermes/source/{ => hermes/source}/log_helper.cpp (97%) rename externals/hermes/source/{ => hermes/source}/log_level.cpp (95%) rename externals/hermes/source/{ => hermes/source}/log_message.cpp (96%) rename externals/hermes/source/{ => hermes/source}/std_timestamp_policy.cpp (97%) rename externals/hermes/source/{ => hermes/source}/waiter.cpp (96%) delete mode 100644 genesis/changelog.txt create mode 100644 yasmine_model/include/delete_visitor.hpp create mode 100644 yasmine_model/include/externals_fwd.hpp create mode 100644 yasmine_model/include/state_machine_external_element.hpp create mode 100644 yasmine_model/source/delete_visitor.cpp create mode 100644 yasmine_model/source/state_machine_external_element.cpp diff --git a/CMakeHelpers/addBoost.cmake b/CMakeHelpers/addBoost.cmake index 616da4a..1d9085a 100644 --- a/CMakeHelpers/addBoost.cmake +++ b/CMakeHelpers/addBoost.cmake @@ -22,7 +22,7 @@ elseif(SX_BOOST_LIB_INCLUDE) else() message("SX_BOOST_LIB_INCLUDE is not set by user. Searching for boost libraries.") set(Boost_USE_MULTITHREADED ON) - find_package(Boost COMPONENTS date_time filesystem system program_options chrono thread random) + find_package(Boost COMPONENTS date_time filesystem system program_options chrono thread random unit_test_framework) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) message("Boost found.") diff --git a/CMakeHelpers/addSeadexOptions.cmake b/CMakeHelpers/addSeadexOptions.cmake new file mode 100644 index 0000000..48bd9c6 --- /dev/null +++ b/CMakeHelpers/addSeadexOptions.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +# Seadex preprocessor definitions + + +option("SX_NO_LOGGING" "Use when you want to use no logging at all (no logging code is created).") +if( "${SX_NO_LOGGING}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_LOGGING\"") + message(STATUS "No logging used.") +else() + message(STATUS "Logger is used.") +endif() + + +option("SX_NO_STD_MAKE_UNIQUE" "When the standard make_unique is not available (e.g. no C++14 support), you have to define this preprocessor definition. A yasmine drop-in replacement template will be used instead then.") +if( "${SX_NO_STD_MAKE_UNIQUE}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_STD_MAKE_UNIQUE\"") + message(STATUS "SX_NO_STD_MAKE_UNIQUE is defined.") +endif() + + +option("SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG" "Sets to use a workaround for bug in GCC with expansion of template parameter pack that appears in a lambda-expression (bug reported for GCC 4.8.4)") +if( "${SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG}" ) + set(extra_flags "${extra_flags} -D \"SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG\"") + message(STATUS "SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG is defined.") +endif() \ No newline at end of file diff --git a/CMakeHelpers/addYasmineOptions.cmake b/CMakeHelpers/addYasmineOptions.cmake index 94749d0..2c1b7ea 100644 --- a/CMakeHelpers/addYasmineOptions.cmake +++ b/CMakeHelpers/addYasmineOptions.cmake @@ -5,6 +5,8 @@ if(POLICY CMP0054) endif() +include("${CMAKE_CURRENT_LIST_DIR}/addSeadexOptions.cmake") + # yasmine's preprocessor definitions @@ -18,21 +20,6 @@ else() endif() -option("SX_NO_LOGGING" "Use when you want to use no logging at all (no logging code is created).") -if( "${SX_NO_LOGGING}" ) - set(extra_flags "${extra_flags} -D \"SX_NO_LOGGING\"") - message(STATUS "No logging used.") -else() - message(STATUS "Logger is used.") -endif() - - -option("SX_NO_STD_MAKE_UNIQUE" "When the standard make_unique is not available (e.g. no C++14 support), you have to define this preprocessor definition. A yasmine drop-in replacement template will be used instead then.") -if( "${SX_NO_STD_MAKE_UNIQUE}" ) - set(extra_flags "${extra_flags} -D \"SX_NO_STD_MAKE_UNIQUE\"") - message(STATUS "SX_NO_STD_MAKE_UNIQUE is defined.") -endif() - option("Y_LEAN_AND_MEAN" "If you compile the library with Y_LEAN_AND_MEAN being defined or if you define the macro locally before including yasmine.hpp, all the state pseudostates and the asynchronous simple state (with the asynchronous behaviour) are excluded (i.e. those headers are not included). This can reduce compile time.") if( "${Y_LEAN_AND_MEAN}" ) set(extra_flags "${extra_flags} -D \"Y_LEAN_AND_MEAN\"") @@ -45,9 +32,3 @@ if( "${Y_PROFILER}" ) message(STATUS "Y_PROFILER is defined.") endif() -option("SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG" "Sets to use a workaround for bug in GCC with expansion of template parameter pack that appears in a lambda-expression (bug reported for GCC 4.8.4)") -if( "${SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG}" ) - set(extra_flags "${extra_flags} -D \"SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG\"") - message(STATUS "SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG is defined.") -endif() - diff --git a/CMakeLists.txt b/CMakeLists.txt index ff9ec7d..0a1326f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,10 +18,10 @@ include(./CMakeHelpers/functions.cmake) include(./CMakeHelpers/functionsRapidJSON.cmake) include(./CMakeHelpers/functionsAddCompilerFlags.cmake) +add_subdirectory(externals) add_subdirectory(libyasmine) add_subdirectory(yasmine_model) -add_subdirectory(genesis) add_subdirectory(libygen) add_subdirectory(ygen) diff --git a/build/rapidjson.props b/build/rapidjson.props index c4a78aa..48f47ca 100644 --- a/build/rapidjson.props +++ b/build/rapidjson.props @@ -2,7 +2,7 @@ - ..\..\..\..\..\3rd party\rapidjson\Content\rapidjson-1.0.2\rapidjson + ..\..\..\..\3rd party\libs\rapidjson\Content\rapidjson-1.1.0\rapidjson diff --git a/build/use_boost.props b/build/use_boost.props index 7ad4ecc..986fba3 100644 --- a/build/use_boost.props +++ b/build/use_boost.props @@ -2,8 +2,8 @@ - ..\..\..\..\..\3rd party\boost\Content\boost_1_65_1 - ..\..\..\..\..\3rd party\boost\Content\boost_1_65_1\stage\$(PlatformToolsetVersion)\$(Platform)\lib + ..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib diff --git a/build/use_essentials.props b/build/use_essentials.props index b08106d..17209f9 100644 --- a/build/use_essentials.props +++ b/build/use_essentials.props @@ -6,12 +6,12 @@ None - ..\externals\essentials\include;%(AdditionalIncludeDirectories) + ..\externals\essentials\source\essentials\include;%(AdditionalIncludeDirectories) $(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) - %(AdditionalDependencies) + essentials.lib;%(AdditionalDependencies) diff --git a/build/use_essentials_examples.props b/build/use_essentials_examples.props index 2c2df7b..44d6785 100644 --- a/build/use_essentials_examples.props +++ b/build/use_essentials_examples.props @@ -6,12 +6,12 @@ None - ..\..\externals\essentials\include;%(AdditionalIncludeDirectories) + ..\..\externals\essentials\source\essentials\include;%(AdditionalIncludeDirectories) $(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) - %(AdditionalDependencies) + essentials.lib;%(AdditionalDependencies) diff --git a/build/use_genesis.props b/build/use_genesis.props index bc3a1f8..03d1b1e 100644 --- a/build/use_genesis.props +++ b/build/use_genesis.props @@ -5,7 +5,7 @@ - ..\genesis\include;%(AdditionalIncludeDirectories) + ..\externals\genesis\source\genesis\include;%(AdditionalIncludeDirectories) diff --git a/build/use_hermes.props b/build/use_hermes.props index 08a894d..3a40d3b 100644 --- a/build/use_hermes.props +++ b/build/use_hermes.props @@ -5,9 +5,12 @@ - ..\externals\hermes\include;%(AdditionalIncludeDirectories) + ..\externals\hermes\source\hermes\include;%(AdditionalIncludeDirectories) + + hermes.lib;%(AdditionalDependencies) + \ No newline at end of file diff --git a/build/use_hermes_examples.props b/build/use_hermes_examples.props index 13c24de..cc1cc24 100644 --- a/build/use_hermes_examples.props +++ b/build/use_hermes_examples.props @@ -8,8 +8,11 @@ - ..\..\externals\hermes\include;%(AdditionalIncludeDirectories) + ..\..\externals\hermes\source\hermes\include;%(AdditionalIncludeDirectories) + + hermes.lib;%(AdditionalDependencies) + \ No newline at end of file diff --git a/examples/classic_farmroad/CMakeLists.txt b/examples/classic_farmroad/CMakeLists.txt index d9aa330..97535db 100644 --- a/examples/classic_farmroad/CMakeLists.txt +++ b/examples/classic_farmroad/CMakeLists.txt @@ -6,7 +6,7 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./*.hpp" "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/essentials/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") +set(HEADER_FILES "./*.hpp") file(GLOB classic_farmroad_SRC "./*.cpp" ${HEADER_FILES}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +19,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(classic_farmroad ${classic_farmroad_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/examples/event_collector_example/CMakeLists.txt b/examples/event_collector_example/CMakeLists.txt index 7f7ca09..a7ed99b 100644 --- a/examples/event_collector_example/CMakeLists.txt +++ b/examples/event_collector_example/CMakeLists.txt @@ -6,8 +6,7 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./*.hpp" "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") -file(GLOB event_collector_example_SRC "./*.cpp" ${HEADER_FILES}) +file(GLOB event_collector_example_SRC "./*.cpp" "./*.hpp") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +18,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(event_collector_example ${event_collector_example_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/examples/event_collector_example/event_collector_example.vcxproj b/examples/event_collector_example/event_collector_example.vcxproj index 4b4a2ca..f89a2f1 100644 --- a/examples/event_collector_example/event_collector_example.vcxproj +++ b/examples/event_collector_example/event_collector_example.vcxproj @@ -742,6 +742,7 @@ true true true + MachineX64 diff --git a/examples/event_collector_example/events.hpp b/examples/event_collector_example/events.hpp index acc0414..02a3ab4 100644 --- a/examples/event_collector_example/events.hpp +++ b/examples/event_collector_example/events.hpp @@ -17,11 +17,11 @@ #if defined( SX_CPP03_BOOST ) || ( defined(_MSC_VER) && _MSC_VER <=1800 ) - #define EVENT_1 1 - #define EVENT_2 2 - #define EVENT_3 3 - #define EVENT_4 4 -#else + #define EVENT_1 1 + #define EVENT_2 2 + #define EVENT_3 3 + #define EVENT_4 4 +#else constexpr sxy::event_id EVENT_1 = 1; constexpr sxy::event_id EVENT_2 = 2; constexpr sxy::event_id EVENT_3 = 3; @@ -31,16 +31,16 @@ namespace examples { - + #if defined( SX_CPP03_BOOST ) || ( defined(_MSC_VER) && _MSC_VER <=1800 ) Y_EVENT_WITH_ID( E1, EVENT_1 ) Y_EVENT_WITH_ID( E2, EVENT_2 ) - Y_EVENT_WITH_ID( E3, EVENT_3 ) + Y_EVENT_WITH_ID( E3, EVENT_3 ) Y_EVENT_1PARAM_WITH_ID( E4, std::string, get_message, EVENT_4 ) #else Y_EVENT_CREATE( E1, EVENT_1 ) - Y_EVENT_CREATE( E2, EVENT_2 ) - Y_EVENT_CREATE( E3, EVENT_3 ) + Y_EVENT_CREATE( E2, EVENT_2 ) + Y_EVENT_CREATE( E3, EVENT_3 ) Y_EVENT_CREATE( E4, EVENT_4, std::string, get_message ) #endif diff --git a/examples/events_with_parameters/CMakeLists.txt b/examples/events_with_parameters/CMakeLists.txt index 1d6fe6c..3e53000 100644 --- a/examples/events_with_parameters/CMakeLists.txt +++ b/examples/events_with_parameters/CMakeLists.txt @@ -6,8 +6,7 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./*.hpp" "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") -file(GLOB events_with_parameters_SRC "./*.cpp" ${HEADER_FILES}) +file(GLOB events_with_parameters_SRC "./*.cpp" "./*.hpp") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +18,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(events_with_parameters ${events_with_parameters_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/examples/forty_two/CMakeLists.txt b/examples/forty_two/CMakeLists.txt index a6c10a2..2a32c2f 100644 --- a/examples/forty_two/CMakeLists.txt +++ b/examples/forty_two/CMakeLists.txt @@ -6,8 +6,7 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./*.hpp" "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") -file(GLOB forty_two_SRC "./*.cpp" ${HEADER_FILES}) +file(GLOB forty_two_SRC "./*.cpp" "./*.hpp") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +18,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(forty_two ${forty_two_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/examples/generator_example/CMakeLists.txt b/examples/generator_example/CMakeLists.txt index c2e9576..906fefe 100644 --- a/examples/generator_example/CMakeLists.txt +++ b/examples/generator_example/CMakeLists.txt @@ -6,8 +6,7 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./*.hpp" "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") -file(GLOB generator_example_SRC "./*.cpp" ${HEADER_FILES}) +file(GLOB generator_example_SRC "./*.cpp" "./*.hpp") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +18,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(generator_example ${generator_example_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/examples/hello_yasmine/CMakeLists.txt b/examples/hello_yasmine/CMakeLists.txt index c94626f..6fab311 100644 --- a/examples/hello_yasmine/CMakeLists.txt +++ b/examples/hello_yasmine/CMakeLists.txt @@ -6,8 +6,7 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") -file(GLOB hello_yasmine_SRC "./*.cpp" ${HEADER_FILES}) +file(GLOB hello_yasmine_SRC "./*.cpp") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +18,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(hello_yasmine ${hello_yasmine_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/examples/substatemachines_and_variables/CMakeLists.txt b/examples/substatemachines_and_variables/CMakeLists.txt index e52d2d3..d962c8d 100644 --- a/examples/substatemachines_and_variables/CMakeLists.txt +++ b/examples/substatemachines_and_variables/CMakeLists.txt @@ -6,8 +6,7 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./*.hpp" "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") -file(GLOB substatemachines_and_variables_SRC "./*.cpp" ${HEADER_FILES}) +file(GLOB substatemachines_and_variables_SRC "./*.cpp" "./*.hpp") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +18,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(substatemachines_and_variables ${substatemachines_and_variables_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/examples/substatemachines_and_variables/substatemachines_and_variables.vcxproj b/examples/substatemachines_and_variables/substatemachines_and_variables.vcxproj index e07a96c..c2b8e49 100644 --- a/examples/substatemachines_and_variables/substatemachines_and_variables.vcxproj +++ b/examples/substatemachines_and_variables/substatemachines_and_variables.vcxproj @@ -733,6 +733,7 @@ true true true + MachineX64 diff --git a/examples/unhandled_event_handler_example/CMakeLists.txt b/examples/unhandled_event_handler_example/CMakeLists.txt index d124ea0..eac07f6 100644 --- a/examples/unhandled_event_handler_example/CMakeLists.txt +++ b/examples/unhandled_event_handler_example/CMakeLists.txt @@ -6,7 +6,6 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -set(HEADER_FILES "./../../libyasmine/include/*.hpp" "./../../externals/essentials/include/essentials/*.hpp" "./../../externals/essentials/include/compatibility/*.hpp" "./../../externals/hermes/include/hermes/*.hpp") file(GLOB unhandled_event_handler_example_SRC "./*.cpp" ${HEADER_FILES}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -19,7 +18,9 @@ include(./../../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") add_executable(unhandled_event_handler_example ${unhandled_event_handler_example_SRC}) -include_directories("./../../libyasmine/include" "./../../externals/essentials/include" "./../../externals/hermes/include") +include_directories("./../../libyasmine/include") +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../externals/hermes/source/hermes/include") set(link_libraries_list "") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt new file mode 100644 index 0000000..4860ffd --- /dev/null +++ b/externals/CMakeLists.txt @@ -0,0 +1,37 @@ +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (NOT TARGET libessentials) + message(STATUS "essentuals was not build before. It is build now.") + add_subdirectory(essentials) + endif() +else() + if (NOT TARGET essentials) + message(STATUS "essentuals was not build before. It is build now.") + add_subdirectory(essentials) + endif() +endif() + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (NOT TARGET libhermes) + message(STATUS "hermes was not build before. It is build now.") + add_subdirectory(hermes) + endif() +else() + if (NOT TARGET hermes) + message(STATUS "hermes was not build before. It is build now.") + add_subdirectory(hermes) + endif() +endif() + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (NOT TARGET libgenesis) + message(STATUS "genesis was not build before. It is build now.") + add_subdirectory(genesis) + endif() +else() + if (NOT TARGET genesis) + message(STATUS "genesis was not build before. It is build now.") + add_subdirectory(genesis) + endif() +endif() diff --git a/externals/essentials/CMakeLists.txt b/externals/essentials/CMakeLists.txt new file mode 100644 index 0000000..097f692 --- /dev/null +++ b/externals/essentials/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8) + +project(essentials) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +add_subdirectory(source) diff --git a/externals/essentials/source/CMakeHelpers/addBoost.cmake b/externals/essentials/source/CMakeHelpers/addBoost.cmake new file mode 100644 index 0000000..d833dc1 --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/addBoost.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(Y_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${Y_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${Y_BOOST_LIB_INCLUDE}) + set(SX_BOOST_LIB_PATH ${Y_BOOST_LIB_PATH}) + set(SX_BOOST_LIB_INCLUDE ${Y_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("Y_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") +elseif(SX_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${SX_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${SX_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("SX_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + +else() + message("SX_BOOST_LIB_INCLUDE is not set by user. Searching for boost libraries.") + set(Boost_USE_MULTITHREADED ON) + find_package(Boost COMPONENTS date_time filesystem system program_options chrono thread random unit_test_framework) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + message("Boost found.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + else() + message(STATUS "Boost libraries not found!") + endif() +endif() diff --git a/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake b/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake new file mode 100644 index 0000000..48bd9c6 --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +# Seadex preprocessor definitions + + +option("SX_NO_LOGGING" "Use when you want to use no logging at all (no logging code is created).") +if( "${SX_NO_LOGGING}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_LOGGING\"") + message(STATUS "No logging used.") +else() + message(STATUS "Logger is used.") +endif() + + +option("SX_NO_STD_MAKE_UNIQUE" "When the standard make_unique is not available (e.g. no C++14 support), you have to define this preprocessor definition. A yasmine drop-in replacement template will be used instead then.") +if( "${SX_NO_STD_MAKE_UNIQUE}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_STD_MAKE_UNIQUE\"") + message(STATUS "SX_NO_STD_MAKE_UNIQUE is defined.") +endif() + + +option("SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG" "Sets to use a workaround for bug in GCC with expansion of template parameter pack that appears in a lambda-expression (bug reported for GCC 4.8.4)") +if( "${SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG}" ) + set(extra_flags "${extra_flags} -D \"SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG\"") + message(STATUS "SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG is defined.") +endif() \ No newline at end of file diff --git a/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake b/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake new file mode 100644 index 0000000..b568fbb --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake @@ -0,0 +1,112 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +add_compiler_flag("-Wall") + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +#gcc/clang compiler flags + if(NOT "SX_PEDANTIC" STREQUAL "OFF") + add_compiler_flag("-pedantic") + endif() + + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + add_compiler_flag("-g") + endif() + + if("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++03") + add_compiler_flag("-D \"SX_CPP03_BOOST\"") + add_compiler_flag("-D \"SX_NO_VARIADIC_MACRO\"") + elseif("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++14") + else() + add_compiler_flag("-std=c++11") + add_compiler_flag("-D \"SX_NO_STD_MAKE_UNIQUE\"") + endif() + +# platform + if( "${CMAKE_CXX_FLAGS}" STREQUAL "-m64" ) + add_compiler_flag("-m64") + message(STATUS "setting platform x64") + elseif("${CMAKE_CXX_FLAGS}" STREQUAL "-m32") + add_compiler_flag("-m32") + message(STATUS "setting platform x86") + endif() +endif() + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # Checks buffer security. + set(extra_flags "${extra_flags} /GS") + + #Sets output warning level. + set(extra_flags "${extra_flags} /W4") + + #Disable specific Warnings. + set(extra_flags "${extra_flags} /wd\"4127\" /wd\"4250\"") + + #Defines constants and macros. + set(extra_flags "${extra_flags} /D \"_CRT_SECURE_NO_WARNINGS\"") + + #Enables function-level linking. + set(extra_flags "${extra_flags} /Gy") + + #Specifies standard behaviour under /Ze. + set(extra_flags "${extra_flags} /Zc:wchar_t /Zc:inline") + + #Disable minimal rebuild. + set(extra_flags "${extra_flags} /Gm-") + + #Enables additional security features and warnings. + set(extra_flags "${extra_flags} /sdl") + + #Specifies floating-point behaviour. + set(extra_flags "${extra_flags} /fp:precise") + + #Multibyte character sets macro. + set(extra_flags "${extra_flags} /D \"_MBCS\"") + + #Enables you to provide internal compiler error (ICE) information directly to the Visual C++ team. + set(extra_flags "${extra_flags} /errorReport:prompt") + + #Treats warnings as errors. + if( "${MSVC_VERSION}" STRGREATER "1800" ) + set(extra_flags "${extra_flags} /WX") + #else( "${MSVC_VERSION}" STRLESS "1900" ) + else() + set(extra_flags "${extra_flags} /WX-") + endif() + + + #Generates intrinsic functions. + set(extra_flags "${extra_flags} /Oi") + + #Specifies the model of exception handling. + set(extra_flags "${extra_flags} /EHsc") + + #Creates an object file. + set(extra_flags "${extra_flags} /Fo") + + #Marks an executable as verified to be compatible with the Windows Data Execution Prevention feature. + #set(extra_flags "${extra_flags} /NXCOMPAT") + + + # for release + if( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" ) + #Creates fast code. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /PDB-") + + #Controls LINK optimizations. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /OPT:REF /OPT:ICF") + + # for debug + elseif( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) + #Creates a program database (PDB) file. + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /PDB") + endif() + +endif() \ No newline at end of file diff --git a/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake b/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake new file mode 100644 index 0000000..7964d92 --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +include("${CMAKE_CURRENT_LIST_DIR}/addSeadexOptions.cmake") + +# yasmine's preprocessor definitions + + +set(Y_OPTIMIZE "SPEED" CACHE STRING "Sets the optimize type. Supported values: SPEED and SIZE. Default value is SPEED.") +if( "${Y_OPTIMIZE}" STREQUAL "SIZE" ) + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SIZE\"") + message(STATUS "Optimizing for size.") +else() + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SPEED\"") + message(STATUS "Optimizing for speed.") +endif() + + +option("Y_LEAN_AND_MEAN" "If you compile the library with Y_LEAN_AND_MEAN being defined or if you define the macro locally before including yasmine.hpp, all the state pseudostates and the asynchronous simple state (with the asynchronous behaviour) are excluded (i.e. those headers are not included). This can reduce compile time.") +if( "${Y_LEAN_AND_MEAN}" ) + set(extra_flags "${extra_flags} -D \"Y_LEAN_AND_MEAN\"") + message(STATUS "Y_LEAN_AND_MEAN is defined.") +endif() + +option("Y_PROFILER" "If Y_PROFILER is defined, the state machine will count the number of events that were processed. The user can query the counter by calling the 'get_number_of_processed_events' method.") +if( "${Y_PROFILER}" ) + set(extra_flags "${extra_flags} -D \"Y_PROFILER\"") + message(STATUS "Y_PROFILER is defined.") +endif() + diff --git a/externals/essentials/source/CMakeHelpers/functions.cmake b/externals/essentials/source/CMakeHelpers/functions.cmake new file mode 100644 index 0000000..3a76857 --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/functions.cmake @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +function(use_pthread varName) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(${varName} ${${varName}} pthread PARENT_SCOPE) + endif() +endfunction() + + +function(use_boost_libraries varName) + set(${varName} ${${varName}} ${Boost_LIBRARIES} PARENT_SCOPE) +endfunction() + + +function(add_library_for_linking varName libraryName) + set(${varName} ${${varName}} ${libraryName} PARENT_SCOPE) +endfunction() diff --git a/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake b/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake new file mode 100644 index 0000000..105747b --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +include(CheckCXXCompilerFlag) + + +function(add_compiler_flag varFlag) + string(FIND "${CMAKE_CXX_FLAGS}" "${varFlag}" flag_already_set) + if(flag_already_set EQUAL -1) + check_cxx_compiler_flag("${varFlag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${varFlag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() diff --git a/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake b/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake new file mode 100644 index 0000000..c638987 --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +function(use_rapid_JSON) +if(SX_RAPIDJSON) + message("SX_RAPIDJSON is set by user.") +else() + message("SX_RAPIDJSON is not set by user. Setting default value.") + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + find_package(RapidJSON) + if(NOT ("${RAPIDJSON_INCLUDE_DIRS}" STREQUAL "")) + set(SX_RAPIDJSON ${RAPIDJSON_INCLUDE_DIRS}) + message(STATUS "Found rapidjson on: ${RAPIDJSON_INCLUDE_DIRS}") + else() + set(SX_RAPIDJSON /usr/include) + message(STATUS "Set default value for rapidjson") + endif() + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(SX_RAPIDJSON "C:\\Program Files") + endif() +endif() + +include_directories(${SX_RAPIDJSON}) + +message(STATUS "include rapidJSON from: ${SX_RAPIDJSON}") + +endfunction() diff --git a/externals/essentials/source/CMakeHelpers/setVariables.cmake b/externals/essentials/source/CMakeHelpers/setVariables.cmake new file mode 100644 index 0000000..a6f1454 --- /dev/null +++ b/externals/essentials/source/CMakeHelpers/setVariables.cmake @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +if(("${Y_STATIC}" STREQUAL "ON") OR ("${SX_STATIC}" STREQUAL "ON")) + set(LINK_TYPE "STATIC") +else() + set(LINK_TYPE "SHARED") +endif() diff --git a/externals/essentials/source/CMakeLists.txt b/externals/essentials/source/CMakeLists.txt new file mode 100644 index 0000000..daef5a2 --- /dev/null +++ b/externals/essentials/source/CMakeLists.txt @@ -0,0 +1,16 @@ + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +include(./CMakeHelpers/setVariables.cmake) + +include(./CMakeHelpers/addBoost.cmake) +include(./CMakeHelpers/functions.cmake) +include(./CMakeHelpers/functionsAddCompilerFlags.cmake) + +add_subdirectory(essentials) + +if(EXISTS essentials_unit_tests) +add_subdirectory(essentials_unit_tests) +endif() diff --git a/externals/essentials/source/build/c++03.props b/externals/essentials/source/build/c++03.props new file mode 100644 index 0000000..d76c9b5 --- /dev/null +++ b/externals/essentials/source/build/c++03.props @@ -0,0 +1,31 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + <_PropertySheetDisplayName>c++03 + + + + SX_NO_VARIADIC_MACRO;SX_CPP03_BOOST;BOOST_SP_USE_STD_ATOMIC;WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(BOOST_PATH);%(AdditionalIncludeDirectories) + + + + $(BOOST_LIB_PATH);$(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/essentials/source/build/debug_info.props b/externals/essentials/source/build/debug_info.props new file mode 100644 index 0000000..5dc702b --- /dev/null +++ b/externals/essentials/source/build/debug_info.props @@ -0,0 +1,18 @@ + + + + + + + + + NotSet + true + + + EditAndContinue + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + \ No newline at end of file diff --git a/externals/essentials/source/build/essentials.props b/externals/essentials/source/build/essentials.props new file mode 100644 index 0000000..8bdf813 --- /dev/null +++ b/externals/essentials/source/build/essentials.props @@ -0,0 +1,31 @@ + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + Level4 + 4127;4250 + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + None + false + true + include;%(AdditionalIncludeDirectories) + /D "_STL_WARNING_LEVEL=3" %(AdditionalOptions) + + + + + + No + Default + + + false + + + + \ No newline at end of file diff --git a/externals/essentials/source/build/use_boost.props b/externals/essentials/source/build/use_boost.props new file mode 100644 index 0000000..85fdae4 --- /dev/null +++ b/externals/essentials/source/build/use_boost.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/essentials/source/build/use_boost_as_external.props b/externals/essentials/source/build/use_boost_as_external.props new file mode 100644 index 0000000..cdd4e52 --- /dev/null +++ b/externals/essentials/source/build/use_boost_as_external.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/essentials/source/build/use_boost_externals.props b/externals/essentials/source/build/use_boost_externals.props new file mode 100644 index 0000000..27f07b7 --- /dev/null +++ b/externals/essentials/source/build/use_boost_externals.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/essentials/source/build/use_essentials.props b/externals/essentials/source/build/use_essentials.props new file mode 100644 index 0000000..9f7bfc9 --- /dev/null +++ b/externals/essentials/source/build/use_essentials.props @@ -0,0 +1,32 @@ + + + + + ..\..\..\essentials\source\essentials\include + ..\..\..\essentials\source\essentials\include\compatibility + ..\..\..\essentials\source\$(Platform)\$(Configuration) + + + + + $(ESSENTIALS_INCLUDE_PATH);$(ESSENTIALS_COMPATIBILITY_PATH);%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);$(ESSENTIALS_LIB_PATH);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + + $(ESSENTIALS_INCLUDE_PATH) + + + $(ESSENTIALS_COMPATIBILITY_PATH) + + + $(ESSENTIALS_LIB_PATH) + + + \ No newline at end of file diff --git a/externals/essentials/source/build/use_essentials_base.props b/externals/essentials/source/build/use_essentials_base.props new file mode 100644 index 0000000..7f85a09 --- /dev/null +++ b/externals/essentials/source/build/use_essentials_base.props @@ -0,0 +1,28 @@ + + + + + ..\essentials\include + ..\$(Platform)\$(Configuration) + + + + + $(ESSENTIALS_INCLUDE_PATH);$(ESSENTIALS_COMPATIBILITY_PATH);%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);$(ESSENTIALS_LIB_PATH);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + + $(ESSENTIALS_INCLUDE_PATH) + + + $(ESSENTIALS_LIB_PATH) + + + \ No newline at end of file diff --git a/externals/essentials/source/changelog.txt b/externals/essentials/source/changelog.txt new file mode 100644 index 0000000..d1a6a27 --- /dev/null +++ b/externals/essentials/source/changelog.txt @@ -0,0 +1,38 @@ +# Change log +All notable changes to this project are documented in this file. + +##[1.3.2] - 2017-12-18 + +### Added +• SX_UNUSED_VARIABLE macro for suppressing warnings for unreferenced variable. +• backward compatibility for macros Y_NO_STD_MAKE_UNIQUE, Y_CPP03_BOOST, Y_UNIQUE_PTR, Y_MAKE_UNIQUE, Y_MAKE_SHARED, Y_UNUSED_PARAMETER + +### Changed +• CMake: use external CMakeHelpers files +• CMake: refactoring of build scripts + +### Fixed +• missing boost namespace in sxprintf + + +##[1.1.0] - 2017-09-20 + +### Added +• Support for Visual Studio 2017 builds +• conversion functions: to_lower and to_upper +• added uri class + + +##[1.0.1] - 2017-04-07 + +### Changed +• macro helpers improved to count up to 15 parameters +• essentials file structure refactoring. All source files are now located in the 'source' folder, the header files for compatibility +are located in the 'include/essentials/compatibility' folder and other header files are located in the 'include/essentials' folder. + + +##[1.0.0] - 2017-03-30 + +• The very first released version of essentials + + diff --git a/externals/essentials/source/essentials.sln b/externals/essentials/source/essentials.sln new file mode 100644 index 0000000..c96fe08 --- /dev/null +++ b/externals/essentials/source/essentials.sln @@ -0,0 +1,156 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2010 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials", "essentials\essentials.vcxproj", "{132F81F8-46DA-49D0-9071-D70BC087B38C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials_unit_tests", "essentials_unit_tests\essentials_unit_tests.vcxproj", "{6F4D72B1-E418-4859-8C19-D58659041948}" + ProjectSection(ProjectDependencies) = postProject + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build_tools", "build_tools", "{77439103-0A48-4243-8D07-3223DC5CF353}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMake", "CMake", "{86310DF6-AE4D-48C6-B302-80F5091FC09B}" + ProjectSection(SolutionItems) = preProject + ..\CMakeLists.txt = ..\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{1C08A7CC-21A3-42E1-AA39-7E03F88A73F3}" + ProjectSection(SolutionItems) = preProject + CMakeLists.txt = CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "essentials", "essentials", "{968024AC-A87C-40E9-B75A-B7AE9790C73F}" + ProjectSection(SolutionItems) = preProject + essentials\CMakeLists.txt = essentials\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMakeHelpers", "CMakeHelpers", "{35E7ED3A-7DF9-4E75-B289-99B3D0050992}" + ProjectSection(SolutionItems) = preProject + CMakeHelpers\addBoost.cmake = CMakeHelpers\addBoost.cmake + CMakeHelpers\addSeadexOptions.cmake = CMakeHelpers\addSeadexOptions.cmake + CMakeHelpers\addSpecificFlags.cmake = CMakeHelpers\addSpecificFlags.cmake + CMakeHelpers\addYasmineOptions.cmake = CMakeHelpers\addYasmineOptions.cmake + CMakeHelpers\functions.cmake = CMakeHelpers\functions.cmake + CMakeHelpers\functionsAddCompilerFlags.cmake = CMakeHelpers\functionsAddCompilerFlags.cmake + CMakeHelpers\functionsRapidJSON.cmake = CMakeHelpers\functionsRapidJSON.cmake + CMakeHelpers\setVariables.cmake = CMakeHelpers\setVariables.cmake + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "essentials_unit_tests", "essentials_unit_tests", "{63218938-B7EC-4913-9B3B-CEAE1F2A925B}" + ProjectSection(SolutionItems) = preProject + essentials_unit_tests\CMakeLists.txt = essentials_unit_tests\CMakeLists.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug - C++ 03|Win32 = Debug - C++ 03|Win32 + Debug - C++ 03|x64 = Debug - C++ 03|x64 + Debug - C++ 03|x86 = Debug - C++ 03|x86 + Debug - VS 2015|Win32 = Debug - VS 2015|Win32 + Debug - VS 2015|x64 = Debug - VS 2015|x64 + Debug - VS 2015|x86 = Debug - VS 2015|x86 + Debug - VS 2017|Win32 = Debug - VS 2017|Win32 + Debug - VS 2017|x64 = Debug - VS 2017|x64 + Debug - VS 2017|x86 = Debug - VS 2017|x86 + Release - C++ 03|Win32 = Release - C++ 03|Win32 + Release - C++ 03|x64 = Release - C++ 03|x64 + Release - C++ 03|x86 = Release - C++ 03|x86 + Release - VS 2015|Win32 = Release - VS 2015|Win32 + Release - VS 2015|x64 = Release - VS 2015|x64 + Release - VS 2015|x86 = Release - VS 2015|x86 + Release - VS 2017|Win32 = Release - VS 2017|Win32 + Release - VS 2017|x64 = Release - VS 2017|x64 + Release - VS 2017|x86 = Release - VS 2017|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.Build.2 = Debug - VS 2013|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {86310DF6-AE4D-48C6-B302-80F5091FC09B} = {77439103-0A48-4243-8D07-3223DC5CF353} + {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} = {86310DF6-AE4D-48C6-B302-80F5091FC09B} + {968024AC-A87C-40E9-B75A-B7AE9790C73F} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + {35E7ED3A-7DF9-4E75-B289-99B3D0050992} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + {63218938-B7EC-4913-9B3B-CEAE1F2A925B} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CB028EB1-46EF-44C3-B508-97BC3E09DC4D} + EndGlobalSection +EndGlobal diff --git a/externals/essentials/source/essentials/CMakeLists.txt b/externals/essentials/source/essentials/CMakeLists.txt new file mode 100644 index 0000000..edc08df --- /dev/null +++ b/externals/essentials/source/essentials/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 2.8) + +project(essentials) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +file(GLOB essentials_SRC "include/essentials/*.hpp" "include/essentials/compatibility/*.hpp" "source/*.cpp") + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(./../CMakeHelpers/addSpecificFlags.cmake) +include(./../CMakeHelpers/addSeadexOptions.cmake) + +include_directories("./include") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library(libessentials ${LINK_TYPE} ${essentials_SRC}) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library(essentials STATIC ${essentials_SRC}) +endif() + + +file(GLOB essentials_hpp "include/essentials/*.hpp" "include/essentials/compatibility/*.hpp") +install(FILES ${essentials_hpp} DESTINATION include/essentials/include) + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + install(TARGETS libessentials DESTINATION lib) + set_target_properties(libessentials PROPERTIES PREFIX "") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + install(TARGETS essentials DESTINATION lib) + set_target_properties(essentials PROPERTIES PREFIX "") +endif() diff --git a/externals/essentials/source/essentials/essentials.vcxproj b/externals/essentials/source/essentials/essentials.vcxproj new file mode 100644 index 0000000..63f7f7e --- /dev/null +++ b/externals/essentials/source/essentials/essentials.vcxproj @@ -0,0 +1,545 @@ + + + + + Debug - C++ 03 + Win32 + + + Debug - C++ 03 + x64 + + + Debug - Clang + Win32 + + + Debug - Clang + x64 + + + Debug - VS 2013 + Win32 + + + Debug - VS 2013 + x64 + + + Debug - VS 2015 + Win32 + + + Debug - VS 2015 + x64 + + + Debug - VS 2017 + Win32 + + + Release - C++ 03 + Win32 + + + Release - C++ 03 + x64 + + + Release - Clang + Win32 + + + Release - Clang + x64 + + + Release - VS 2015 + Win32 + + + Release - VS 2015 + x64 + + + Release - VS 2017 + Win32 + + + Debug - VS 2017 + x64 + + + Release - VS 2017 + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {132F81F8-46DA-49D0-9071-D70BC087B38C} + essentials + 8.1 + + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141_clang_c2 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + + \ No newline at end of file diff --git a/externals/essentials/source/essentials/essentials.vcxproj.filters b/externals/essentials/source/essentials/essentials.vcxproj.filters new file mode 100644 index 0000000..e68031a --- /dev/null +++ b/externals/essentials/source/essentials/essentials.vcxproj.filters @@ -0,0 +1,107 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4a8b49fc-8912-43d5-a33a-962f5e097001} + + + {13a9f023-217a-4d7a-946f-8147bce1d21a} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + + + + license + + + license + + + license + + + license + + + license + + + + + Header Files\compatibility + + + Header Files\compatibility + + + Header Files\compatibility + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\compatibility + + + \ No newline at end of file diff --git a/externals/essentials/include/essentials/base.hpp b/externals/essentials/source/essentials/include/essentials/base.hpp similarity index 97% rename from externals/essentials/include/essentials/base.hpp rename to externals/essentials/source/essentials/include/essentials/base.hpp index eab624d..9ea9eb7 100644 --- a/externals/essentials/include/essentials/base.hpp +++ b/externals/essentials/source/essentials/include/essentials/base.hpp @@ -1,41 +1,41 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A -#define BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A - - -//!\def SX_ASSERT( _condition, _message ) -//!\brief Assert a given condition. Adds the message to the assert for better diagnostics when the assert is triggered. -#define SX_ASSERT( _condition, _message ) \ - do \ - { \ - assert( ( _condition ) && _message ); \ - } \ - while( 0 ) - -//!\def SX_ASSERTED( _x ) -//!\brief Suppress warnings for variables that are only used within asserts. -#define SX_ASSERTED( _x ) static_cast< void >( _x ); - -//!\def SX_UNUSED_PARAMETER( _x ) -//!\brief Suppress warnings for unreferenced parameters. -#define SX_UNUSED_PARAMETER( _x ) static_cast( _x ) - - -//!\def SX_UNUSED_VARIABLE( _x ) -//!\brief Suppress warnings for unreferenced variable. -#define SX_UNUSED_VARIABLE( _x ) static_cast( _x ) - - -#include - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A +#define BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A + + +//!\def SX_ASSERT( _condition, _message ) +//!\brief Assert a given condition. Adds the message to the assert for better diagnostics when the assert is triggered. +#define SX_ASSERT( _condition, _message ) \ + do \ + { \ + assert( ( _condition ) && _message ); \ + } \ + while( 0 ) + +//!\def SX_ASSERTED( _x ) +//!\brief Suppress warnings for variables that are only used within asserts. +#define SX_ASSERTED( _x ) static_cast< void >( _x ); + +//!\def SX_UNUSED_PARAMETER( _x ) +//!\brief Suppress warnings for unreferenced parameters. +#define SX_UNUSED_PARAMETER( _x ) static_cast( _x ) + + +//!\def SX_UNUSED_VARIABLE( _x ) +//!\brief Suppress warnings for unreferenced variable. +#define SX_UNUSED_VARIABLE( _x ) static_cast( _x ) + + +#include + + +#endif diff --git a/externals/essentials/include/essentials/build_number.hpp b/externals/essentials/source/essentials/include/essentials/build_number.hpp similarity index 93% rename from externals/essentials/include/essentials/build_number.hpp rename to externals/essentials/source/essentials/include/essentials/build_number.hpp index 0e18bab..6771ace 100644 --- a/externals/essentials/include/essentials/build_number.hpp +++ b/externals/essentials/source/essentials/include/essentials/build_number.hpp @@ -1,35 +1,35 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 -#define BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 - - -#include "compatibility/compatibility.hpp" - - -namespace sxe -{ - - -namespace version -{ - - - const sxe::uint16_t BUILD_NUMBER( 60 ); - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 +#define BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + +namespace version +{ + + + const sxe::uint16_t BUILD_NUMBER( 96 ); + + +} + + +} + + +#endif diff --git a/externals/essentials/include/essentials/compatibility/chrono.hpp b/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp similarity index 96% rename from externals/essentials/include/essentials/compatibility/chrono.hpp rename to externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp index b53e1fd..1946dc4 100644 --- a/externals/essentials/include/essentials/compatibility/chrono.hpp +++ b/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp @@ -1,59 +1,59 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 -#define CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 - - -#ifdef SX_CPP03_BOOST - -#include - -#else - -#include - -#endif - - -namespace sxe -{ - - -#ifdef SX_CPP03_BOOST // C++03 compatibility - - using boost::chrono::time_point; - using boost::chrono::system_clock; - using boost::chrono::steady_clock; - using boost::chrono::seconds; - using boost::chrono::milliseconds; - using boost::chrono::duration_cast; - using boost::chrono::time_point; - - -#else // C++11 compatibility - - - using std::chrono::time_point; - using std::chrono::system_clock; - using std::chrono::steady_clock; - using std::chrono::milliseconds; - using std::chrono::seconds; - using std::chrono::duration_cast; - using std::chrono::time_point; - - -#endif - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 +#define CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 + + +#ifdef SX_CPP03_BOOST + +#include + +#else + +#include + +#endif + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + using boost::chrono::time_point; + using boost::chrono::system_clock; + using boost::chrono::steady_clock; + using boost::chrono::seconds; + using boost::chrono::milliseconds; + using boost::chrono::duration_cast; + using boost::chrono::time_point; + + +#else // C++11 compatibility + + + using std::chrono::time_point; + using std::chrono::system_clock; + using std::chrono::steady_clock; + using std::chrono::milliseconds; + using std::chrono::seconds; + using std::chrono::duration_cast; + using std::chrono::time_point; + + +#endif + + +} + + +#endif diff --git a/externals/essentials/include/essentials/compatibility/compatibility.hpp b/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp similarity index 95% rename from externals/essentials/include/essentials/compatibility/compatibility.hpp rename to externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp index 9116631..4d5e764 100644 --- a/externals/essentials/include/essentials/compatibility/compatibility.hpp +++ b/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp @@ -1,184 +1,184 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 -#define COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 - - -#include "essentials_backward_compatibility.hpp" - - -#ifdef SX_CPP03_BOOST -#ifdef _MSC_VER -#pragma warning( push ) -#pragma warning( disable : 4456 ) -#pragma warning( disable : 4996 ) -#endif - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning( pop ) -#endif - -#else -#include -#include -#include -#include -#include -#endif - - -namespace sxe -{ - - -#ifdef SX_CPP03_BOOST // C++03 compatibility - - #define SX_OVERRIDE - #define SX_FINAL - #define SX_DELETE - #define SX_NULLPTR NULL - - #define SX_FOR(_variable, _container) BOOST_FOREACH( _variable, _container ) - - #define SX_CONSTEXPR const - - #define SX_NOEXCEPT throw() - - - using boost::shared_ptr; - #define SX_UNIQUE_PTR shared_ptr - - #define SX_MAKE_SHARED boost::make_shared - #define SX_MAKE_UNIQUE boost::make_shared - - template - _type& move(_type& _t) - { - return( _t ); - } - - using boost::int8_t; - using boost::int16_t; - using boost::int32_t; - using boost::int64_t; - using boost::uint8_t; - using boost::uint16_t; - using boost::uint32_t; - using boost::uint64_t; - - using boost::bind; - using boost::ref; - using boost::cref; - using boost::placeholders::_1; - using boost::placeholders::_2; - - using boost::function; - - using boost::remove_reference; - using boost::remove_const; - - using boost::random_device; - - -#else // C++11 compatibility - - #ifdef SX_NO_STD_MAKE_UNIQUE - - template< typename t, typename ... args > - std::unique_ptr< t > make_unique(args&& ... _args) - { - return( std::unique_ptr< t >(new t(std::forward< args >(_args)...)) ); - } - - #else - - using std::make_unique; - - #endif - - #define SX_OVERRIDE override - #define SX_FINAL final - #define SX_DELETE = delete - #define SX_NULLPTR nullptr - - #define SX_FOR(_variable, _container) for( _variable : _container ) - - #ifdef _MSC_VER - #if _MSC_VER <= 1800 - #define SX_CONSTEXPR const - #endif - #endif - - #ifndef SX_CONSTEXPR - #define SX_CONSTEXPR constexpr - #endif - -#ifdef _MSC_VER - #if _MSC_VER <= 1800 - #define SX_NOEXCEPT throw() - #else - #define SX_NOEXCEPT noexcept - #endif -#else - #define SX_NOEXCEPT noexcept -#endif - - using std::shared_ptr; - template - using SX_UNIQUE_PTR = std::unique_ptr<_pointee>; - - #define SX_MAKE_SHARED std::make_shared - #define SX_MAKE_UNIQUE sxe::make_unique - - using std::move; - - - using std::int8_t; - using std::int16_t; - using std::int32_t; - using std::int64_t; - using std::uint8_t; - using std::uint16_t; - using std::uint32_t; - using std::uint64_t; - - using std::bind; - using std::ref; - using std::cref; - using std::placeholders::_1; - using std::placeholders::_2; - - using std::function; - - using std::remove_reference; - using std::remove_const; - - using std::random_device; - - -#endif - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 +#define COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 + + +#include "essentials_backward_compatibility.hpp" + + +#ifdef SX_CPP03_BOOST +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4456 ) +#pragma warning( disable : 4996 ) +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#else +#include +#include +#include +#include +#include +#endif + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + #define SX_OVERRIDE + #define SX_FINAL + #define SX_DELETE + #define SX_NULLPTR NULL + + #define SX_FOR(_variable, _container) BOOST_FOREACH( _variable, _container ) + + #define SX_CONSTEXPR const + + #define SX_NOEXCEPT throw() + + + using boost::shared_ptr; + #define SX_UNIQUE_PTR shared_ptr + + #define SX_MAKE_SHARED boost::make_shared + #define SX_MAKE_UNIQUE boost::make_shared + + template + _type& move(_type& _t) + { + return( _t ); + } + + using boost::int8_t; + using boost::int16_t; + using boost::int32_t; + using boost::int64_t; + using boost::uint8_t; + using boost::uint16_t; + using boost::uint32_t; + using boost::uint64_t; + + using boost::bind; + using boost::ref; + using boost::cref; + using boost::placeholders::_1; + using boost::placeholders::_2; + + using boost::function; + + using boost::remove_reference; + using boost::remove_const; + + using boost::random_device; + + +#else // C++11 compatibility + + #ifdef SX_NO_STD_MAKE_UNIQUE + + template< typename t, typename ... args > + std::unique_ptr< t > make_unique(args&& ... _args) + { + return( std::unique_ptr< t >(new t(std::forward< args >(_args)...)) ); + } + + #else + + using std::make_unique; + + #endif + + #define SX_OVERRIDE override + #define SX_FINAL final + #define SX_DELETE = delete + #define SX_NULLPTR nullptr + + #define SX_FOR(_variable, _container) for( _variable : _container ) + + #ifdef _MSC_VER + #if _MSC_VER <= 1800 + #define SX_CONSTEXPR const + #endif + #endif + + #ifndef SX_CONSTEXPR + #define SX_CONSTEXPR constexpr + #endif + +#ifdef _MSC_VER + #if _MSC_VER <= 1800 + #define SX_NOEXCEPT throw() + #else + #define SX_NOEXCEPT noexcept + #endif +#else + #define SX_NOEXCEPT noexcept +#endif + + using std::shared_ptr; + template + using SX_UNIQUE_PTR = std::unique_ptr<_pointee>; + + #define SX_MAKE_SHARED std::make_shared + #define SX_MAKE_UNIQUE sxe::make_unique + + using std::move; + + + using std::int8_t; + using std::int16_t; + using std::int32_t; + using std::int64_t; + using std::uint8_t; + using std::uint16_t; + using std::uint32_t; + using std::uint64_t; + + using std::bind; + using std::ref; + using std::cref; + using std::placeholders::_1; + using std::placeholders::_2; + + using std::function; + + using std::remove_reference; + using std::remove_const; + + using std::random_device; + + +#endif + + +} + + +#endif diff --git a/externals/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp b/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp similarity index 97% rename from externals/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp rename to externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp index 077dbb4..c0b2d60 100644 --- a/externals/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp +++ b/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp @@ -1,31 +1,31 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 -#define ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 - - -#ifdef Y_NO_STD_MAKE_UNIQUE -#define SX_NO_STD_MAKE_UNIQUE -#endif - - -#ifdef Y_CPP03_BOOST -#define SX_CPP03_BOOST -#endif - - -#define Y_UNIQUE_PTR SX_UNIQUE_PTR -#define Y_MAKE_UNIQUE SX_MAKE_UNIQUE -#define Y_MAKE_SHARED SX_MAKE_SHARED -#define Y_UNUSED_PARAMETER SX_UNUSED_PARAMETER - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 +#define ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 + + +#ifdef Y_NO_STD_MAKE_UNIQUE +#define SX_NO_STD_MAKE_UNIQUE +#endif + + +#ifdef Y_CPP03_BOOST +#define SX_CPP03_BOOST +#endif + + +#define Y_UNIQUE_PTR SX_UNIQUE_PTR +#define Y_MAKE_UNIQUE SX_MAKE_UNIQUE +#define Y_MAKE_SHARED SX_MAKE_SHARED +#define Y_UNUSED_PARAMETER SX_UNUSED_PARAMETER + + +#endif diff --git a/externals/essentials/include/essentials/compatibility/thread.hpp b/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp similarity index 96% rename from externals/essentials/include/essentials/compatibility/thread.hpp rename to externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp index 3cdb3c3..2381481 100644 --- a/externals/essentials/include/essentials/compatibility/thread.hpp +++ b/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp @@ -1,63 +1,63 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF -#define THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF - - -#ifdef SX_CPP03_BOOST - -#include -#include - -#else - -#include -#include -#include -#include - -#endif - - - -namespace sxe -{ - - -#ifdef SX_CPP03_BOOST // C++03 compatibility - - using boost::thread; - using boost::unique_lock; - using boost::mutex; - using boost::lock_guard; - using boost::condition_variable; - using boost::this_thread::sleep_for; - using boost::atomic; - - -#else // C++11 compatibility - - - using std::thread; - using std::unique_lock; - using std::mutex; - using std::lock_guard; - using std::condition_variable; - using std::this_thread::sleep_for; - using std::atomic; - - -#endif - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF +#define THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF + + +#ifdef SX_CPP03_BOOST + +#include +#include + +#else + +#include +#include +#include +#include + +#endif + + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + using boost::thread; + using boost::unique_lock; + using boost::mutex; + using boost::lock_guard; + using boost::condition_variable; + using boost::this_thread::sleep_for; + using boost::atomic; + + +#else // C++11 compatibility + + + using std::thread; + using std::unique_lock; + using std::mutex; + using std::lock_guard; + using std::condition_variable; + using std::this_thread::sleep_for; + using std::atomic; + + +#endif + + +} + + +#endif diff --git a/externals/essentials/include/essentials/conversion.hpp b/externals/essentials/source/essentials/include/essentials/conversion.hpp similarity index 97% rename from externals/essentials/include/essentials/conversion.hpp rename to externals/essentials/source/essentials/include/essentials/conversion.hpp index 8d73274..c46dd99 100644 --- a/externals/essentials/include/essentials/conversion.hpp +++ b/externals/essentials/source/essentials/include/essentials/conversion.hpp @@ -1,53 +1,53 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 -#define CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 - - -#include "compatibility/compatibility.hpp" - - -namespace sxe -{ - - - //!\brief Converts a number from string to int. - //!\param _int_as_string Number in string format. - //!\param _result Variable where the result will be stored. - //!\return True on success, false otherwise. - bool string_to_int( const char* const _int_as_string, int& _result ); - - //!\brief Converts a number from unsigned int 32 to string. - //!\param _value Number to be converted. - //!\return Number as string. - std::string to_string( const sxe::uint32_t _value ); - - //!\brief Converts a number from int to string. - //!\param _value Number to be converted. - //!\return Number as string. - std::string to_string( const int _value ); - - //!\brief Converts a string to uppercase. - //!\param _value String to be converted. - //!\return String in uppercase format. - //!\sa to_lower - std::string to_upper( const std::string& _value ); - - //!\brief Converts a string to lowercase. - //!\param _value String to be converted. - //!\return String in lowercase format. - //!\sa to_upper - std::string to_lower( const std::string& _value ); - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 +#define CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + + //!\brief Converts a number from string to int. + //!\param _int_as_string Number in string format. + //!\param _result Variable where the result will be stored. + //!\return True on success, false otherwise. + bool string_to_int( const char* const _int_as_string, int& _result ); + + //!\brief Converts a number from unsigned int 32 to string. + //!\param _value Number to be converted. + //!\return Number as string. + std::string to_string( const sxe::uint32_t _value ); + + //!\brief Converts a number from int to string. + //!\param _value Number to be converted. + //!\return Number as string. + std::string to_string( const int _value ); + + //!\brief Converts a string to uppercase. + //!\param _value String to be converted. + //!\return String in uppercase format. + //!\sa to_lower + std::string to_upper( const std::string& _value ); + + //!\brief Converts a string to lowercase. + //!\param _value String to be converted. + //!\return String in lowercase format. + //!\sa to_upper + std::string to_lower( const std::string& _value ); + +} + + +#endif diff --git a/externals/essentials/include/essentials/essentials_version.hpp b/externals/essentials/source/essentials/include/essentials/essentials_version.hpp similarity index 96% rename from externals/essentials/include/essentials/essentials_version.hpp rename to externals/essentials/source/essentials/include/essentials/essentials_version.hpp index b652986..96d967f 100644 --- a/externals/essentials/include/essentials/essentials_version.hpp +++ b/externals/essentials/source/essentials/include/essentials/essentials_version.hpp @@ -1,41 +1,41 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E -#define VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E - - -#include "compatibility/compatibility.hpp" - - -namespace sxe -{ - - -namespace version -{ - - -void log_version(); - - -sxe::uint16_t get_major_version(); -sxe::uint16_t get_minor_version(); -sxe::uint16_t get_patch_version(); -sxe::uint16_t get_build_number(); - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E +#define VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + +namespace version +{ + + +void log_version(); + + +sxe::uint16_t get_major_version(); +sxe::uint16_t get_minor_version(); +sxe::uint16_t get_patch_version(); +sxe::uint16_t get_build_number(); + + +} + + +} + + +#endif diff --git a/externals/essentials/include/essentials/exception.hpp b/externals/essentials/source/essentials/include/essentials/exception.hpp similarity index 97% rename from externals/essentials/include/essentials/exception.hpp rename to externals/essentials/source/essentials/include/essentials/exception.hpp index 2e357f8..76ad4b8 100644 --- a/externals/essentials/include/essentials/exception.hpp +++ b/externals/essentials/source/essentials/include/essentials/exception.hpp @@ -1,30 +1,30 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 -#define EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 - - -#include "exception_template.hpp" - - -namespace sxe -{ - - -//!\def SX_EXCEPTION( exception ) -//!\brief The Seadex essentials exception class. -SX_EXCEPTION( exception ) - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 +#define EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 + + +#include "exception_template.hpp" + + +namespace sxe +{ + + +//!\def SX_EXCEPTION( exception ) +//!\brief The Seadex essentials exception class. +SX_EXCEPTION( exception ) + + +} + + +#endif diff --git a/externals/essentials/include/essentials/exception_template.hpp b/externals/essentials/source/essentials/include/essentials/exception_template.hpp similarity index 97% rename from externals/essentials/include/essentials/exception_template.hpp rename to externals/essentials/source/essentials/include/essentials/exception_template.hpp index 749894f..2415a7d 100644 --- a/externals/essentials/include/essentials/exception_template.hpp +++ b/externals/essentials/source/essentials/include/essentials/exception_template.hpp @@ -1,160 +1,160 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D -#define EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D - - -#include - -#include "essentials/compatibility/compatibility.hpp" -#include "essentials/sxprintf.hpp" - - -#ifndef SX_CPP03_BOOST - - -//!\def SX_EXCEPTION( _name ) -//!\brief Create an exception class inheriting std::exception with the given name. It also supports -//! creating messages with placeholders by calling sxprintf. -//!\sa sxprintf -#define SX_EXCEPTION( _name ) \ -class _name: public std::exception \ -{ \ -public: \ - template< typename ... args > \ - _name(const std::string & _what, args ... _args ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _args ... ) ) \ - { \ - } \ -\ -\ - virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ -\ -\ - virtual const char* what() const throw () SX_OVERRIDE \ - { \ - return ( what_.c_str() ); \ - } \ -\ -\ -private: \ - std::string what_; \ -\ -\ -}; - - -#else - - -#define SX_EXCEPTION( _name ) \ -class _name: public std::exception \ -{ \ -public: \ - explicit _name(const std::string & _what ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str() ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6 ) ) \ - { \ - } \ -\ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ) \ - { \ - } \ -\ -\ - explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ):\ - std::exception(), \ - what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ) \ - { \ - } \ -\ -\ - virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ -\ -\ - virtual const char* what() const throw () SX_OVERRIDE \ - { \ - return ( what_.c_str() ); \ - } \ -\ -\ -private: \ - std::string what_; \ -\ -\ -}; - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D +#define EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D + + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/sxprintf.hpp" + + +#ifndef SX_CPP03_BOOST + + +//!\def SX_EXCEPTION( _name ) +//!\brief Create an exception class inheriting std::exception with the given name. It also supports +//! creating messages with placeholders by calling sxprintf. +//!\sa sxprintf +#define SX_EXCEPTION( _name ) \ +class _name: public std::exception \ +{ \ +public: \ + template< typename ... args > \ + _name(const std::string & _what, args ... _args ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _args ... ) ) \ + { \ + } \ +\ +\ + virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ +\ +\ + virtual const char* what() const throw () SX_OVERRIDE \ + { \ + return ( what_.c_str() ); \ + } \ +\ +\ +private: \ + std::string what_; \ +\ +\ +}; + + +#else + + +#define SX_EXCEPTION( _name ) \ +class _name: public std::exception \ +{ \ +public: \ + explicit _name(const std::string & _what ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str() ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6 ) ) \ + { \ + } \ +\ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ) \ + { \ + } \ +\ +\ + virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ +\ +\ + virtual const char* what() const throw () SX_OVERRIDE \ + { \ + return ( what_.c_str() ); \ + } \ +\ +\ +private: \ + std::string what_; \ +\ +\ +}; + + +#endif + + +#endif diff --git a/externals/essentials/include/essentials/format_settings.hpp b/externals/essentials/source/essentials/include/essentials/format_settings.hpp similarity index 96% rename from externals/essentials/include/essentials/format_settings.hpp rename to externals/essentials/source/essentials/include/essentials/format_settings.hpp index 798c83e..757c60a 100644 --- a/externals/essentials/include/essentials/format_settings.hpp +++ b/externals/essentials/source/essentials/include/essentials/format_settings.hpp @@ -1,45 +1,45 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB -#define FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB - - -#include - -#include "compatibility/compatibility.hpp" - - -namespace sxe -{ - -//!\struct format_settings -//!\brief Structure containing information for formatting the output of sxprintf. -struct format_settings SX_FINAL -{ - //!\brief Constructor. - format_settings(); - - - std::string format_string_; - bool missing_closing_bracket_; - bool correct_; - bool hex_; - bool pad_zeros_; - bool places_set_; - int places_; - bool decimal_places_set_; - int decimal_places_; -}; - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB +#define FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB + + +#include + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + +//!\struct format_settings +//!\brief Structure containing information for formatting the output of sxprintf. +struct format_settings SX_FINAL +{ + //!\brief Constructor. + format_settings(); + + + std::string format_string_; + bool missing_closing_bracket_; + bool correct_; + bool hex_; + bool pad_zeros_; + bool places_set_; + int places_; + bool decimal_places_set_; + int decimal_places_; +}; + +} + + +#endif diff --git a/externals/essentials/include/essentials/macro_helpers.hpp b/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp similarity index 97% rename from externals/essentials/include/essentials/macro_helpers.hpp rename to externals/essentials/source/essentials/include/essentials/macro_helpers.hpp index 46609e4..b0777eb 100644 --- a/externals/essentials/include/essentials/macro_helpers.hpp +++ b/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp @@ -1,46 +1,46 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 -#define MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 - - -#ifndef SX_NO_VARIADIC_MACRO - - -//!\def EXPAND( x ) -//!\brief Helper to work around some Visual C++ compiler quirk dealing with variadic macros. -#define EXPAND( x ) x - -//!\def CAT( A, B ) -//!\brief Concatenate two tokens. -#define CAT( A, B ) A ## B - -//!\def SELECT( NAME, NUM ) -//!\brief Creating a name from a base name and a number with underscore between them. -#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM ) - -//!\def GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) -//!\brief Helper for counting the number of parameters of a macro. -#define GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) COUNT - -//!\def VA_SIZE( ... ) -//!\brief Count the number of parameters of a macro. -#define VA_SIZE( ... ) EXPAND( GET_COUNT( __VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1 ) ) - -//!\def VA_SELECT( NAME, ... ) -//!\brief Selects the correct overloaded macro based on the number of parameters. -#define VA_SELECT( NAME, ... ) EXPAND( SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__) ) - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 +#define MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 + + +#ifndef SX_NO_VARIADIC_MACRO + + +//!\def EXPAND( x ) +//!\brief Helper to work around some Visual C++ compiler quirk dealing with variadic macros. +#define EXPAND( x ) x + +//!\def CAT( A, B ) +//!\brief Concatenate two tokens. +#define CAT( A, B ) A ## B + +//!\def SELECT( NAME, NUM ) +//!\brief Creating a name from a base name and a number with underscore between them. +#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM ) + +//!\def GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) +//!\brief Helper for counting the number of parameters of a macro. +#define GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) COUNT + +//!\def VA_SIZE( ... ) +//!\brief Count the number of parameters of a macro. +#define VA_SIZE( ... ) EXPAND( GET_COUNT( __VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1 ) ) + +//!\def VA_SELECT( NAME, ... ) +//!\brief Selects the correct overloaded macro based on the number of parameters. +#define VA_SELECT( NAME, ... ) EXPAND( SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__) ) + + +#endif + + +#endif diff --git a/externals/essentials/include/essentials/non_copyable.hpp b/externals/essentials/source/essentials/include/essentials/non_copyable.hpp similarity index 96% rename from externals/essentials/include/essentials/non_copyable.hpp rename to externals/essentials/source/essentials/include/essentials/non_copyable.hpp index d9f85b4..b93fff3 100644 --- a/externals/essentials/include/essentials/non_copyable.hpp +++ b/externals/essentials/source/essentials/include/essentials/non_copyable.hpp @@ -1,68 +1,68 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 -#define NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 - - -#include "essentials/compatibility/compatibility.hpp" - - -namespace sxe -{ - - -#ifdef SX_CPP03_BOOST - - -//!\def SX_NO_COPY(_class_name) -//!\brief Delete the copy constructor and assignment operator of the given class. -#define SX_NO_COPY(_class_name)\ -private:\ - _class_name(const _class_name&) SX_DELETE;\ - _class_name& operator=(const _class_name&) SX_DELETE;\ -public:\ -\ - - -//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) -//!\brief Delete the assignment operator of the given class. -#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ -private:\ - _class_name& operator=( const _class_name& ) SX_DELETE;\ -public:\ -\ - - -#else - - -//!\def SX_NO_COPY(_class_name) -//!\brief Delete the copy constructor and assignment operator of the given class. -#define SX_NO_COPY(_class_name)\ - _class_name(const _class_name&) SX_DELETE;\ - _class_name& operator=(const _class_name&) SX_DELETE;\ -\ - - -//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) -//!\brief Delete the assignment operator of the given class. -#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ - _class_name& operator=( const _class_name& ) SX_DELETE;\ -\ - - -#endif - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 +#define NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 + + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST + + +//!\def SX_NO_COPY(_class_name) +//!\brief Delete the copy constructor and assignment operator of the given class. +#define SX_NO_COPY(_class_name)\ +private:\ + _class_name(const _class_name&) SX_DELETE;\ + _class_name& operator=(const _class_name&) SX_DELETE;\ +public:\ +\ + + +//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) +//!\brief Delete the assignment operator of the given class. +#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ +private:\ + _class_name& operator=( const _class_name& ) SX_DELETE;\ +public:\ +\ + + +#else + + +//!\def SX_NO_COPY(_class_name) +//!\brief Delete the copy constructor and assignment operator of the given class. +#define SX_NO_COPY(_class_name)\ + _class_name(const _class_name&) SX_DELETE;\ + _class_name& operator=(const _class_name&) SX_DELETE;\ +\ + + +//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) +//!\brief Delete the assignment operator of the given class. +#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ + _class_name& operator=( const _class_name& ) SX_DELETE;\ +\ + + +#endif + + +} + + +#endif diff --git a/externals/essentials/include/essentials/sxprintf.hpp b/externals/essentials/source/essentials/include/essentials/sxprintf.hpp similarity index 97% rename from externals/essentials/include/essentials/sxprintf.hpp rename to externals/essentials/source/essentials/include/essentials/sxprintf.hpp index 7cab8ca..0d9a863 100644 --- a/externals/essentials/include/essentials/sxprintf.hpp +++ b/externals/essentials/source/essentials/include/essentials/sxprintf.hpp @@ -1,242 +1,242 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 -#define PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 - - -#include -#include - - -#ifdef SX_CPP03_BOOST - #include - #include -#endif - -#include "compatibility/compatibility.hpp" -#include "format_settings.hpp" - - -namespace sxe -{ - - -#ifdef SX_CPP03_BOOST - typedef boost::variant< bool, int, unsigned int, sxe::int8_t, sxe::uint8_t, sxe::uint16_t, sxe::uint32_t, - std::string, std::size_t, const char*, boost::int_least64_t, double > value_type; - typedef std::vector< value_type > value_types; -#endif - - -extern const char PLACE_HOLDER; -extern const char* const SUPERFLUOUS_PARAMETER_START; -extern const char SUPERFLUOUS_PARAMETER_END; -extern const char OPENING_SQUARE_BRACKET; -extern const char CLOSING_SQUARE_BRACKET; - - -template< typename value > -struct stream_writer -{ - static void print( std::ostream& _os, const value& _value ) - { - _os << _value; - } -}; - - -template< > -struct stream_writer< sxe::uint8_t > -{ - static void print(std::ostream& _os, const sxe::uint8_t& _value) - { - _os << static_cast( _value ); - } -}; - - -// cppcheck-suppress unusedFunction -std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ); -sxe::format_settings parse_format_string( const char** const _format ); - - -#ifdef SX_CPP03_BOOST - -void print_value_type_value( std::ostream& _os, const value_type& _value ); - - -#endif - - -template< typename value > -void print_superfluous_parameters( std::ostream& _os, const value& _value ) -{ - _os << SUPERFLUOUS_PARAMETER_START; -#ifndef SX_CPP03_BOOST - stream_writer< value >::print( _os, _value ); -#else - print_value_type_value( _os, _value ); -#endif - _os << SUPERFLUOUS_PARAMETER_END; -} - - -#ifndef SX_CPP03_BOOST - - -template< typename value, typename ... args > -void print_superfluous_parameters( std::ostream& _os, - const value& _value, args ... _args ) -{ - _os << SUPERFLUOUS_PARAMETER_START; - stream_writer< value >::print( _os, _value ); - _os << SUPERFLUOUS_PARAMETER_END; - print_superfluous_parameters( _os, _args ... ); -} - - -#else - - -#endif - - -void sxprintf( std::ostream& _os, const char* _format ); - -#ifndef SX_CPP03_BOOST -template< typename value, typename ... args > -void sxprintf( std::ostream& _os, const char* _format, const value& _value, args ... _args ) -{ - while( *_format ) - { - if( PLACE_HOLDER == *_format ) - { - if( PLACE_HOLDER == *( _format + 1 ) ) - { - ++_format; // skip first place holder - _os << *_format++; // output of the second place holder - } - else - { - if( OPENING_SQUARE_BRACKET == *( _format + 1 ) ) - { - ++_format; - const sxe::format_settings format_settings = sxe::parse_format_string( &_format ); - const std::ios_base::fmtflags stream_flags = _os.flags(); - const char streafill_ = _os.fill(); - if( format_settings.correct_ ) - { - _os << format_settings; - stream_writer< value >::print( _os, _value ); - } - else - { - while( CLOSING_SQUARE_BRACKET != *( _format ) ) - { - ++_format; - } - stream_writer< value >::print( _os, _value ); - _os << format_settings; - } - _os.flags( stream_flags ); - _os.fill( streafill_ ); - } - else - { - stream_writer< value >::print( _os, _value ); - } - - sxprintf( _os, _format + 1, _args ... ); - return; - } - } - else - { - _os << *_format++; - } - } - - print_superfluous_parameters( _os, _value, _args ... ); -} - - -//!\brief Creates a formatted message. The format string can contain placeholders ('%'s) that will be replaced with -//!the parameters by this function. To emit a '%' use two percent signs ("%%"). -//!\param _format The format string in which will the placeholders will be replaced (if there are any). -//!\param _args The arguments that will replace the placeholders in the format string. The number of parameters in -//!_args has to be equal to the number of placeholders in the format string. If you pass too few or too many -//!arguments, the resulting string will contain diagnostics in the resulting string -//!([Missing parameter!] or [Superfluous parameter: x]). -//!\return String containing the complete formatted message. -template< typename ... args > -std::string sxprintf(const char* const _format, args ... _args) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _args ...); - return( target_string_stream.str() ); -} - -#else - -std::string sxprintf(const char* const _format); -std::string sxprintf(const char* const _format, const value_type& _value1); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, - const value_type& _value9); -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, - const value_type& _value9, const value_type& _value10); - - -void sxprintf(std::ostream& _os, const char* const _format); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7, const value_type& _value8); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7, const value_type& _value8, const value_type& _value9); -void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10); - - void sxprintf(std::ostream& _os, const char* const _format, const value_types& _values); - -#endif - - -} - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 +#define PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 + + +#include +#include + + +#ifdef SX_CPP03_BOOST + #include + #include +#endif + +#include "compatibility/compatibility.hpp" +#include "format_settings.hpp" + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST + typedef boost::variant< bool, int, unsigned int, sxe::int8_t, sxe::uint8_t, sxe::uint16_t, sxe::uint32_t, + std::string, std::size_t, const char*, boost::int_least64_t, double > value_type; + typedef std::vector< value_type > value_types; +#endif + + +extern const char PLACE_HOLDER; +extern const char* const SUPERFLUOUS_PARAMETER_START; +extern const char SUPERFLUOUS_PARAMETER_END; +extern const char OPENING_SQUARE_BRACKET; +extern const char CLOSING_SQUARE_BRACKET; + + +template< typename value > +struct stream_writer +{ + static void print( std::ostream& _os, const value& _value ) + { + _os << _value; + } +}; + + +template< > +struct stream_writer< sxe::uint8_t > +{ + static void print(std::ostream& _os, const sxe::uint8_t& _value) + { + _os << static_cast( _value ); + } +}; + + +// cppcheck-suppress unusedFunction +std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ); +sxe::format_settings parse_format_string( const char** const _format ); + + +#ifdef SX_CPP03_BOOST + +void print_value_type_value( std::ostream& _os, const value_type& _value ); + + +#endif + + +template< typename value > +void print_superfluous_parameters( std::ostream& _os, const value& _value ) +{ + _os << SUPERFLUOUS_PARAMETER_START; +#ifndef SX_CPP03_BOOST + stream_writer< value >::print( _os, _value ); +#else + print_value_type_value( _os, _value ); +#endif + _os << SUPERFLUOUS_PARAMETER_END; +} + + +#ifndef SX_CPP03_BOOST + + +template< typename value, typename ... args > +void print_superfluous_parameters( std::ostream& _os, + const value& _value, args ... _args ) +{ + _os << SUPERFLUOUS_PARAMETER_START; + stream_writer< value >::print( _os, _value ); + _os << SUPERFLUOUS_PARAMETER_END; + print_superfluous_parameters( _os, _args ... ); +} + + +#else + + +#endif + + +void sxprintf( std::ostream& _os, const char* _format ); + +#ifndef SX_CPP03_BOOST +template< typename value, typename ... args > +void sxprintf( std::ostream& _os, const char* _format, const value& _value, args ... _args ) +{ + while( *_format ) + { + if( PLACE_HOLDER == *_format ) + { + if( PLACE_HOLDER == *( _format + 1 ) ) + { + ++_format; // skip first place holder + _os << *_format++; // output of the second place holder + } + else + { + if( OPENING_SQUARE_BRACKET == *( _format + 1 ) ) + { + ++_format; + const sxe::format_settings format_settings = sxe::parse_format_string( &_format ); + const std::ios_base::fmtflags stream_flags = _os.flags(); + const char streafill_ = _os.fill(); + if( format_settings.correct_ ) + { + _os << format_settings; + stream_writer< value >::print( _os, _value ); + } + else + { + while( CLOSING_SQUARE_BRACKET != *( _format ) ) + { + ++_format; + } + stream_writer< value >::print( _os, _value ); + _os << format_settings; + } + _os.flags( stream_flags ); + _os.fill( streafill_ ); + } + else + { + stream_writer< value >::print( _os, _value ); + } + + sxprintf( _os, _format + 1, _args ... ); + return; + } + } + else + { + _os << *_format++; + } + } + + print_superfluous_parameters( _os, _value, _args ... ); +} + + +//!\brief Creates a formatted message. The format string can contain placeholders ('%'s) that will be replaced with +//!the parameters by this function. To emit a '%' use two percent signs ("%%"). +//!\param _format The format string in which will the placeholders will be replaced (if there are any). +//!\param _args The arguments that will replace the placeholders in the format string. The number of parameters in +//!_args has to be equal to the number of placeholders in the format string. If you pass too few or too many +//!arguments, the resulting string will contain diagnostics in the resulting string +//!([Missing parameter!] or [Superfluous parameter: x]). +//!\return String containing the complete formatted message. +template< typename ... args > +std::string sxprintf(const char* const _format, args ... _args) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _args ...); + return( target_string_stream.str() ); +} + +#else + +std::string sxprintf(const char* const _format); +std::string sxprintf(const char* const _format, const value_type& _value1); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9, const value_type& _value10); + + +void sxprintf(std::ostream& _os, const char* const _format); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10); + + void sxprintf(std::ostream& _os, const char* const _format, const value_types& _values); + +#endif + + +} + +#endif diff --git a/externals/essentials/include/essentials/uri.hpp b/externals/essentials/source/essentials/include/essentials/uri.hpp similarity index 96% rename from externals/essentials/include/essentials/uri.hpp rename to externals/essentials/source/essentials/include/essentials/uri.hpp index 5a0a0bb..0499a44 100644 --- a/externals/essentials/include/essentials/uri.hpp +++ b/externals/essentials/source/essentials/include/essentials/uri.hpp @@ -1,55 +1,55 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D -#define URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D - - -#include - -#include "essentials/compatibility/compatibility.hpp" - - -namespace sxe -{ - - -const char URI_DELIMITER = '/'; - - -class uri SX_FINAL -{ -public: - explicit uri( const std::string& _uri = "" ); - ~uri() SX_NOEXCEPT; - bool is_empty() const; - const std::string to_string() const; - const std::string& get_front() const; - const std::string& get_back(); - void push_front( const std::string& _segment ); - void push_back( const std::string& _segment ); - void pop_front(); - void pop_back(); - size_t size() const; - - -private: - const std::string build_uri() const; - void split_string_to_uri_segments( const std::string& _uri ); - - - std::deque< std::string > uri_; -}; - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D +#define URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D + + +#include + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sxe +{ + + +const char URI_DELIMITER = '/'; + + +class uri SX_FINAL +{ +public: + explicit uri( const std::string& _uri = "" ); + ~uri() SX_NOEXCEPT; + bool is_empty() const; + const std::string to_string() const; + const std::string& get_front() const; + const std::string& get_back(); + void push_front( const std::string& _segment ); + void push_back( const std::string& _segment ); + void pop_front(); + void pop_back(); + size_t size() const; + + +private: + const std::string build_uri() const; + void split_string_to_uri_segments( const std::string& _uri ); + + + std::deque< std::string > uri_; +}; + + +} + + +#endif diff --git a/externals/essentials/source/conversion.cpp b/externals/essentials/source/essentials/source/conversion.cpp similarity index 95% rename from externals/essentials/source/conversion.cpp rename to externals/essentials/source/essentials/source/conversion.cpp index 4e0ff74..ed91544 100644 --- a/externals/essentials/source/conversion.cpp +++ b/externals/essentials/source/essentials/source/conversion.cpp @@ -1,103 +1,103 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#include "essentials/conversion.hpp" - -#include -#include -#include - -#ifndef SX_CPP03_BOOST - #include -#else - #include -#endif - - -namespace sxe -{ - - -bool string_to_int( const char* const _int_as_string, int& _result ) -{ - bool success = false; - try - { -#ifndef SX_CPP03_BOOST - _result = std::stoi( std::string( _int_as_string ) ); - success = true; -#else - std::istringstream is( _int_as_string ); - if (is >> _result) - { - success = true; - } - else - { - success = false; - } -#endif - - } - catch ( const std::invalid_argument& ) - { - success = false; - } - catch ( const std::out_of_range& ) - { - success = false; - } - return( success ); -} - - -std::string to_string( const sxe::uint32_t _value ) -{ -#ifndef SX_CPP03_BOOST - return( std::to_string( _value ) ); -#else - std::ostringstream ostr; - ostr << _value; - return( ostr.str() ); -#endif -} - - -std::string to_string( const int _value ) -{ -#ifndef SX_CPP03_BOOST - return( std::to_string( _value ) ); -#else - std::ostringstream ostr; - ostr << _value; - return( ostr.str() ); -#endif -} - - -// cppcheck-suppress unusedFunction -std::string to_upper( const std::string& _value ) -{ - std::string value_caps = _value; - std::transform( value_caps.begin(), value_caps.end(), value_caps.begin(), static_cast< int( *)( int ) >( ::std::toupper ) ); - return( value_caps ); -} - - -// cppcheck-suppress unusedFunction -std::string to_lower( const std::string& _value ) -{ - std::string value_to_lower = _value; - std::transform( value_to_lower.begin(), value_to_lower.end(), value_to_lower.begin(), static_cast< int( *)( int ) >( ::std::tolower ) ); - return( value_to_lower ); -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/conversion.hpp" + +#include +#include +#include + +#ifndef SX_CPP03_BOOST + #include +#else + #include +#endif + + +namespace sxe +{ + + +bool string_to_int( const char* const _int_as_string, int& _result ) +{ + bool success = false; + try + { +#ifndef SX_CPP03_BOOST + _result = std::stoi( std::string( _int_as_string ) ); + success = true; +#else + std::istringstream is( _int_as_string ); + if (is >> _result) + { + success = true; + } + else + { + success = false; + } +#endif + + } + catch ( const std::invalid_argument& ) + { + success = false; + } + catch ( const std::out_of_range& ) + { + success = false; + } + return( success ); +} + + +std::string to_string( const sxe::uint32_t _value ) +{ +#ifndef SX_CPP03_BOOST + return( std::to_string( _value ) ); +#else + std::ostringstream ostr; + ostr << _value; + return( ostr.str() ); +#endif +} + + +std::string to_string( const int _value ) +{ +#ifndef SX_CPP03_BOOST + return( std::to_string( _value ) ); +#else + std::ostringstream ostr; + ostr << _value; + return( ostr.str() ); +#endif +} + + +// cppcheck-suppress unusedFunction +std::string to_upper( const std::string& _value ) +{ + std::string value_caps = _value; + std::transform( value_caps.begin(), value_caps.end(), value_caps.begin(), static_cast< int( *)( int ) >( ::std::toupper ) ); + return( value_caps ); +} + + +// cppcheck-suppress unusedFunction +std::string to_lower( const std::string& _value ) +{ + std::string value_to_lower = _value; + std::transform( value_to_lower.begin(), value_to_lower.end(), value_to_lower.begin(), static_cast< int( *)( int ) >( ::std::tolower ) ); + return( value_to_lower ); +} + + +} diff --git a/externals/essentials/source/essentials_version.cpp b/externals/essentials/source/essentials/source/essentials_version.cpp similarity index 93% rename from externals/essentials/source/essentials_version.cpp rename to externals/essentials/source/essentials/source/essentials_version.cpp index ad5323b..7279071 100644 --- a/externals/essentials/source/essentials_version.cpp +++ b/externals/essentials/source/essentials/source/essentials_version.cpp @@ -1,74 +1,74 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "essentials/essentials_version.hpp" - -#include - -#include "essentials/compatibility/compatibility.hpp" -#include "essentials/build_number.hpp" -#include "essentials/sxprintf.hpp" - - -namespace sxe -{ - - -namespace version -{ - - -namespace -{ - - -const sxe::uint16_t VERSION_MAJOR( 1 ); -const sxe::uint16_t VERSION_MINOR( 3 ); -const sxe::uint16_t VERSION_PATCH( 1 ); - - -} - - -// cppcheck-suppress unusedFunction -void log_version() -{ - std::cout << sxe::sxprintf( "essentials library version %.%.%.%.", get_major_version(), - get_minor_version(), get_patch_version(), get_build_number() ) << std::endl; -} - - -sxe::uint16_t get_major_version() -{ - return( VERSION_MAJOR ); -} - - -sxe::uint16_t get_minor_version() -{ - return( VERSION_MINOR ); -} - - -sxe::uint16_t get_patch_version() -{ - return( VERSION_PATCH ); -} - - -sxe::uint16_t get_build_number() -{ - return( BUILD_NUMBER ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "essentials/essentials_version.hpp" + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/build_number.hpp" +#include "essentials/sxprintf.hpp" + + +namespace sxe +{ + + +namespace version +{ + + +namespace +{ + + +const sxe::uint16_t VERSION_MAJOR( 1 ); +const sxe::uint16_t VERSION_MINOR( 3 ); +const sxe::uint16_t VERSION_PATCH( 2 ); + + +} + + +// cppcheck-suppress unusedFunction +void log_version() +{ + std::cout << sxe::sxprintf( "essentials library version %.%.%.%.", get_major_version(), + get_minor_version(), get_patch_version(), get_build_number() ) << std::endl; +} + + +sxe::uint16_t get_major_version() +{ + return( VERSION_MAJOR ); +} + + +sxe::uint16_t get_minor_version() +{ + return( VERSION_MINOR ); +} + + +sxe::uint16_t get_patch_version() +{ + return( VERSION_PATCH ); +} + + +sxe::uint16_t get_build_number() +{ + return( BUILD_NUMBER ); +} + + +} + + +} diff --git a/externals/essentials/source/format_settings.cpp b/externals/essentials/source/essentials/source/format_settings.cpp similarity index 97% rename from externals/essentials/source/format_settings.cpp rename to externals/essentials/source/essentials/source/format_settings.cpp index 768379a..0417c8a 100644 --- a/externals/essentials/source/format_settings.cpp +++ b/externals/essentials/source/essentials/source/format_settings.cpp @@ -1,32 +1,32 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "essentials/format_settings.hpp" - - -namespace sxe -{ - - -format_settings::format_settings(): - format_string_(), - missing_closing_bracket_( false ), - correct_( false ), - hex_( false ), - pad_zeros_( false ), - places_set_( false ), - places_( 0 ), - decimal_places_set_( false ), - decimal_places_( 0 ) -{ - // Nothing to do... -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "essentials/format_settings.hpp" + + +namespace sxe +{ + + +format_settings::format_settings(): + format_string_(), + missing_closing_bracket_( false ), + correct_( false ), + hex_( false ), + pad_zeros_( false ), + places_set_( false ), + places_( 0 ), + decimal_places_set_( false ), + decimal_places_( 0 ) +{ + // Nothing to do... +} + + +} diff --git a/externals/essentials/source/sxprintf.cpp b/externals/essentials/source/essentials/source/sxprintf.cpp similarity index 96% rename from externals/essentials/source/sxprintf.cpp rename to externals/essentials/source/essentials/source/sxprintf.cpp index f3794a1..99844aa 100644 --- a/externals/essentials/source/sxprintf.cpp +++ b/externals/essentials/source/essentials/source/sxprintf.cpp @@ -1,628 +1,628 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#include "essentials/sxprintf.hpp" - -#include - -#include "essentials/base.hpp" -#include "essentials/conversion.hpp" - - -namespace sxe -{ - - -namespace -{ - - - const char MISSING_PARAMETERS_MESSAGE[] = "[Missing parameter!]"; - const char MISSING_TERMINATOR[] = "[Missing output modifier terminator!]"; - const char ILLEGAL_MODIFIER[] = "[Illegal output modifier!]"; - const char POINT = '.'; - const char ZERO = '0'; - const char X = 'x'; - const char CAPS_X = 'X'; - - -} - - -const char PLACE_HOLDER = '%'; -const char* const SUPERFLUOUS_PARAMETER_START = "[Superfluous parameter: "; -const char SUPERFLUOUS_PARAMETER_END = ']'; -const char OPENING_SQUARE_BRACKET = '['; -const char CLOSING_SQUARE_BRACKET = ']'; - - -// cppcheck-suppress unusedFunction -std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ) -{ - if( !_format.correct_ ) - { - _os << ILLEGAL_MODIFIER; - } - else if( _format.missing_closing_bracket_ ) - { - _os << MISSING_TERMINATOR; - } - else - { - if( _format.hex_ ) - { - _os << std::hex; - _os << std::showbase; - _os.fill( '0' ); - } - else - { - if( _format.pad_zeros_ ) - { - _os.fill( '0' ); - } - - if( _format.places_set_ ) - { - _os.width( _format.places_ ); - } - - if( _format.decimal_places_set_ ) - { - _os.precision( _format.decimal_places_ ); - } - } - } - - return( _os ); -} - - -bool is_allowed_char( const char _char ) -{ - const bool success = ( std::isdigit( _char ) || ( X == _char ) || ( CAPS_X == _char ) ); - return( success ); -} - - -sxe::format_settings parse_format_string( const char** const _format ) -{ - sxe::format_settings format_settings; - format_settings.correct_ = true; - SX_ASSERT( ( OPENING_SQUARE_BRACKET == **_format ), "Format string to parse doesn't start with [." ); - ++*_format; - format_settings.missing_closing_bracket_ = true; - bool point_found = false; - const char* text_before_point = *_format; - std::size_t text_before_point_size = 0; - const char* text_after_point = SX_NULLPTR; - std::size_t text_after_point_size = 0; - while( **_format ) - { - if( CLOSING_SQUARE_BRACKET == **_format ) - { - format_settings.missing_closing_bracket_ = false; - break; - } - else - if( POINT == **_format ) - { - if( point_found ) - { - format_settings.correct_ = false; - break; - } - else - { - point_found = true; - text_after_point = ( *_format ) + 1; - text_after_point_size = 0; - } - } - else - { - const char _text_char = **_format; - if( is_allowed_char( _text_char ) ) - { - if( point_found ) - { - ++text_after_point_size; - } - else - { - ++text_before_point_size; - } - } - else - { - format_settings.correct_ = false; - break; - } - } - - ++( *_format ); - } - - SX_ASSERT( text_before_point, "Logic error parsing format string!" ); - if( ( 0 == text_before_point_size ) && ( 0 == text_after_point_size ) ) - { - format_settings.correct_ = false; - } - - if( ( !format_settings.missing_closing_bracket_ ) && format_settings.correct_ ) - { - if( ( 0 < text_before_point_size ) && ( ( X == text_before_point[ 0 ] ) || ( CAPS_X == text_before_point[ 0 ] ) ) ) - { - format_settings.hex_ = true; - ++text_before_point; - --text_before_point_size; - } - - if( ( 0 < text_before_point_size ) && ( ZERO == text_before_point[ 0 ] ) ) - { - format_settings.pad_zeros_ = true; - ++text_before_point; - --text_before_point_size; - } - - if( 0 < text_before_point_size ) - { - format_settings.places_set_ = true; - if( !string_to_int( text_before_point, format_settings.places_ ) ) - { - format_settings.correct_ = false; - } - } - - if( 0 < text_after_point_size ) - { - SX_ASSERT( text_after_point, "Logic error parsing format string!" ); - format_settings.decimal_places_set_ = true; - if( !string_to_int( text_after_point, format_settings.decimal_places_ ) ) - { - format_settings.correct_ = false; - } - } - } - - return( format_settings ); -} - - -#ifdef SX_CPP03_BOOST - - -void print_superfluous_parameters( std::ostream& _os, const value_types& _values, value_types::const_iterator& _position ) -{ - while( _position != _values.end() ) - { - print_superfluous_parameters( _os, *_position ); - ++_position; - } -} - - -#endif - - -void sxprintf( std::ostream& _os, const char* _format ) -{ - while( *_format ) - { - if( PLACE_HOLDER == *_format ) - { - if( PLACE_HOLDER == *( _format + 1 ) ) - { - ++_format; - } - else - { - _os << MISSING_PARAMETERS_MESSAGE; - } - } - _os << *_format++; - } -} - - -#ifdef SX_CPP03_BOOST - - -std::string sxprintf(const char* const _format) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, - const value_type& _value9) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9); - return( target_string_stream.str() ); -} - - -std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, - const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, - const value_type& _value9, const value_type& _value10) -{ - std::stringstream target_string_stream; - sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10); - return( target_string_stream.str() ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1 ) -{ - value_types values; - values.push_back( _value1 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - values.push_back( _value4 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - values.push_back( _value4 ); - values.push_back( _value5 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - values.push_back( _value4 ); - values.push_back( _value5 ); - values.push_back( _value6 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - values.push_back( _value4 ); - values.push_back( _value5 ); - values.push_back( _value6 ); - values.push_back( _value7 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7, const value_type& _value8 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - values.push_back( _value4 ); - values.push_back( _value5 ); - values.push_back( _value6 ); - values.push_back( _value7 ); - values.push_back( _value8 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7, const value_type& _value8, const value_type& _value9 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - values.push_back( _value4 ); - values.push_back( _value5 ); - values.push_back( _value6 ); - values.push_back( _value7 ); - values.push_back( _value8 ); - values.push_back( _value9 ); - sxprintf( _os, _format, values ); -} - - -void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, - const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, - const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10 ) -{ - value_types values; - values.push_back( _value1 ); - values.push_back( _value2 ); - values.push_back( _value3 ); - values.push_back( _value4 ); - values.push_back( _value5 ); - values.push_back( _value6 ); - values.push_back( _value7 ); - values.push_back( _value8 ); - values.push_back( _value9 ); - values.push_back( _value10 ); - sxprintf( _os, _format, values ); -} - - -const char* sxprintf_impl( std::ostream& _os, const char* _format, value_types::const_iterator& _position, - const value_types::const_iterator _end, bool& printed ) -{ - while (*_format) - { - if (PLACE_HOLDER == *_format) - { - if (PLACE_HOLDER == *( _format + 1 )) - { - ++_format; // skip first place holder - _os << *_format++; // output of the second place holder - } - else - { - if (OPENING_SQUARE_BRACKET == *( _format + 1 )) - { - ++_format; - const sxe::format_settings format_settings = sxe::parse_format_string(&_format); - const std::ios_base::fmtflags stream_flags = _os.flags(); - const char streafill_ = _os.fill(); - _os << format_settings; - print_value_type_value( _os, *_position ); - _os.flags(stream_flags); - _os.fill(streafill_); - printed = true; - if( !format_settings.missing_closing_bracket_ ) - { - if( CLOSING_SQUARE_BRACKET == *( _format ) ) - { - ++_format; - } - } - else - { - if( !format_settings.correct_ ) - { - ++_format; - } - } - } - else - { - print_value_type_value( _os, *_position ); - printed = true; - ++_format; - break; - } - - if( _position + 1 != _end ) - { - if( *_format != '\0' ) - { - ++_position; - _format = sxprintf_impl( _os, _format, _position, _end, printed ); - } - } - return( _format ); - } - } - else - { - _os << *_format++; - } - } - return ( _format ); -} - - -void sxprintf( std::ostream& _os, const char * const _format, const value_types& _values ) -{ - SX_ASSERT( _format, "No format string to parse was passed!" ); - const char* current_position = _format; - - value_types::const_iterator _end = _values.end(); - value_types::const_iterator _position = _values.begin(); - while( _position != _end ) - { - bool printed = false; - current_position = sxprintf_impl( _os, current_position, _position, _end, printed ); - if( printed ) - { - ++_position; - } - if( current_position[0] == '\0' ) - { - break; - } - } - - sxprintf( _os, current_position ); - - if( _position != _end ) - { - print_superfluous_parameters( _os, _values, _position ); - } -} - - -void print_value_type_value( std::ostream& _os, const value_type& _value ) -{ - const std::type_info& type_info = _value.type(); - - if( type_info == typeid ( bool ) ) - { - stream_writer< bool >::print( _os, boost::get< bool >( _value ) ); - } - else if( type_info == typeid ( int ) ) - { - stream_writer< int >::print( _os, boost::get< int >( _value ) ); - } - else if( type_info == typeid ( unsigned int ) ) - { - stream_writer< unsigned int >::print( _os, boost::get< unsigned int >( _value ) ); - } - else if( type_info == typeid ( sxe::int8_t ) ) - { - stream_writer< sxe::int8_t >::print( _os, boost::get< sxe::int8_t >( _value ) ); - } - else if (type_info == typeid ( sxe::uint8_t )) - { - stream_writer< sxe::uint8_t >::print(_os, boost::get< sxe::uint8_t >(_value)); - } - else if( type_info == typeid ( sxe::uint16_t ) ) - { - stream_writer< sxe::uint16_t >::print( _os, boost::get< sxe::uint16_t >( _value ) ); - } - else if( type_info == typeid ( sxe::uint32_t ) ) - { - stream_writer< sxe::uint32_t >::print( _os, boost::get< sxe::uint32_t >( _value ) ); - } - else if( type_info == typeid ( std::string ) ) - { - stream_writer< std::string >::print( _os, boost::get< std::string >( _value ) ); - } - else if( type_info == typeid ( std::size_t ) ) - { - stream_writer< std::size_t >::print( _os, boost::get< std::size_t >( _value ) ); - } - else if( type_info == typeid ( const char* ) ) - { - stream_writer< const char* >::print( _os, boost::get< const char* >( _value ) ); - } - else if( type_info == typeid ( boost::int_least64_t ) ) - { - stream_writer< boost::int_least64_t >::print( _os, boost::get< boost::int_least64_t >( _value ) ); - } - else if( type_info == typeid ( double ) ) - { - stream_writer< double >::print( _os, boost::get< double >( _value ) ); - } -} - - -#endif - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/sxprintf.hpp" + +#include + +#include "essentials/base.hpp" +#include "essentials/conversion.hpp" + + +namespace sxe +{ + + +namespace +{ + + + const char MISSING_PARAMETERS_MESSAGE[] = "[Missing parameter!]"; + const char MISSING_TERMINATOR[] = "[Missing output modifier terminator!]"; + const char ILLEGAL_MODIFIER[] = "[Illegal output modifier!]"; + const char POINT = '.'; + const char ZERO = '0'; + const char X = 'x'; + const char CAPS_X = 'X'; + + +} + + +const char PLACE_HOLDER = '%'; +const char* const SUPERFLUOUS_PARAMETER_START = "[Superfluous parameter: "; +const char SUPERFLUOUS_PARAMETER_END = ']'; +const char OPENING_SQUARE_BRACKET = '['; +const char CLOSING_SQUARE_BRACKET = ']'; + + +// cppcheck-suppress unusedFunction +std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ) +{ + if( !_format.correct_ ) + { + _os << ILLEGAL_MODIFIER; + } + else if( _format.missing_closing_bracket_ ) + { + _os << MISSING_TERMINATOR; + } + else + { + if( _format.hex_ ) + { + _os << std::hex; + _os << std::showbase; + _os.fill( '0' ); + } + else + { + if( _format.pad_zeros_ ) + { + _os.fill( '0' ); + } + + if( _format.places_set_ ) + { + _os.width( _format.places_ ); + } + + if( _format.decimal_places_set_ ) + { + _os.precision( _format.decimal_places_ ); + } + } + } + + return( _os ); +} + + +bool is_allowed_char( const char _char ) +{ + const bool success = ( std::isdigit( _char ) || ( X == _char ) || ( CAPS_X == _char ) ); + return( success ); +} + + +sxe::format_settings parse_format_string( const char** const _format ) +{ + sxe::format_settings format_settings; + format_settings.correct_ = true; + SX_ASSERT( ( OPENING_SQUARE_BRACKET == **_format ), "Format string to parse doesn't start with [." ); + ++*_format; + format_settings.missing_closing_bracket_ = true; + bool point_found = false; + const char* text_before_point = *_format; + std::size_t text_before_point_size = 0; + const char* text_after_point = SX_NULLPTR; + std::size_t text_after_point_size = 0; + while( **_format ) + { + if( CLOSING_SQUARE_BRACKET == **_format ) + { + format_settings.missing_closing_bracket_ = false; + break; + } + else + if( POINT == **_format ) + { + if( point_found ) + { + format_settings.correct_ = false; + break; + } + else + { + point_found = true; + text_after_point = ( *_format ) + 1; + text_after_point_size = 0; + } + } + else + { + const char _text_char = **_format; + if( is_allowed_char( _text_char ) ) + { + if( point_found ) + { + ++text_after_point_size; + } + else + { + ++text_before_point_size; + } + } + else + { + format_settings.correct_ = false; + break; + } + } + + ++( *_format ); + } + + SX_ASSERT( text_before_point, "Logic error parsing format string!" ); + if( ( 0 == text_before_point_size ) && ( 0 == text_after_point_size ) ) + { + format_settings.correct_ = false; + } + + if( ( !format_settings.missing_closing_bracket_ ) && format_settings.correct_ ) + { + if( ( 0 < text_before_point_size ) && ( ( X == text_before_point[ 0 ] ) || ( CAPS_X == text_before_point[ 0 ] ) ) ) + { + format_settings.hex_ = true; + ++text_before_point; + --text_before_point_size; + } + + if( ( 0 < text_before_point_size ) && ( ZERO == text_before_point[ 0 ] ) ) + { + format_settings.pad_zeros_ = true; + ++text_before_point; + --text_before_point_size; + } + + if( 0 < text_before_point_size ) + { + format_settings.places_set_ = true; + if( !string_to_int( text_before_point, format_settings.places_ ) ) + { + format_settings.correct_ = false; + } + } + + if( 0 < text_after_point_size ) + { + SX_ASSERT( text_after_point, "Logic error parsing format string!" ); + format_settings.decimal_places_set_ = true; + if( !string_to_int( text_after_point, format_settings.decimal_places_ ) ) + { + format_settings.correct_ = false; + } + } + } + + return( format_settings ); +} + + +#ifdef SX_CPP03_BOOST + + +void print_superfluous_parameters( std::ostream& _os, const value_types& _values, value_types::const_iterator& _position ) +{ + while( _position != _values.end() ) + { + print_superfluous_parameters( _os, *_position ); + ++_position; + } +} + + +#endif + + +void sxprintf( std::ostream& _os, const char* _format ) +{ + while( *_format ) + { + if( PLACE_HOLDER == *_format ) + { + if( PLACE_HOLDER == *( _format + 1 ) ) + { + ++_format; + } + else + { + _os << MISSING_PARAMETERS_MESSAGE; + } + } + _os << *_format++; + } +} + + +#ifdef SX_CPP03_BOOST + + +std::string sxprintf(const char* const _format) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9, const value_type& _value10) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10); + return( target_string_stream.str() ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1 ) +{ + value_types values; + values.push_back( _value1 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + values.push_back( _value9 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + values.push_back( _value9 ); + values.push_back( _value10 ); + sxprintf( _os, _format, values ); +} + + +const char* sxprintf_impl( std::ostream& _os, const char* _format, value_types::const_iterator& _position, + const value_types::const_iterator _end, bool& printed ) +{ + while (*_format) + { + if (PLACE_HOLDER == *_format) + { + if (PLACE_HOLDER == *( _format + 1 )) + { + ++_format; // skip first place holder + _os << *_format++; // output of the second place holder + } + else + { + if (OPENING_SQUARE_BRACKET == *( _format + 1 )) + { + ++_format; + const sxe::format_settings format_settings = sxe::parse_format_string(&_format); + const std::ios_base::fmtflags stream_flags = _os.flags(); + const char streafill_ = _os.fill(); + _os << format_settings; + print_value_type_value( _os, *_position ); + _os.flags(stream_flags); + _os.fill(streafill_); + printed = true; + if( !format_settings.missing_closing_bracket_ ) + { + if( CLOSING_SQUARE_BRACKET == *( _format ) ) + { + ++_format; + } + } + else + { + if( !format_settings.correct_ ) + { + ++_format; + } + } + } + else + { + print_value_type_value( _os, *_position ); + printed = true; + ++_format; + break; + } + + if( _position + 1 != _end ) + { + if( *_format != '\0' ) + { + ++_position; + _format = sxprintf_impl( _os, _format, _position, _end, printed ); + } + } + return( _format ); + } + } + else + { + _os << *_format++; + } + } + return ( _format ); +} + + +void sxprintf( std::ostream& _os, const char * const _format, const value_types& _values ) +{ + SX_ASSERT( _format, "No format string to parse was passed!" ); + const char* current_position = _format; + + value_types::const_iterator _end = _values.end(); + value_types::const_iterator _position = _values.begin(); + while( _position != _end ) + { + bool printed = false; + current_position = sxprintf_impl( _os, current_position, _position, _end, printed ); + if( printed ) + { + ++_position; + } + if( current_position[0] == '\0' ) + { + break; + } + } + + sxprintf( _os, current_position ); + + if( _position != _end ) + { + print_superfluous_parameters( _os, _values, _position ); + } +} + + +void print_value_type_value( std::ostream& _os, const value_type& _value ) +{ + const std::type_info& type_info = _value.type(); + + if( type_info == typeid ( bool ) ) + { + stream_writer< bool >::print( _os, boost::get< bool >( _value ) ); + } + else if( type_info == typeid ( int ) ) + { + stream_writer< int >::print( _os, boost::get< int >( _value ) ); + } + else if( type_info == typeid ( unsigned int ) ) + { + stream_writer< unsigned int >::print( _os, boost::get< unsigned int >( _value ) ); + } + else if( type_info == typeid ( sxe::int8_t ) ) + { + stream_writer< sxe::int8_t >::print( _os, boost::get< sxe::int8_t >( _value ) ); + } + else if (type_info == typeid ( sxe::uint8_t )) + { + stream_writer< sxe::uint8_t >::print(_os, boost::get< sxe::uint8_t >(_value)); + } + else if( type_info == typeid ( sxe::uint16_t ) ) + { + stream_writer< sxe::uint16_t >::print( _os, boost::get< sxe::uint16_t >( _value ) ); + } + else if( type_info == typeid ( sxe::uint32_t ) ) + { + stream_writer< sxe::uint32_t >::print( _os, boost::get< sxe::uint32_t >( _value ) ); + } + else if( type_info == typeid ( std::string ) ) + { + stream_writer< std::string >::print( _os, boost::get< std::string >( _value ) ); + } + else if( type_info == typeid ( std::size_t ) ) + { + stream_writer< std::size_t >::print( _os, boost::get< std::size_t >( _value ) ); + } + else if( type_info == typeid ( const char* ) ) + { + stream_writer< const char* >::print( _os, boost::get< const char* >( _value ) ); + } + else if( type_info == typeid ( boost::int_least64_t ) ) + { + stream_writer< boost::int_least64_t >::print( _os, boost::get< boost::int_least64_t >( _value ) ); + } + else if( type_info == typeid ( double ) ) + { + stream_writer< double >::print( _os, boost::get< double >( _value ) ); + } +} + + +#endif + + +} diff --git a/externals/essentials/source/uri.cpp b/externals/essentials/source/essentials/source/uri.cpp similarity index 95% rename from externals/essentials/source/uri.cpp rename to externals/essentials/source/essentials/source/uri.cpp index 9926a9a..1460efb 100644 --- a/externals/essentials/source/uri.cpp +++ b/externals/essentials/source/essentials/source/uri.cpp @@ -1,136 +1,136 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex essentials library (http://essentials.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://essentials.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#include "essentials/uri.hpp" - -#include -#include - -#include "essentials/base.hpp" - - -namespace sxe -{ - - -uri::uri( const std::string& _uri ) - : uri_() -{ - split_string_to_uri_segments( _uri ); -} - - -uri::~uri() SX_NOEXCEPT -{ - // Nothing to do... -} - - -bool uri::is_empty() const -{ - return( uri_.empty() ); -} - - -const std::string uri::to_string() const -{ - return( build_uri() ); -} - - -const std::string& uri::get_front() const -{ - SX_ASSERT( !uri_.empty(), "Uri is empty!" ); - return( uri_.front() ); -} - - -const std::string& uri::get_back() -{ - SX_ASSERT( !uri_.empty(), "Uri is empty!" ); - return( uri_.back() ); -} - - -void uri::push_front( const std::string& _segment ) -{ - uri_.push_front( _segment ); -} - - -void uri::push_back( const std::string& _segment ) -{ - uri_.push_back( _segment ); -} - - -void uri::pop_front() -{ - SX_ASSERT( !uri_.empty(), "Uri is empty!" ); - uri_.pop_front(); -} - - -void uri::pop_back() -{ - SX_ASSERT( !uri_.empty(), "Uri is empty!" ); - uri_.pop_back(); -} - - -size_t uri::size() const -{ - return( uri_.size() ); -} - - -const std::string uri::build_uri() const -{ - std::stringstream uri; - - SX_FOR( const std::string& uri_element, uri_ ) - { - uri << URI_DELIMITER << uri_element; - } - - return( uri.str() ); -} - - -void uri::split_string_to_uri_segments( const std::string& _uri ) -{ - std::string uri = _uri; - if( !_uri.empty() ) - { - if( URI_DELIMITER == _uri[ 0 ] ) - { - uri = _uri.substr( 1 ); - } - - std::string::size_type start = 0; - std::string::size_type end = uri.find( URI_DELIMITER ); - while( end != std::string::npos ) - { - const std::string& segment = uri.substr( start, end - start ); - uri_.push_back( segment ); - start = ++end; - end = uri.find( URI_DELIMITER, end ); - } - - const std::string& last_segment = uri.substr( start ); - if( last_segment[ 0 ] != URI_DELIMITER ) - { - uri_.push_back( last_segment ); - } - } -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/uri.hpp" + +#include +#include + +#include "essentials/base.hpp" + + +namespace sxe +{ + + +uri::uri( const std::string& _uri ) + : uri_() +{ + split_string_to_uri_segments( _uri ); +} + + +uri::~uri() SX_NOEXCEPT +{ + // Nothing to do... +} + + +bool uri::is_empty() const +{ + return( uri_.empty() ); +} + + +const std::string uri::to_string() const +{ + return( build_uri() ); +} + + +const std::string& uri::get_front() const +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + return( uri_.front() ); +} + + +const std::string& uri::get_back() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + return( uri_.back() ); +} + + +void uri::push_front( const std::string& _segment ) +{ + uri_.push_front( _segment ); +} + + +void uri::push_back( const std::string& _segment ) +{ + uri_.push_back( _segment ); +} + + +void uri::pop_front() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + uri_.pop_front(); +} + + +void uri::pop_back() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + uri_.pop_back(); +} + + +size_t uri::size() const +{ + return( uri_.size() ); +} + + +const std::string uri::build_uri() const +{ + std::stringstream uri; + + SX_FOR( const std::string& uri_element, uri_ ) + { + uri << URI_DELIMITER << uri_element; + } + + return( uri.str() ); +} + + +void uri::split_string_to_uri_segments( const std::string& _uri ) +{ + std::string uri = _uri; + if( !_uri.empty() ) + { + if( URI_DELIMITER == _uri[ 0 ] ) + { + uri = _uri.substr( 1 ); + } + + std::string::size_type start = 0; + std::string::size_type end = uri.find( URI_DELIMITER ); + while( end != std::string::npos ) + { + const std::string& segment = uri.substr( start, end - start ); + uri_.push_back( segment ); + start = ++end; + end = uri.find( URI_DELIMITER, end ); + } + + const std::string& last_segment = uri.substr( start ); + if( last_segment[ 0 ] != URI_DELIMITER ) + { + uri_.push_back( last_segment ); + } + } +} + + +} diff --git a/externals/genesis/CMakeLists.txt b/externals/genesis/CMakeLists.txt new file mode 100644 index 0000000..22e3cd6 --- /dev/null +++ b/externals/genesis/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8) + +project(genesis) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +add_subdirectory(source) diff --git a/externals/genesis/changelog.txt b/externals/genesis/changelog.txt new file mode 100644 index 0000000..8a07204 --- /dev/null +++ b/externals/genesis/changelog.txt @@ -0,0 +1,16 @@ +# Change log +All notable changes to this project are documented in this file. + +##[0.2.0] - 2017-09-20 + +### Added +• Support for Visual Studio 2017 builds + +### Changed +• rename: condition_block's private method check_modifier to apply_modifier +• method create_child of the class recipe_block is now pro + + +##[0.1.0] - 2017-04-21 + +• The very first release version of genesis diff --git a/genesis/license/genesis_Anhang_Appendix_20170406.pdf b/externals/genesis/license/genesis_Anhang_Appendix_20170406.pdf similarity index 100% rename from genesis/license/genesis_Anhang_Appendix_20170406.pdf rename to externals/genesis/license/genesis_Anhang_Appendix_20170406.pdf diff --git a/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf b/externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf similarity index 100% rename from genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf rename to externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf diff --git a/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf b/externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf similarity index 100% rename from genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf rename to externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf diff --git a/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406.pdf b/externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406.pdf similarity index 100% rename from genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406.pdf rename to externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406.pdf diff --git a/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf b/externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf similarity index 100% rename from genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf rename to externals/genesis/license/genesis_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf diff --git a/externals/genesis/source/CMakeHelpers/addBoost.cmake b/externals/genesis/source/CMakeHelpers/addBoost.cmake new file mode 100644 index 0000000..d833dc1 --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/addBoost.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(Y_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${Y_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${Y_BOOST_LIB_INCLUDE}) + set(SX_BOOST_LIB_PATH ${Y_BOOST_LIB_PATH}) + set(SX_BOOST_LIB_INCLUDE ${Y_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("Y_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") +elseif(SX_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${SX_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${SX_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("SX_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + +else() + message("SX_BOOST_LIB_INCLUDE is not set by user. Searching for boost libraries.") + set(Boost_USE_MULTITHREADED ON) + find_package(Boost COMPONENTS date_time filesystem system program_options chrono thread random unit_test_framework) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + message("Boost found.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + else() + message(STATUS "Boost libraries not found!") + endif() +endif() diff --git a/externals/genesis/source/CMakeHelpers/addSeadexOptions.cmake b/externals/genesis/source/CMakeHelpers/addSeadexOptions.cmake new file mode 100644 index 0000000..48bd9c6 --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/addSeadexOptions.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +# Seadex preprocessor definitions + + +option("SX_NO_LOGGING" "Use when you want to use no logging at all (no logging code is created).") +if( "${SX_NO_LOGGING}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_LOGGING\"") + message(STATUS "No logging used.") +else() + message(STATUS "Logger is used.") +endif() + + +option("SX_NO_STD_MAKE_UNIQUE" "When the standard make_unique is not available (e.g. no C++14 support), you have to define this preprocessor definition. A yasmine drop-in replacement template will be used instead then.") +if( "${SX_NO_STD_MAKE_UNIQUE}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_STD_MAKE_UNIQUE\"") + message(STATUS "SX_NO_STD_MAKE_UNIQUE is defined.") +endif() + + +option("SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG" "Sets to use a workaround for bug in GCC with expansion of template parameter pack that appears in a lambda-expression (bug reported for GCC 4.8.4)") +if( "${SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG}" ) + set(extra_flags "${extra_flags} -D \"SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG\"") + message(STATUS "SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG is defined.") +endif() \ No newline at end of file diff --git a/externals/genesis/source/CMakeHelpers/addSpecificFlags.cmake b/externals/genesis/source/CMakeHelpers/addSpecificFlags.cmake new file mode 100644 index 0000000..b568fbb --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/addSpecificFlags.cmake @@ -0,0 +1,112 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +add_compiler_flag("-Wall") + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +#gcc/clang compiler flags + if(NOT "SX_PEDANTIC" STREQUAL "OFF") + add_compiler_flag("-pedantic") + endif() + + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + add_compiler_flag("-g") + endif() + + if("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++03") + add_compiler_flag("-D \"SX_CPP03_BOOST\"") + add_compiler_flag("-D \"SX_NO_VARIADIC_MACRO\"") + elseif("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++14") + else() + add_compiler_flag("-std=c++11") + add_compiler_flag("-D \"SX_NO_STD_MAKE_UNIQUE\"") + endif() + +# platform + if( "${CMAKE_CXX_FLAGS}" STREQUAL "-m64" ) + add_compiler_flag("-m64") + message(STATUS "setting platform x64") + elseif("${CMAKE_CXX_FLAGS}" STREQUAL "-m32") + add_compiler_flag("-m32") + message(STATUS "setting platform x86") + endif() +endif() + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # Checks buffer security. + set(extra_flags "${extra_flags} /GS") + + #Sets output warning level. + set(extra_flags "${extra_flags} /W4") + + #Disable specific Warnings. + set(extra_flags "${extra_flags} /wd\"4127\" /wd\"4250\"") + + #Defines constants and macros. + set(extra_flags "${extra_flags} /D \"_CRT_SECURE_NO_WARNINGS\"") + + #Enables function-level linking. + set(extra_flags "${extra_flags} /Gy") + + #Specifies standard behaviour under /Ze. + set(extra_flags "${extra_flags} /Zc:wchar_t /Zc:inline") + + #Disable minimal rebuild. + set(extra_flags "${extra_flags} /Gm-") + + #Enables additional security features and warnings. + set(extra_flags "${extra_flags} /sdl") + + #Specifies floating-point behaviour. + set(extra_flags "${extra_flags} /fp:precise") + + #Multibyte character sets macro. + set(extra_flags "${extra_flags} /D \"_MBCS\"") + + #Enables you to provide internal compiler error (ICE) information directly to the Visual C++ team. + set(extra_flags "${extra_flags} /errorReport:prompt") + + #Treats warnings as errors. + if( "${MSVC_VERSION}" STRGREATER "1800" ) + set(extra_flags "${extra_flags} /WX") + #else( "${MSVC_VERSION}" STRLESS "1900" ) + else() + set(extra_flags "${extra_flags} /WX-") + endif() + + + #Generates intrinsic functions. + set(extra_flags "${extra_flags} /Oi") + + #Specifies the model of exception handling. + set(extra_flags "${extra_flags} /EHsc") + + #Creates an object file. + set(extra_flags "${extra_flags} /Fo") + + #Marks an executable as verified to be compatible with the Windows Data Execution Prevention feature. + #set(extra_flags "${extra_flags} /NXCOMPAT") + + + # for release + if( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" ) + #Creates fast code. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /PDB-") + + #Controls LINK optimizations. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /OPT:REF /OPT:ICF") + + # for debug + elseif( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) + #Creates a program database (PDB) file. + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /PDB") + endif() + +endif() \ No newline at end of file diff --git a/externals/genesis/source/CMakeHelpers/addYasmineOptions.cmake b/externals/genesis/source/CMakeHelpers/addYasmineOptions.cmake new file mode 100644 index 0000000..7964d92 --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/addYasmineOptions.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +include("${CMAKE_CURRENT_LIST_DIR}/addSeadexOptions.cmake") + +# yasmine's preprocessor definitions + + +set(Y_OPTIMIZE "SPEED" CACHE STRING "Sets the optimize type. Supported values: SPEED and SIZE. Default value is SPEED.") +if( "${Y_OPTIMIZE}" STREQUAL "SIZE" ) + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SIZE\"") + message(STATUS "Optimizing for size.") +else() + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SPEED\"") + message(STATUS "Optimizing for speed.") +endif() + + +option("Y_LEAN_AND_MEAN" "If you compile the library with Y_LEAN_AND_MEAN being defined or if you define the macro locally before including yasmine.hpp, all the state pseudostates and the asynchronous simple state (with the asynchronous behaviour) are excluded (i.e. those headers are not included). This can reduce compile time.") +if( "${Y_LEAN_AND_MEAN}" ) + set(extra_flags "${extra_flags} -D \"Y_LEAN_AND_MEAN\"") + message(STATUS "Y_LEAN_AND_MEAN is defined.") +endif() + +option("Y_PROFILER" "If Y_PROFILER is defined, the state machine will count the number of events that were processed. The user can query the counter by calling the 'get_number_of_processed_events' method.") +if( "${Y_PROFILER}" ) + set(extra_flags "${extra_flags} -D \"Y_PROFILER\"") + message(STATUS "Y_PROFILER is defined.") +endif() + diff --git a/externals/genesis/source/CMakeHelpers/functions.cmake b/externals/genesis/source/CMakeHelpers/functions.cmake new file mode 100644 index 0000000..3a76857 --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/functions.cmake @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +function(use_pthread varName) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(${varName} ${${varName}} pthread PARENT_SCOPE) + endif() +endfunction() + + +function(use_boost_libraries varName) + set(${varName} ${${varName}} ${Boost_LIBRARIES} PARENT_SCOPE) +endfunction() + + +function(add_library_for_linking varName libraryName) + set(${varName} ${${varName}} ${libraryName} PARENT_SCOPE) +endfunction() diff --git a/externals/genesis/source/CMakeHelpers/functionsAddCompilerFlags.cmake b/externals/genesis/source/CMakeHelpers/functionsAddCompilerFlags.cmake new file mode 100644 index 0000000..105747b --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/functionsAddCompilerFlags.cmake @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +include(CheckCXXCompilerFlag) + + +function(add_compiler_flag varFlag) + string(FIND "${CMAKE_CXX_FLAGS}" "${varFlag}" flag_already_set) + if(flag_already_set EQUAL -1) + check_cxx_compiler_flag("${varFlag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${varFlag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() diff --git a/externals/genesis/source/CMakeHelpers/functionsRapidJSON.cmake b/externals/genesis/source/CMakeHelpers/functionsRapidJSON.cmake new file mode 100644 index 0000000..c638987 --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/functionsRapidJSON.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +function(use_rapid_JSON) +if(SX_RAPIDJSON) + message("SX_RAPIDJSON is set by user.") +else() + message("SX_RAPIDJSON is not set by user. Setting default value.") + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + find_package(RapidJSON) + if(NOT ("${RAPIDJSON_INCLUDE_DIRS}" STREQUAL "")) + set(SX_RAPIDJSON ${RAPIDJSON_INCLUDE_DIRS}) + message(STATUS "Found rapidjson on: ${RAPIDJSON_INCLUDE_DIRS}") + else() + set(SX_RAPIDJSON /usr/include) + message(STATUS "Set default value for rapidjson") + endif() + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(SX_RAPIDJSON "C:\\Program Files") + endif() +endif() + +include_directories(${SX_RAPIDJSON}) + +message(STATUS "include rapidJSON from: ${SX_RAPIDJSON}") + +endfunction() diff --git a/externals/genesis/source/CMakeHelpers/setVariables.cmake b/externals/genesis/source/CMakeHelpers/setVariables.cmake new file mode 100644 index 0000000..a6f1454 --- /dev/null +++ b/externals/genesis/source/CMakeHelpers/setVariables.cmake @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +if(("${Y_STATIC}" STREQUAL "ON") OR ("${SX_STATIC}" STREQUAL "ON")) + set(LINK_TYPE "STATIC") +else() + set(LINK_TYPE "SHARED") +endif() diff --git a/externals/genesis/source/CMakeLists.txt b/externals/genesis/source/CMakeLists.txt new file mode 100644 index 0000000..dfea8c3 --- /dev/null +++ b/externals/genesis/source/CMakeLists.txt @@ -0,0 +1,14 @@ + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +include(./CMakeHelpers/setVariables.cmake) + +include(./CMakeHelpers/addBoost.cmake) +include(./CMakeHelpers/functions.cmake) +include(./CMakeHelpers/functionsAddCompilerFlags.cmake) + +add_subdirectory(externals) +add_subdirectory(genesis) +add_subdirectory(examples) \ No newline at end of file diff --git a/externals/genesis/source/build/debug_info.props b/externals/genesis/source/build/debug_info.props new file mode 100644 index 0000000..5dc702b --- /dev/null +++ b/externals/genesis/source/build/debug_info.props @@ -0,0 +1,18 @@ + + + + + + + + + NotSet + true + + + EditAndContinue + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + \ No newline at end of file diff --git a/externals/genesis/source/build/genesis.props b/externals/genesis/source/build/genesis.props new file mode 100644 index 0000000..8bdf813 --- /dev/null +++ b/externals/genesis/source/build/genesis.props @@ -0,0 +1,31 @@ + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + Level4 + 4127;4250 + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + None + false + true + include;%(AdditionalIncludeDirectories) + /D "_STL_WARNING_LEVEL=3" %(AdditionalOptions) + + + + + + No + Default + + + false + + + + \ No newline at end of file diff --git a/externals/genesis/source/build/use_boost.props b/externals/genesis/source/build/use_boost.props new file mode 100644 index 0000000..5ed78c1 --- /dev/null +++ b/externals/genesis/source/build/use_boost.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/genesis/source/build/use_boost_externals.props b/externals/genesis/source/build/use_boost_externals.props new file mode 100644 index 0000000..984d966 --- /dev/null +++ b/externals/genesis/source/build/use_boost_externals.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\..\..\..\..\3rd party\boost\Content\boost_1_65_1 + ..\..\..\..\..\..\..\3rd party\boost\Content\boost_1_65_1\stage\$(PlatformToolsetVersion)\$(Platform)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/genesis/source/build/use_essentials.props b/externals/genesis/source/build/use_essentials.props new file mode 100644 index 0000000..3d7318c --- /dev/null +++ b/externals/genesis/source/build/use_essentials.props @@ -0,0 +1,18 @@ + + + + + + + + ..\externals\essentials\source\essentials\include;%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + \ No newline at end of file diff --git a/externals/genesis/source/build/use_essentials_examples.props b/externals/genesis/source/build/use_essentials_examples.props new file mode 100644 index 0000000..79e9790 --- /dev/null +++ b/externals/genesis/source/build/use_essentials_examples.props @@ -0,0 +1,18 @@ + + + + + + + + None + ..\..\externals\essentials\source\essentials\include;%(AdditionalIncludeDirectories) + + + + $(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + \ No newline at end of file diff --git a/externals/genesis/source/build/use_genesis.props b/externals/genesis/source/build/use_genesis.props new file mode 100644 index 0000000..28d1639 --- /dev/null +++ b/externals/genesis/source/build/use_genesis.props @@ -0,0 +1,18 @@ + + + + + + + + ..\genesis\include;%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + genesis.lib;%(AdditionalDependencies) + + + + \ No newline at end of file diff --git a/externals/genesis/source/build/use_genesis_examples.props b/externals/genesis/source/build/use_genesis_examples.props new file mode 100644 index 0000000..f6c5405 --- /dev/null +++ b/externals/genesis/source/build/use_genesis_examples.props @@ -0,0 +1,18 @@ + + + + + + + + ..\..\genesis\include;%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + genesis.lib;%(AdditionalDependencies) + + + + \ No newline at end of file diff --git a/externals/genesis/source/build/vs2013.props b/externals/genesis/source/build/vs2013.props new file mode 100644 index 0000000..493cc29 --- /dev/null +++ b/externals/genesis/source/build/vs2013.props @@ -0,0 +1,16 @@ + + + + + + + + false + SX_CPP03_BOOST;WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + + + + \ No newline at end of file diff --git a/externals/genesis/source/build/yasmine_clang.props b/externals/genesis/source/build/yasmine_clang.props new file mode 100644 index 0000000..00c3f9d --- /dev/null +++ b/externals/genesis/source/build/yasmine_clang.props @@ -0,0 +1,26 @@ + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + c11 + + + + + c++1y + true + Enabled + true + NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableAllWarnings + FullDebug + + + + + \ No newline at end of file diff --git a/externals/genesis/source/examples/CMakeLists.txt b/externals/genesis/source/examples/CMakeLists.txt new file mode 100644 index 0000000..259403a --- /dev/null +++ b/externals/genesis/source/examples/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(html_page_generator) \ No newline at end of file diff --git a/externals/genesis/source/examples/html_page_generator/CMakeLists.txt b/externals/genesis/source/examples/html_page_generator/CMakeLists.txt new file mode 100644 index 0000000..e8d9dfe --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 2.8) + +project(html_page_generator) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +file(GLOB html_page_generator_SRC "./*.hpp" "./*.cpp") + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(./../../CMakeHelpers/addSpecificFlags.cmake) +include(./../../CMakeHelpers/addSeadexOptions.cmake) + +include_directories("./../../externals/essentials/source/essentials/include") +include_directories("./../../genesis/include") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") + +add_executable(html_page_generator ${html_page_generator_SRC}) + +set(link_libraries_list "") +use_boost_libraries(link_libraries_list) +add_library_for_linking(link_libraries_list libgenesis) +use_pthread(link_libraries_list) +message(STATUS "html_page_generator linking to libraries: ${link_libraries_list}" ) + +target_link_libraries(html_page_generator LINK_PUBLIC ${link_libraries_list}) + +install(TARGETS html_page_generator DESTINATION bin) diff --git a/externals/genesis/source/examples/html_page_generator/city.hpp b/externals/genesis/source/examples/html_page_generator/city.hpp new file mode 100644 index 0000000..efabb34 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/city.hpp @@ -0,0 +1,32 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef CITY_0D8BFBB1_EA3F_46E9_B683_1E6FA5233166 +#define CITY_0D8BFBB1_EA3F_46E9_B683_1E6FA5233166 + + +#include + +// DONE remove cpp +namespace examples +{ + + +struct city +{ + std::string name_; + int population_; +}; + + + +} + + +#endif diff --git a/externals/genesis/source/examples/html_page_generator/config.cpp b/externals/genesis/source/examples/html_page_generator/config.cpp new file mode 100644 index 0000000..6b51789 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/config.cpp @@ -0,0 +1,146 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "config.hpp" + + +namespace examples +{ + + +// DONE variable names lower case +config::config() : + template_path_( "./templates" ), + source_template_file_ ("countries.gtpl"), + output_file_( "countries.html"), + countries_() +{ + city berlin; + berlin.name_ = "Berlin"; + berlin.population_ = 3275000; + + city hamburg; + hamburg.name_ = "Hamburg"; + hamburg.population_ = 1686100; + + city stuttgart; + stuttgart.name_ = "Stuttgart"; + stuttgart.population_ = 581100; + + city munich; + munich.name_ = "Munich"; + munich.population_ = 1185400; + + city frankfurt; + frankfurt.name_ = "Frankfurt"; + frankfurt.population_ = 648000; + + city dresden; + dresden.name_ = "Dresden"; + dresden.population_ = 473300; + + country germany; + germany.name_ = "Germany"; + germany.cities_.push_back( berlin ); + germany.cities_.push_back( hamburg ); + germany.cities_.push_back( stuttgart ); + germany.cities_.push_back( munich ); + germany.cities_.push_back( frankfurt ); + germany.cities_.push_back( dresden ); + germany.capital_index_ = 0; + + + city new_york; + new_york.name_ = "New York"; + new_york.population_ = 8550405; + + city los_angeles; + los_angeles.name_ = "Los Angeles"; + los_angeles.population_ = 3971883; + + city chicago; + chicago.name_ = "Chicago"; + chicago.population_ = 2720546; + + city houston; + houston.name_ = "Houston"; + houston.population_ = 2296224; + + city phoenix; + phoenix.name_ = "Phoenix"; + phoenix.population_ = 1563025; + + city austin; + austin.name_ = "Austin"; + austin.population_ = 931830; + + city san_francisco; + san_francisco.name_ = "San Francisco"; + san_francisco.population_ = 864816; + + city honolulu; + honolulu.name_ = "Honolulu"; + honolulu.population_ = 352769; + + city washington; + washington.name_ = "Washington"; + washington.population_ = 672228; + + country usa; + usa.name_ = "United States of America"; + usa.cities_.push_back( new_york ); + usa.cities_.push_back( los_angeles ); + usa.cities_.push_back( chicago ); + usa.cities_.push_back( washington ); + usa.cities_.push_back( houston ); + usa.cities_.push_back( phoenix ); + usa.cities_.push_back( austin ); + usa.cities_.push_back( san_francisco ); + usa.cities_.push_back( honolulu ); + usa.capital_index_ = 3; + + + city tokyo; + tokyo.name_ = "Tokyo"; + tokyo.population_ = 8637098; + + city yokohama; + yokohama.name_ = "Yokohama"; + yokohama.population_ = 3697894; + + city osaka; + osaka.name_ = "Osaka"; + osaka.population_ = 2668586; + + city sapporo; + sapporo.name_ = "Sapporo"; + sapporo.population_ = 1918096; + + city hiroshima; + hiroshima.name_ = "Hiroshima"; + hiroshima.population_ = 1163806; + + country japan; + japan.name_ = "Japan"; + japan.cities_.push_back( hiroshima ); + japan.cities_.push_back( sapporo ); + japan.cities_.push_back( osaka ); + japan.cities_.push_back( yokohama ); + japan.cities_.push_back( tokyo ); + japan.capital_index_ = 4; + + + countries_.push_back( germany ); + countries_.push_back( usa ); + countries_.push_back( japan ); +} + + +} diff --git a/externals/genesis/source/examples/html_page_generator/config.hpp b/externals/genesis/source/examples/html_page_generator/config.hpp new file mode 100644 index 0000000..5a9e4cd --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/config.hpp @@ -0,0 +1,36 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef CONFIG_F0DF6484_1AB7_48AC_9471_42C853B24430 +#define CONFIG_F0DF6484_1AB7_48AC_9471_42C853B24430 + + +#include "country.hpp" + + +namespace examples +{ + + +struct config +{ + config(); + + std::string template_path_; + std::string source_template_file_; + std::string output_file_; + std::vector countries_; +}; + + +} + + +#endif diff --git a/externals/genesis/source/examples/html_page_generator/country.hpp b/externals/genesis/source/examples/html_page_generator/country.hpp new file mode 100644 index 0000000..9b9fab0 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/country.hpp @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef COUNTRY_8520C99E_118A_4693_A3BB_D1268053EFEE +#define COUNTRY_8520C99E_118A_4693_A3BB_D1268053EFEE + +#include + +#include "city.hpp" + + +// DONE remove cpp +namespace examples +{ + + +struct country +{ + std::string name_; + std::vector cities_; + std::vector::size_type capital_index_; +}; + + + +} + + +#endif diff --git a/externals/genesis/source/examples/html_page_generator/html_generator_grammar.cpp b/externals/genesis/source/examples/html_page_generator/html_generator_grammar.cpp new file mode 100644 index 0000000..307cfeb --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/html_generator_grammar.cpp @@ -0,0 +1,25 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "html_generator_grammar.hpp" + + +namespace examples +{ + + +const std::string CITY_NAME = "city_name"; +const std::string CITY_POPULATION = "city_population"; +const std::string COUNTRY_NAME = "country_name"; +const std::string LOOP_COUNTRIES = "countries"; +const std::string LOOP_CITIES = "cities"; +const std::string CONDITION_IS_CAPITAL = "is_capital"; + + +} diff --git a/externals/genesis/source/examples/html_page_generator/html_generator_grammar.hpp b/externals/genesis/source/examples/html_page_generator/html_generator_grammar.hpp new file mode 100644 index 0000000..de0ca8e --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/html_generator_grammar.hpp @@ -0,0 +1,34 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef HTML_GRAMMAR_C967B713_6A36_4E0E_92A7_DA61983141BC +#define HTML_GRAMMAR_C967B713_6A36_4E0E_92A7_DA61983141BC + + +// DONE html_grammar -> html_generator_grammar +#include + + +namespace examples +{ + + +extern const std::string CITY_NAME; +extern const std::string CITY_POPULATION; +extern const std::string COUNTRY_NAME; +extern const std::string LOOP_COUNTRIES; +extern const std::string LOOP_CITIES; +extern const std::string CONDITION_IS_CAPITAL; + + + +} + + +#endif diff --git a/externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj b/externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj new file mode 100644 index 0000000..abed0ba --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj @@ -0,0 +1,266 @@ + + + + + Debug - VS 2015 + Win32 + + + Debug - VS 2015 + x64 + + + Debug - VS 2017 + Win32 + + + Release - VS 2015 + Win32 + + + Release - VS 2015 + x64 + + + Release - VS 2017 + Win32 + + + Debug - VS 2017 + x64 + + + Release - VS 2017 + x64 + + + + {A4401298-EBE7-4861-AC15-E23071C4FCE5} + html_page_generator + 8.1 + + + + Application + true + v141 + MultiByte + + + Application + true + v140 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v140 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + true + v140 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v140 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + MaxSpeed + true + true + true + + + true + true + true + + + + + MaxSpeed + true + true + true + + + true + true + true + + + + + MaxSpeed + true + true + true + + + true + true + true + MachineX64 + + + + + MaxSpeed + true + true + true + + + true + true + true + MachineX64 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj.filters b/externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj.filters new file mode 100644 index 0000000..25ffa48 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/html_page_generator.vcxproj.filters @@ -0,0 +1,48 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/externals/genesis/source/examples/html_page_generator/main.cpp b/externals/genesis/source/examples/html_page_generator/main.cpp new file mode 100644 index 0000000..e47fb64 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/main.cpp @@ -0,0 +1,51 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include + +#include "recipe.hpp" +#include "genesis_exception.hpp" +#include "recipe_callback_impl.hpp" + + +int main() +{ + int error = 0; + + try + { + examples::config configuration; + examples::recipe_callback_impl recipe_callback( configuration ); + std::cout << "Generating source file from the template '" << configuration.source_template_file_ << "'..." << std::endl; + sx::genesis::recipe source_recipe( configuration.source_template_file_, recipe_callback, configuration.template_path_ ); + source_recipe.generate(); + source_recipe.write_to_file( configuration.output_file_ ); + std::cout << "Finished. Output file '" << configuration.output_file_ << "'." << std::endl; + } + catch( const sx::genesis::genesis_exception& exception ) + { + error = 1; + // DONE add "Unhandled std::exception: " + std::cout << "Unhandled std::exception: " << exception.what() << std::endl; + } + catch( const std::exception& exception ) + { + error = 2; + // DONE add "Unhandled unknown exception: " + std::cout << "Unhandled unknown exception: " << exception.what() << std::endl; + } + catch( ... ) + { + error = 3; + std::cout << "Unknown error!" << std::endl; + } + + return ( error ); +} diff --git a/externals/genesis/source/examples/html_page_generator/recipe_callback_impl.cpp b/externals/genesis/source/examples/html_page_generator/recipe_callback_impl.cpp new file mode 100644 index 0000000..391bd64 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/recipe_callback_impl.cpp @@ -0,0 +1,186 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "recipe_callback_impl.hpp" + +#include "essentials/base.hpp" +#include "essentials/conversion.hpp" +#include "essentials/exception.hpp" + +#include "html_generator_grammar.hpp" + + +namespace examples +{ + recipe_callback_impl::recipe_callback_impl( const config& _config ) : + recipe_callback(), + config_( _config ), + country_index_( 0 ), + city_index_( 0 ) + // DONE odd indent + { + // Nothing to do... + } + + // DONE odd indent + recipe_callback_impl::~recipe_callback_impl() SX_NOEXCEPT + { + // Nothing to do... + } + + + std::string recipe_callback_impl::get_variable_content( const std::string& _variable_name ) + { + std::string result( "" ); + if( _variable_name == CITY_NAME ) + { + result = config_.countries_[country_index_].cities_[city_index_].name_; + } + else if( _variable_name == CITY_POPULATION ) + { + result = sxe::to_string( config_.countries_[country_index_].cities_[city_index_].population_ ); + } + else if( _variable_name == COUNTRY_NAME ) + { + result = config_.countries_[country_index_].name_; + } + return( result ); + } + + + // cppcheck-suppress unusedFunction + void recipe_callback_impl::before_loop( const std::string& _loop_name ) + { + if( _loop_name == LOOP_COUNTRIES ) + { + country_index_ = 0; + } + else if( _loop_name == LOOP_CITIES ) + { + city_index_ = 0; + } + } + + + // cppcheck-suppress unusedFunction + void recipe_callback_impl::before_loop_iteration( const std::string& _loop_name ) + { + SX_UNUSED_PARAMETER( _loop_name ); + } + + + // cppcheck-suppress unusedFunction + void recipe_callback_impl::after_loop_iteration( const std::string& _loop_name ) + { + if( _loop_name == LOOP_COUNTRIES ) + { + ++country_index_; + } + else if( _loop_name == LOOP_CITIES ) + { + ++city_index_; + } + } + + + // cppcheck-suppress unusedFunction + void recipe_callback_impl::after_loop( const std::string& _loop_name ) + { + SX_UNUSED_PARAMETER( _loop_name ); + } + + + // cppcheck-suppress unusedFunction + bool recipe_callback_impl::check_loop_condition( const std::string& _loop_name ) const + { + bool result = false; + + if( _loop_name == LOOP_COUNTRIES ) + { + result = country_index_ < config_.countries_.size(); + } + else if( _loop_name == LOOP_CITIES ) + { + result = city_index_ < config_.countries_[country_index_].cities_.size(); + } + + return( result ); + } + + + // cppcheck-suppress unusedFunction + bool recipe_callback_impl::check_condition( const std::string& _condition_name ) const + { + bool result = true; + + if( _condition_name == CONDITION_IS_CAPITAL ) + { + result = config_.countries_[country_index_].capital_index_ == city_index_; + } + + return( result ); + } + + + // cppcheck-suppress unusedFunction + void recipe_callback_impl::condition_begin( const std::string& _condition_name ) + { + SX_UNUSED_PARAMETER( _condition_name ); + } + + + // cppcheck-suppress unusedFunction + void recipe_callback_impl::condition_end( const std::string& _condition_name ) + { + SX_UNUSED_PARAMETER( _condition_name ); + } + + + int recipe_callback_impl::get_switch_case( const std::string& _switch_name ) + { + int switch_case = -1; + if( _switch_name == "town_name" ) + { + const int population = config_.countries_[country_index_].cities_[city_index_].population_; + if( population > 10000000 ) + { + switch_case = 0; + } + else if(population > 3000000 ) + { + switch_case = 1; + } + else if( population > 1000000 ) + { + switch_case = 2; + } + else if( population > 300000 ) + { + switch_case = 3; + } + else if( population > 20000 ) + { + switch_case = 4; + } + else if( population > 1000 ) + { + switch_case = 5; + } + else if( population > 100 ) + { + switch_case = 6; + } + } + + return( switch_case ); + } + + +} diff --git a/externals/genesis/source/examples/html_page_generator/recipe_callback_impl.hpp b/externals/genesis/source/examples/html_page_generator/recipe_callback_impl.hpp new file mode 100644 index 0000000..3169a5a --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/recipe_callback_impl.hpp @@ -0,0 +1,52 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef RECIPE_CALLBACK_IMPL_D1209279_561E_435D_B6DC_68F2A50937C2 +#define RECIPE_CALLBACK_IMPL_D1209279_561E_435D_B6DC_68F2A50937C2 + + +#include "recipe_callback.hpp" + +#include "config.hpp" + + +namespace examples +{ + + +class recipe_callback_impl SX_FINAL + : public sx::genesis::recipe_callback +{ +public: + explicit recipe_callback_impl( const config& _config ); + virtual ~recipe_callback_impl() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( recipe_callback_impl ) + virtual std::string get_variable_content( const std::string& _variable_name ) SX_OVERRIDE; + virtual void before_loop( const std::string& _loop_name ) SX_OVERRIDE; + virtual void before_loop_iteration( const std::string& _loop_name ) SX_OVERRIDE; + virtual void after_loop_iteration( const std::string& _loop_name ) SX_OVERRIDE; + virtual bool check_loop_condition( const std::string& _loop_name ) const SX_OVERRIDE; + virtual void after_loop( const std::string& _loop_name ) SX_OVERRIDE; + virtual bool check_condition( const std::string& _condition_name ) const SX_OVERRIDE; + virtual void condition_begin( const std::string& _condition_name ) SX_OVERRIDE; + virtual void condition_end( const std::string& _condition_name ) SX_OVERRIDE; + virtual int get_switch_case( const std::string& _switch_name ) SX_OVERRIDE; + + +private: + const config& config_; + std::size_t country_index_; + std::size_t city_index_; +}; + + +} + + +#endif diff --git a/externals/genesis/source/examples/html_page_generator/templates/city_type.gtpl b/externals/genesis/source/examples/html_page_generator/templates/city_type.gtpl new file mode 100644 index 0000000..33a320e --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/templates/city_type.gtpl @@ -0,0 +1,10 @@ +$switch(town_name) +$case(0)

Megalopolis - a group of conurbations, consisting of more than ten million people each.

$esac +$case(1)

Conurbation - a group of large cities and their suburbs, consisting of three to ten million people.

$esac +$case(2)

Metropolis - a large city and its suburbs consisting of multiple cities and towns. The population is usually one to three million.

$esac +$case(3)

Large city - a city with a large population and many services. The population is <1 million people but over 300,000 people.

$esac +$case(4)

Large town - a large town has a population of 20,000 to 100,000.

$esac +$case(5)

Town - a town has a population of 1,000 to 20,000.

$esac +$case(6)

Village - a village is a human settlement or community smaller than a town. The population of a village varies however, the average population can range from hundreds to thousands.

$esac +$default()

Undefined.

$tluafed +$hctiws diff --git a/externals/genesis/source/examples/html_page_generator/templates/countries.gtpl b/externals/genesis/source/examples/html_page_generator/templates/countries.gtpl new file mode 100644 index 0000000..281efb2 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/templates/countries.gtpl @@ -0,0 +1,47 @@ + + + + + +Population of big cities + + + + +

Population of big cities.

+

List of countries:

+

*The capital is marked bold and blue

+$loop(countries) +

$var(country_name)

+$template(country_table.gtpl) +
+$pool + + + \ No newline at end of file diff --git a/externals/genesis/source/examples/html_page_generator/templates/country_table.gtpl b/externals/genesis/source/examples/html_page_generator/templates/country_table.gtpl new file mode 100644 index 0000000..8f092f4 --- /dev/null +++ b/externals/genesis/source/examples/html_page_generator/templates/country_table.gtpl @@ -0,0 +1,14 @@ + + + + + + + $loop(cities) + + + + + + $pool +
CityPopulation
$if(is_capital)

$fi$var(city_name)$if(is_capital)

$fi
$if(is_capital)

$fi$var(city_population)$if(is_capital)

$fi
$if(is_capital)

$fi$template(city_type.gtpl)$if(is_capital)

$fi
\ No newline at end of file diff --git a/externals/genesis/source/externals/CMakeLists.txt b/externals/genesis/source/externals/CMakeLists.txt new file mode 100644 index 0000000..e095099 --- /dev/null +++ b/externals/genesis/source/externals/CMakeLists.txt @@ -0,0 +1,11 @@ +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (NOT TARGET libessentials) + message(STATUS "essentuals was not build before. It is build now.") + add_subdirectory(essentials) + endif() +else() + if (NOT TARGET essentials) + message(STATUS "essentuals was not build before. It is build now.") + add_subdirectory(essentials) + endif() +endif() diff --git a/externals/genesis/source/externals/essentials/CMakeLists.txt b/externals/genesis/source/externals/essentials/CMakeLists.txt new file mode 100644 index 0000000..097f692 --- /dev/null +++ b/externals/genesis/source/externals/essentials/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8) + +project(essentials) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +add_subdirectory(source) diff --git a/externals/genesis/source/externals/essentials/license/essentials_Anhang_Appendix_20170406.pdf b/externals/genesis/source/externals/essentials/license/essentials_Anhang_Appendix_20170406.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e6c6650ddc6ebe2cbf7c4fc021faf553da3d4848 GIT binary patch literal 144257 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�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

AIpqZ$CYIQv2CiZPT%YVH<1HH*=s_NgW=Nrp9dZ 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�t=rVkPJ*aRqv;6Wc+*Cw75eBmNPj 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 Dz_u6d literal 0 HcmV?d00001 diff --git a/externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf b/externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1cdf2ed39b1a1de48fbab0e95ad7d56a86081872 GIT binary patch literal 137055 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 literal 0 HcmV?d00001 diff --git a/externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf b/externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf new file mode 100644 index 0000000000000000000000000000000000000000..037bf28eb1bef6af6f4213cd52bc75bac6f2eb5d GIT binary patch literal 158255 zcmdqJWpo@%l7K5_X31h^XtBl2%*@P;7FrAzlVvf>VrI0MnVFdxp6olbJNNDEzV~B) zZ6BSk%+Ab+%!sPa>MtrpCNC^X$3)Kx4?|Y>@q&k8B4i}AGqi+<;pS#g_OLf$5HfH! zu(mT}kT)th! zur;;&5c9ieVodna&4l;k1rK9lYy3yWZ()Da^+yMTke!RIGa(y;l!dXA79sO*afD2N z6caMB{8eN7>+nYvA%OLFO^5JbMgJc4UqpYb!O`SH^k0imG;y+XaWpb<`k11KyR(>* zvw^e8M_EjXmGF(9T`!V<;mb zD<>;GGk}nTg^8XMphNg!6IUmXy=7C`x;&0FiJ5}w?0Hg$&BhF z`m&Y>hZPy8IwwD&u%i$%46x+g+uAF(*TPu_B;$@fW%2=!`livs^y>8M?L3dT{Uz_i zSxW?gUb`21ukX9p#n$Zb#@1*EON!gR8Er~trpz{Bv^q+j3C?8}5-oLrjFXS+_2{F< z#gmx&oA)$>T}iW;!1!}}3Fav6gS*4x+N*=Z<70V~yWVK>afx32aRlP>F+QK?vT}`S zE}OT5hmY$e53D+}_S!~$rAcQ13og*tB#wt0%&nqSBDAYE&-Ps@H>VX;E@`IJ$Z z6O2^Zh=(s|z4E78x4-4&sX;y%y6$Om*5!cq3nR_4uwC2}%&?#=9jS zV`J3QwHnkKzqy?7g6vQ%Zj0|_7=I&?c<$xt1j$%>d^!%9nDyg!$ff;eXlqxi7m(2? zhLF%ud+#1nC2H|D9c;ekWAPdwgBMyTdx#vWc2y+JVuQhH+>Ux>kInpWth+x+PQqWe zB<&1bz1{xZ3WN$8V>0?PT6O2`MrK?Q8Plnc6nIsC#UA?Q#G95Q5j_#^D+SmP>`TCq z_1I-TKT2{>vtjr47d^hg&$#G2Ta=a=-GLaEaeM4pB7!kNH~u;GN=?FT^SCMBQbJ_{ehDDF2qV@wR(yJt#IL`2Y>*dU5}_9= zAv_}{9QbBaMuMOnK7YM6+k7UNDd}N z%SO=4^hG`eap#*+8%P$dDTP=$v7wmMBNeV0dQO*sxmnl57#i?rA_DOg{PY{;*7`v3 zZm_g5k{~9CED8IyVWXp@T=zW(f(vK#&^l9CVsN5AqD*>(;6bs~r}s zZk>OI3S=%7_cC614HU533T_h9R9re}u|uPsoFO2NL;43QZpl6^6Tqi4P*)IYX7qEf zA?q*8-PmCrM-gNPgTdP)a&5pA7{!(mHUn9?6>esb;xztytrbpvcRyAK`U|s_x%G_o z#i`A}l!1y@ps(*NpLOf!0t7rxFrP76ynJa~%RDhKQ+j{S$&RW{m6W)|dHunHCGWei z5j<$XGz~JF9Egl~1G$WT{M)6Y9}A=*yL*P}&P4BKNiQnHvV6*>3@8eMVTK z=R%fW{e{-*;>dF%+S-lFy>~3|q2I{J8v$|Ka15^~Zl9eX#6isTaw2FHP(m$%6|byg zu09!y*Br*IA`xR{@vE)Lzs1*F+Q4OuwYD@nh6!=(J-W~9ww zc}L<=m4wkC$3%zqVmyK-Q23J;Ue|n5ldSw1xq!JasDs^=HIvNc+75=%gI)owNlco~Vb?dEUEUv{YPP>c2vdE}x>eNVIHD$q34|!*VG79WMZjj=g*;&+K7RUBt zu9RfFpnSrP`NEa2wm14C;EJp2a@R>IsDRYhX1^1o%VBRn>UZ*9pY4K(#ZG>mUV@b% z2Jf?uQ0iTynF0T10oRqbAovZ~&weup#xu)wqDP!_>JCRtDIsk+wRya+1uyj6W1!!o zpqePFg`Kf@jTngKIO8nx-~qUfY355aCv>QIE=xnAQYtUH5xVAzm4Uw`{8#-nB#c!m zkvVaCzGD{c@wyl-&d%MVgu~@X^OcCmHdr~CMcn+ECP>b zzLg*E34n(@F5+e}6|UN;Y{p!)XZPPHd>uQdR{Nfdz%ULe$AhyO1p9O7t7%PAF9R^r zrXX2g_V}1}w$E%jZ4{=0C2Ug~%asG>U?+)-x7$q&Cb@=;?LoUpGNH`ESmLvtF(#DH zyD%hCvi14Kaq1(hcM0hfrqgE`m90?p0X^0)QCuX%f<;(Q7ZX2Kp)Nn49SCt%dvE9U z08vk&cnKZ`&~;{a50HeWD4t-i5=nJlcwr|Gkf=dK6s1&m+jjEbcU% z0HKP~3;dQ5T>S7olE~2%W#zB#tfpv2?FK7CdoU;7|byDD|-a*hbNrbEAA;=v` zsZwBI_A7zN$V^Czk%3Q?cPM9)BXKX-y%B-1I0cP!1K3HuXlQJW^I*7y;~tEzHUq$+jteDqd6Wp^qvJis$H6cFI=Mlzet)xwmC1tcpl*~ zJ~Az^vsNI5eurLTqAM~L=2x@Mxby8_MeqpHs1;rp*cWk)hz{uVlh?u;=}yke90p z!6%T}QBqLuN%ql485=bzj*>S^ z1^rFH?mG|};u`i&L3#poAr0PB+^67XrX~s5bsU)Tj=YnO{x4~hRFMIo#Ss?K66@`X z%Gu}6e5WlN9NJs%s)o5#JbUDN)uGwUWCH?8t06;E&CvMfM8eu^77cBRn!z*<5Z)dY z5{r%EL*23)u4WK)wV-6hKB|8313@S=*+r31OP@wbXGO--!>^c%E;)x)SQBd$**J#N zWV!JRFK)sl8Hvc(R7sr>bdB&GY^}D~_w5aK)5Way-M7pQM!AD#QTFBsl+@{{&gTkj zDsvsQ6i~B;49jz~nJQ&dWw2o>l#YYhm9`5ZodlgJw=d&(@lwq`e=nPkCm6bW^wYgC z&~Xv7#Y3Ez9h(99_O#kKa>e{$LZo>O8syvz&NmdKYfHH3z(zI?` zl#ItKj7u0Yj2LBfXu8G8iuWnXe46N3pYItF_%kdr`+;@mhJ<+S}J}Wc|&3HI1M=MWPRaNG<+`(sHjnAV+@sxA|1y z(JVC;by@2S!e$#|*Gi>wrSEJ`yvxC$)Vfci=56HQifn_`bq~6<+n|(t2b)*v_OAwG zv}^EWGK?XGn=L@xanP_NUm8(1iM|H22u?;}A*%7(aIC&8phcaLw zVuka`(_7{Ydu>~Em4s4dR#jby8rT}v@-JF=y6O)5wV5?pdfQcTj&#KkwW$N_9Abw? zG_~b-uR}|}(tIN|ycqDWLf!-$#Z?`4G4JET;y1(vlL>i|h3jatIKsD7;oVB9>q;xv z%89k4!qUSJ^M%&DQVoakT@5L~3xL7Uhn|3>6g4lh@E;cnDfL1z%T1{o9)O}=2KM*o zO)hbzXQFIRxmJawe(<;g?Ezcc8>1r2(qVdnsQz zjNfgAG`$i3N@m40gfVLwV#J><6mJttbekrHcXpK685PYo5*6f6?Qz9ANe%-!>pe-A z*W&sl&EqXFa>X%p8&4`(xECKS7V3q1Bm}xg6g&5TZdQ$RDaPiuhoKTRG!xn_?bl}< z!M`alXX$y`)nGrj4Xb!t2kSmAOTw zE7!NZBH+jKRXLB|d~z&Dp#BwC=yk7?3!6;0B;lCP-tS-JQ7{f2GW?@i4{M!Lkp-FTuFMzJ1kQ(QQAx2Th`a&~US0H8rI~2T&v{?Oz!}b08?9OsPY8 zlDSiazI=*hOPd_<27QKUpNQ!<$oVJL_ybG+gY+;6$}q^dKD0YM>Q5fK_y6GvkMTLU^lJ8NSG5!(-ZVqt5> zpk`q!VC!V@ANAiOgiV}`94+jf?Hmc&KXfWGh*~&0ISZK^I1(}gJ}BEi$^cft$8ck3 zb0d#dF-Sj>XkD1eNWfC8h&%#K+*38<3kdZ;a$>=vI zV`5}v{lG|nRp>o7HUfjgO%-orfosE@2z}4)}ya-v@I6g3+`(G6RfR+7^R<(ch zWMpJe|Hmi*E8_=*GO9Sd-Ayz}o5K^8If~C*VWH-%00bx`y>95v+bHG)-tEMC~tG7XgiA zq+lS*q{2a947)*&65!M`G*FZhD}hOhY2;;DbSi_hwH8WCdpV&KB(5O&6M=gtKHWk@{LKOUR#+{uCTMRqeP! z4Ye?^QZ;Q|wV^7|890Be)8q+niwt3mh16EIYfd*rHJd zsS-HiojEb_cd6?0uF<#tz~9ZMr>9yCCch<#>b|{o(ChV;1^7W`?DJ_>#hGZV2tv6R zRoE>g|A_kN{3%s~i`GQST_Dq=-OShj~NN3j7%K0gumSkWsy5^}M z%xtvK;f~K=8MQgt6U6kslTc(;97jR(5El4yMoYDZ#7Vok$!U0SGC*b12?^1Y>YX|^ zg-5?2wSx!O#TUvFWp4mFR@=l}AY#^^nYbCRr#tlhQ2AbWt{>TK79F!HC#AtNM!Aq?#KZ)Pg`rI%T=_)`t&KVqVh7cPqbl~ZtY<{QuN`XXVNGnJY1gv z7aGFd_wlOv$#X$VTT|2hppt{6XbdQwMz5=~JvzB(Srz?IZxZMt287`0`T6?lJ_5o| z0ysEG$Lp@M^KE!gN#9RzJfp0*%mop#p;o;M$bM(-%kv8@EJDc9#O;NKC6L}TZ2Q{y9?MoKqcbu-8vl((|dFEY>(OcqUzt%MBxZ? z7H=4s{KOewOXq2bKcYDh`ZjuwXE|S`{0LBca;*I33U|Kl@?id|ECL>Z-3s46*ToqH zBJiz_tH#?5mO`b?MfdkZTB`)HlH*RxyU5KhbkF$2>3;&hyKYGG&@xfUE=$u`RG{*V z2Bc*9xY@89ej*2b4|M)0Bv2f=n=NlVcM0!FG_MB_6;D?2pwRb(r5O8(N==@$OcQix zXLs=vCRG;m2GRIqIFCA> zA{RM@XncB(lWa3cgCnevE(v!c2uJVYz`T)GR~VZ@(@^ebL$0pqab^a)e{F^mNqfyVD<8Gz3an-#kIB)g5nP zqPCa=@_oBXdO-Pg!o<%g(yFYPTxS!lAd>rG3Z3Uez~$+>h7r(Q6PM&I=gYyMd0njq zkk_=-`u4XKgro&3%DJ*)}}j3xqgMKnJ8wj1&QAncUa4xd{$5kuvRgl&2C; zP^id?Q_j4Wrfh9j{t$$`RjK%V0Try0l4#82uk9tP9}7i~!*=qp7h{xa#ajIJxm_X- z4n4L&%dBQuNKeHEXe{Whk>SBjNS*m5r1LZOa9}LJcC+6{Dj211!=6KN+GSG<33Q_G zvD(K9>6U84l(Qr9;@*d_4I`rjR8ORF-kaekBysd58=;0_!J}>0dSWX^#wJ>Fg6a|c zrk4DNVW;l}p^o)wVM)rkFf+jOl1G{lr9{Kb1arU6sVBy5Wfxu04dHaI*GR*C*9Pr; zS-XUBl#cYS=&*w?VZMT#$LU&HYPRtruT~HM1$*DSegBcD3|a|#h_c;=c{~)Tv4t5+ zy&@kS7gY*T?R0HvX%!nKiA~sg4?4)=ccWulaC;~ZLH=RBOeTiVBJF||a0a^3RBi^TuS+BIrt}mzO zqQGo`0bv6GY6K7U0_Hw8Ik2*9cC2tINrzHGeG-+z8ZO-5yC0AaB1GrMJ_(QYVgU1} zp#G*XL+XLjZEezh!yv$AyuTwk-2oQW>97L#zTWXQ59Hp*)fWHvF5P*8Xa)4KL%Ltc z&y=9Wz0J~-zLq*DPD?zgwZz<1^l|EH8y1yx|CavI2w?kux~$XUP%01k4zhy9+VgLJ z+5Cx!|LuP1cl7-KLWrB`Pssm&DaQS`A9jBv|I=pw{jDDhBY@-Yw|;F}qmF+CxzGKE z!WIBTBZ!RrD%2{jCktyOq_RI(akp?OQSut&puoZM%`@Eyj1ZSsnL+gjHe=`&ygv2^ zeK|L|`+2?l&dFbe2g`O0J}+q88om35goS zIfB)Bp=n1i)^82hH3zHTE*_2xbjB#AF~Hkwmj`c}(?mM-wCC=9wY7Oy)i5*3BX%vP z=#OWA?T@NNB=aiAYs{vAuWM&y>b!Iks|qJOX=5ZsswX(4h7v1QODp2*to_K$FG4C( zi}AF$d3!mzS3rA5)_Hq@xDz^2*1?a0y= zJzJ#Fw{6Yxt)Kf-9jKMB$J-XM9LyO#ep@e0IEBVj4$Tg+!Ig=sJh8$9_lwd3`kLCM zdKZ52Bnv(>XLB&#vm7@@qYU_oqQL!4#w+I8<|{;d&y>P7${yEHTWDauH0gRxfbQ2Y zfWinV>~PK3{dVi@{+|FZ{OKY4Z-6)oM;aYoBTqlOYh*td+hIKi1e}sduZsqp)vm%) zL@s)d3>-3V2Cf8-!pfP!bUCL=lc}sWc!*^~5XvsF-n1D6{?Z!MV}%`P21Jt!Drpx* zb#!xm`pbs!j~Ms%M~vI!b4k|<>uV%70iDrBCyZ_7BuF~p=CwrKc5!bTFA!s)yHhAE=F~fT&wUH3gyWd3ZLvm(j5*78)qF2Y^?E_qn@ZABwyz^ zBoqqg6ACIfzsoD#7z`BoNS0RADvaXLS4FhsTsfuHs}559JH%~4>*8-23}YD4fPuP|eM;j<#4E`0 zL<2VTsa3#475arTwwKDi94pLuetx_fK@40HUwBl>eL_Iy3X)Um`CwfhV*;9aD|;z< zCN#x1Hhly>xg`qT=^U4bh-g4?X+VCt%BT0mhO-ij5jh!bxDEFq72kAMmi;e{7NZyB zB$+5*SAQlGpg71qB$HBpk&K*vZ*RQNRUqR$<^|KyU+H$j(-Bl)QBH^PCOBELCk9YP z%FvRx^AX}crO%_%p=^eI8ZQ3w5#l!a9pW~C{2k)nN6T6JE5r>4oEDGBB7HCGNw3?| z1!4dqv+v)X0y1HrejlFTNkrKJ-bg7k^pkctl!E$vZ(O1$I2on1pY zQpE0fV5}s!3oV0F$N`@ziE!hL@+X)*&UTwco2HttZDs3ELu*+YeqIEO0R^6Z9qm~< z@4k-jDQ5C!U^&Dje#TGRmf0;^>1X8^TDP+u)GMzRQb?LTBGhhedakwmprizLzF zh#KT5?`$Bpe{?d$@UR#|4UBR(7pFh$$}7t^tdM|Gno;RsXLiM-H@gQDyiJ*>2xyO# zl8ed$lAN=nfVskgl)Fq4?Lvs&Nu82jzh0kt)~D7J83f6xi{{Q|SE^w}MF%XUd%|?E zxgSOsp?~F_eRK^-un03PcP7>!F?-sh#b|*LGG2VX#tAHK63XNRfVd{$b2%ID6fiV#;vmj*M5t3E!f<*m zC2p#@?>ocVV6`&$g>#8n*T{GdtNF)6numTdMnzPk0y1B~L!A=s_ewmqsr1*nbId`u zLt!z#?3GcL^rF&=NiNi0iK8Sr`Q(Y?`?VxITrdeP2=I0bn8pI%k9wwZvmwc9XL)oM z<%@syhA!I!h3m@BNGyM;9OLcWFbRK7+dWdJx*EV6^s^|f&NYOiMNnco+cn(l^`)f! zspl8PsmQB_YTVQb#?qyuhw8IJydMhp`a?gvtt(tbWWcqeCv2cCwFle7y^)QKIA8`& zE6Dz{qaE=sG4htx$`*+zuImpfHJDpm=4JnbV6c6C7pFodRl*`B37Jq^eI%vhs52{j zd=IRuuMCi6!*PPAZfKzhUXl+(ENnQtY8;Xejxu|2g=t#RAQara+J}@HiW}x`eg!x4 zz!VQxlRMG+uYyjN7{CnFqck=&ocVsgxYTJ%#LpG`2ME+yN_+0Cb6{&%nQH_RfIKpR zzRjW+bfHA3X$5h8CQw3BJOIUX{aJdiwh#$zJx%9+5x7C*ZDH4C^s(|-27fwtxP0v` zRYIHt_#%v%1l6_Nrd+8?|Nk`EpOaK!)xR zxB#=-WHB$2~%=K>}y5rY1vVw>oasKZH+D` z&smmDF8qv!w2Tltl*MthizvM9B1lO4u#1$XN=>;G3ul9lnR(`MBd(48m=oRz^C80v zmFKJixAm(}R;(oawKVR>XT#p{X3>?EqU|H>9(&>*-G%3@R;c$^iLg5e-iW2I)(nuN=IMK7xeSGe_)&cVK zoiUrdDFCh5M2RHq76JvDnTBivW-8K%W~`j*=_&p_EPk;be3$&@Uu!+mST+gY(KqMg z&qUzhr~G-l=4Ev zK^~Eml2F!-T$Q2Em)?rw5>CX47T?;19AgJ^MWYsxzl0=&p#TkNFeojwZ_isYSywLi z-Hp~Oz?YqZlf)WfZvDilC!7ch6~v?2U7#1I+C{sC50^b}`#R;xi!S|o+4elnU!sezzUfN|n^j8K+ z4zWlJmA5}Mr+*Nrc(SZqPXWtSm(l5#s~*dsy1~71(XJc^d3#MM3-cB>p~2= z=OmOm*k`1AVUsF7T&0oxIx9YFEV{D%jE!i7QFxuk$3W%DkyBh~welhmSGn)5j+F6ln!!MyTR{JX&$QEeyi*W%IkYK3z zz&BbFRai7fZG>+cm#Fx4(KVYsM@WrlXj!z35oI?_^gqTn#6Vq%I!+)>(iaMn)(>j1 z;Rr%SrSdu=+p*O-nZMOGUa{+K_0C}OF&Y@(vqBM};AS&bmwrz5)%YUi7SG0h-=IUZ zecwYju3^_I>#gN^X5rUTuJ$z16=PCSz#jU1OOhcwso^7!eV!uAU)Zm0quL+`#$Qix zDg^u`?EnCFxqaVKZuS}L(m7{_Tz%bQ>|2UqzgKYPcE-#kD8AW*=Il0dp_wJ$eez9lPKcqKRA8H( zHat~>$BVN*cR#}C`mb!bAg;E0-9&fL1{T{{=R2sw0uAUUjv?@A(uhqa@4W$=-}Oh_ zcU>39JA}5p^C8v&;tjj0z@Po(`M739UB?6?MKn9=XOrbY)_o}9xz=owRIQ}4t#4|tWmV^6cF?ot%ynKBf45?*iHdf(; zYrWE9t<}i%qz~VXND%UxD{!iarK-zz1KH4?FEdSAF|SNW5eqywL6zcb9jvuaYrD$ic~;>oS}E$)p+&Go-q3jS3{RvoYsm|zRGAN8KgXs(r|vvvolaeV zmsi@U7gc;~4WpA2sxMIT?`1bnse4#U`hu2wtW{Sad%taY?Daa}_*p}3S!uaE3bwgh zO?>2gcr-&O*$sy?mPo{_m`>zwoBlg+uba_r zv6e|_6))S3sU%{~YaR>(yeSm@=7i0(zF%D-5B#Hz?=2OqAJOwrz#4Fx56OcX3jkoX zh)6@*spD7&+8tRI$76Z4Mg2(~C9+6>b5(M`q|6!Kp+t56&7oaqd)Kusn?Z3ZP&AHQ zU2E-$z!%h2_TRIUe|^~fPb~NU3_JNp=EDC*m*Fe$}U|Yz4AI!URy7k_kd|Cho3(&x{pn_A&*6 zaHwoDSSTeXF=1}1^0cs-o4lBcqb2ize?U1W!HmDUjHHdVqcTr7^nAqjuzS_)^EAJE zJFMj5QKw!$7h$VX!N6y2`}t+I#nM5G)w73ve%~y4z1nZL>lV)zRtthwyfIQ3-?%!| z5MP@wBlFh)Qe`r#m&3*C<03;1;ftF6>-=?11OM*FdnWmUr;?k_Yhz}O-Es3VC#a_c z@*w{OH!-OXjnU51*9 zIRk)Ij|UUYd5`tn&u$Mu3+z63stbvQujlI?ag?L29lm!M9sr;05_6RZ9XVdlG(=h$ zyFBE5*EHn3#6F`7+oT4N&dk{og8D4Sf$1*InXV{1K9l;2nX!5O0Z+CxuE}~EQl5!n zk^phu;|P|h`wGP%{b?g0c5NmWl3@9v$vfxr6oDjvq^Er2 zj&f((?J7i?b=;&C16B&-s{v}=|4a*$kk(&=(`$3s!MRE?CX;asFhH=b)Z{H&&<$vc5*Oi>-zNX{q~l51WwRA{G%PTQ;OE z9M-nlkG;{=aIwzCh{E}dg~HA6{K_fq$Vh&Z1sSx8-I&1kks)BJMzjIRsXD(g-pt+{ z=d-qr{RPA^0`AplUfYYy-N$N=RN?IP` z9Ow+OMGVi5o=ySRu)%q{w+O>QP>`tT6{(kBFuwl48TjWA*J{NHA&z-4<653{;QJj{JraP-1)b#O zw4r91g3dKNfH_qeH2w~kFWDk)l442aVTWOr=w-0OkN!=?Nb(~|z><^_9I#Sc=?F8c zZV-ff!V~(&T8}$0vKHVHwupFfDOM{@O|-T}0Z?|0ijHW1+%8s$Dd3WL!&LM~zm@k? z{2(ZZZA@?hn5hBT(#dhH2S4IaX{#FFMR2DXuHG<@hO0Dys==|;@gSNWy#PjVt-83Ex$zv?0@(SdEUL!$puh(!}YzMzzP z=B?H3jwlKZA(MzUnElDr+RH@&v=sZG(*y64s`F)6?^1)D=%>^y0_31^!X8N&HZFx+ zC}1K;4rET^=p#uWf&caDb=y#b3By|nvOoLX1cWK)`7Hn;8`EX-xL z_SO@a0?Hr=_!=edlXL?S3tiC~IES`3!lruZvLCf-s5tvYGdw#-t9 zGT@Fih=<&Am8~%_x>EvuWI3XkVqZHO7)g)$BEl6n_(8f5b99;0aiO|^3LX=l*^ zy~g*N4p!)4;#$5281xu~RT5>(Zn96dFNnvDPi5_h39Mt!aEop+AI%8~wp#Sv zo;Ll4A8L>*yEUz$RnQ4LgW1XmqZ@H7pTvFAs|NK4b!^S)3;TOtUYfYY zLZl*wSo;FJIu`AdL756lx|phH@X$IP8D}qX5ZyS@KntU%jdq-OG2B0?EC?gn5*kSL zAA~Z_)w7Bw#2L~F__~w|SPz^iyFOx_iHZo$-DLo-c*(@l`_LTAFUo_J&zv&(NZ?A9 z4gH*ehRwcSfWI+9RVa>v12@Y7(-s z9Vn*8wcFcY*zHR*>VhC9F!P?$_&S{WEP>!kDAtYc7gZBk9O*R7CtXO~jjdo3aOf{` zkJW)pKW^%Q!Q>D*Ae#(-=8l+aI3V;B&S!E_;br)pKrePec1DuoJ3Ys%o*SXV{30rN)w^M%-9Ht9t#MFNW|CV60)j8(uAG6Xt% z%-9k7t&A9Yyns=_5z(ynfr-iMjUkNV(k0UNBBBCdxbNumid{ZzNjSIU4u%4Q*%Y`6 z?H-4ag+dhwKG||hEW+q38?H#8qmT+?VpZ+empWa&1%D-Un`Xg2p^idX5iaFmduhz4 zUh#L@BlD&z_6TpuuOXGixN31s!CBT95eZQ!L~f>d;CZC zPj{Zpd24FZrMY&NE;4p^$}S3%p{(!m3Iekbw?9^Oudhx8?K8+?k=VAyQj=@;d#Xe2 zkZ)`D1ZBF28b+ggEvFxy-_tRDv1>9 z&Af)iCydnNTej4rd4#H1p3i)ni}kv9B$rJo+_^LLiPkCV?L0*NK2X2-u;Dd592tx8KDtL`#UCzvvWh-5nezyTJ!PMEfWPVa=?LugxFe;Hr>C zE473CS(ZBmL^9T}#adF@uL`(o+O@sBMK`H>iYm954upr09ULnRl`$m}VBq8er%y`X zxj{)?6ZWLx1PmcpoK{~HiMw{t6X%>Rh?{E|nODFN`vBSNDcXP7PINw8E^h(g_H8rGtPk4Dr8OUD+Ns-+uD>TdJE zWd}(H38S|-Ha+Zh3`+&w4_ht>BP^yyh>JrX&!@E2WAc}43rJlJ{LkFgmCM`I9LM4c zvNnk#U`BcTi)-NI^wM-09-L5r7Wrm9cg;+dx4>4zaQHkKMkRJT-8Na$PnaKg)goOG z#DzhYFbjzQT{Gt;Z=qAK#gLXfN=IN=R*I)Bf#}U?Os9NrvWdG<*;3GHB_bycop2@# zF@8->c&=~+dl0Qaa>?cu7~XyHkj}-zU|RhtMu)ubb3dN`N|K&9W>f96_fhJ~?Io{1 zT7GrLcS9qKnI`9_Ekee!A6Ov?xs*fi@!M)DD4hm z%gyKAMyP={^5>0RQCBRgO0)R_`lD8GWETm18eNWl&it2=$=34EZ zHd04JY!_tKZ3=)9RDK#Jeq?2gegXVAybOgfbv#zMQ>6lV-GF>;CSc(t{57moL_$Wv zfiLBqzXr)o+dupxCVm*N#Ahu%CVqdxwyNmk7OI`V(LEO4IKx>dMDfU$n5wcENns{R zLq#$3Od-gS99QpX+G@Jqswn-E=|B)p+B7@7jwAiK2yILiW&k?u)`wG1I$L>K8|+TC z*^H%R^XO}VrK?whfv_H+it5(+DJc@LF?#O!}Cn&9V%vFYkrwlFrABh z;Mp8^pezh}{RzL%Ijm$kuuv>nn#%P+E)DVdKW(N}3raE(-PW8=zw64T*HCar8M;Pt z(^GD?hF}>E%p*Hz$tkY8%`D8veS4CoV6}=#jP3V{9wl8UHoz<&Y z5e^zQbe?ez+>}%!>3P0Mw!ZVhPMqdKv+z$(MdxMo&G=_7$s!K+1Io%L)<^vQV~$?O zxrU4pKL~%h_om9Y25`CEvx{go3^d9BR}mn#Q5QQb*2A7ur#ve=(JkwlVi}*8T=}e) z)++C<+}D~HH1S!1!}t99ax2aGd?U>kasO@ak^@hernHacOUPZ;I31`ag zPeuiE#x2PzZiQU^=884Epy;8L~OmxI6+&Z128hshz(T#|LHW;>- z_DbdKw-J%`W!=L9Z&_vnVYs3Ngh(fKDs`MPn{|El&D!KBUGOcAyd)jQtIvF-YEGY8 zcuUz4s6Tg>++Eo*j}5RAyI3s< zM#x;rtAr84v<)ZU)gF{~6Ggrd6eTFAO6t5)8gIqvqis=l-Wf zxz#V&boLjM#CqVTqR)*@kgIILNo!6m*XR2uqZe>Qi%a9n-wnnj4Cpz?wJ}nKV!LpH zR_=9GG%BQ&II>GQ3Q*@~cqh*l%cWSQ4-<`jYaq<7yaX^lU%^*7q-2CTKfUMjW`$?j z&Ilg$arUWNSV696MXi6+1V~q~Z(m}%99R|c%`9sb&}uAJw4dhkT?WKlvrZ^I9~LuqdrdiPHp z4libs0U{NcD^N@vhP*#>MfjO3lmZ)scgSo)4v+EvAXv zGA%t{c_E&zr&@B2XFjI4hl`KvV=y=^VtKiPhB`oBU?^UE$6q>}a<6Ol^-&`d4%myc z3KP<9eB9>;*rr|A?E2WaE@mP%tJhXdAef~GY}@$K`YEpkCTTPr2`EO$cu ztc`oDY0do%oN9rWoBk(W@ct)W@hG?nVFe6W{lY}#uPKh=}OK$ zm)`B}(Qov7qx(nIP)WO%wxs%@np*Rl?eiw#S@;Q5<{cqfp%Rnf-M*qgEz|rn2>MpK zz%T-5YD#;716OB+!jgv$wHFR9WKYJGOOA@9wbyKfO=78TVGj*!TQ;g2Pl zyuw$BJh7hjlfPP~QC4xFR&anB$c_s-2Bh@NffV@nw)>yKHxOf%cL$uYTru!yq+Ss%*-i?^CE`n@e2+bKu`&2JdifsFF=CjDRaAjgN*RuSYMGV2 zTPLu4gSgL6NU@|@zDTeHfG&TyCA?TzzEgRlc8H9{GPKaqLlKx~q4<^BYlkIVJ+Xk3 z4he%mT`%L56e-mSzXE^m;X9)@DNIx@V&?bDBGJT6^{&d1G1k?To49c^s7yoPig!UjY{S#z*N=+m5LVlI8Bu*&e z7X}d~%japrQ$^_rmBp(|dV z)Pi{(isZ$b>+p6F1r&8eL`QTNY&*rZN!hBH`>8k41w| zc>c74@qKjV-#MmyD$q6~uL5a4sOx2dEs<`ZysQ`!h3r7OS5dT<%5rZn3tZo?%}&0Z zzXEERgh1R057v}SkC2f%+i?2cX6-Mf| zY9wk5~mqel^*7%!~aJu6IBt;wBv1Pib~Za4Bffm3Gn)~4s`nYAg+>; z3k;3t&oftsddB5XD1Jldrhh$FC|4IswZ9E4(j(3T`6wF~NdhC=p5Pda5!B>;Oo)b+ijUS zt>+5Ff6_8zjHm$R3me(O#=o$>>yxJ>xN!}0-dRwdzQKLy>_%YeLI@L;tajAnvy<8k zNj#vbvwJ>45oCL;2O#aKxbUeDV>J7Y*cx;P%LVS4e6V{_S2hf-d=bMRgzR}HI#hJ7 z-7r@gI&)nc&q{~S_D?rFhty`%?+$OjG0<~+puLSE!ZR*OdE)CkB8{kHil4nmqe>eI{0?*mH0*2X98hT{rnAOdd|2>Fh$ts$3P@%!-Qaf zLBY|?gz4Z^YM7DzY7L`B8OH>B1jht7pDo+zH>lBq=E{Wfv;YGb#v+pv)mNAAr z#?=ZS#^Z~&I%$O@8AB&Z(*p=n@fHO2h3yFFU;qOyy>2}Q4t1<8*^&MRwvTzcFY~+{ z^Ssr!2i9|T%D7?vWe>p!8xWMU?~w_itPodSaEzSWTwG6;VVCMLU!ht7t+>rvY}&M1 zV3GA+%5PkYu($X&4K)R?O4-{qW|e2;o=#fz+yxIX2`1I*QY$=S+*<7q(jtaD6shM? ztSa@k^abcx_E~gzwAT_7f;k{u`D=FgHLiqS2n7LQvEk`zzS!pPuWm&piwvAPbHdy7 z=VusrF{!Rk6?FCst~jS}k;?-j(VP583p_HWHK9)!6*e2W=;Q{ZqHLP9ujE(RFaC1* zfY6?Kn;n~jLG=E6BD*klvu^yJ^4fLAs?{o;;tHD?PnY^qMbPE?#%(4d8RJlj(ncmg z61II&lCf63G!~^3^zSvh zcKbSLP+%rZI~%lmyKB$HbbPEj=T!u?prt8RlXJCRyKn^;D^!sx_eaN*q1%k9MOkeNA2ZCeRY}LYyam&f)=21Etu4yQQ&ZD25HT?t z@S?%(??5y8v@7PwV5r?xtt&<9^m@r`l)_8&t!>n9jZcl3##}=qlX`yz-;^WW@r(8v zC`xK;xFFh>#w)9RTP3&S9s%f06uIUGSMiXs_Y zSHIOZVLUu&^jvWd#GP6gQddMn<`AD;EHy-kdWaAW@KvkiZQQSDwFq{-fZqt6>(We) zh{0ksT$SkAsiV&;O*|aZkhm>H*McD;E3^ZjJa;JE$|9AC&-20^)G!5^Bn!;!8O~3( zVfievx5^f~(F>nOk)GwETLs#)ykbq~Vc;7T;nHyDp z{*h+ZQMGJYTcD2fT?A2JB~2v8DoP=y8 zHe|q)HODKtGJ&+I2V`D}SZW#cC+uQ+IYa7p#J(JgJ4B7NsGNFnl5Et{cPWuE5#=N8o9g)eyIHijld)xR|5DB|s=#RfZ zd7QY4?cKD2g1#4=V9XTJ_U!VJM%T90CmwPcIX(X}+`NeCtgc1eoK+fIVztiG6uroE z+dEPtiSHZZEua~GUpsn~NS#udvvKP=%IF=?q@o|~lp2kPN$@woH&3G{4+kSFh(R9; z8Qb*O$=w;%2rHEZ8JTS5j(E(BP*W}6YEs(D_l;@&PD41>|mF`?vPo0tt|_MdC4+g zBgU_S;{jywxUaA{VyL5Ga&E;t4wZG=Ez&=wXH|sQ7OZJ58K6oH#HHna>uH?Q<^j z=zoQ8$Z8e<`;ob2=ml=*_E|428jkx2>qU`PbQf)Yt-S{x-!n<tAIVcT8bqv8k5 z8~bIpk2UnBJh*iLns{Dxms;9m!@1|)yv}(3LGE%0$V!35S#iq^G2rBKL&#fD7Z1@;aIRT3WP6 zY-KJRK9doCwp4EP>II42kPvq<{o@FKZ}4?#3xh07O@I~+9!%TfH=;>W z@)`_20S)8ygWi$^OkF-lo% z29w(xDmm|F^(s#FoH$CZg^}R9Ts9)~wN`Szc$9uAE$L`dEv_CSl{-sqRmO1$2Vu45 z#GWv&{5>(aIWdttLBvv{M3?n`KsM`A!#kGZ95eNHE+}CMDZ&YNtAGYRba4t%HcIH- zGau;<@^M5TyMRj)L&+Z2W`P#iQJ9}}rn}Pt`As4KMebLTk4sAf;zlYBt-b5Ghe-is z^WulAjpaK5aRCo*G4E9Jb!IfX2f2mf!uOqos8_m)Fg@afXA!8FXoG=m=uNz;1MsMe zt2*b2&ghWnLSF=$D|IZ3`_GWGDM9Au+D7?P=cNkR4xNv-Kk&9 z$-W<_!oBYk3#KK=VPZtlirqJ3-NET}Y#DH5c;?_sAI;xLh2NE2L>?>eJKJvSHbuU? z+~q)Nsj@4CunP&twFL?UU?;ro$yW_$+)%Y85L*0ZPFsg;c;>PunBy{37K|H>S4x{k z7Nea9r=upzjd!X{x~*G|OHxWMFhp`FzG95C!MR5O4^IqlS)n^xhL7x-NgY}_OJF?z z$pJdC`} z6XeN&IZFWZaUZ*Bi`ULJy9$NL>1C|6J)ARL%ayTC)HuOQS%W8cXuMc)4)J_vDZXrp z0kOGVvXn+S9!TViMcXv zs=u0`Nm^Ot5ejKp=I$~mO8#X@`Hs-sUr?d+3xBOWg9ACt(#L%fi_=^l(z6UMEAp{r zdA@>e|3JGx%mUXm&snlpT9eOE@kDXU@5-Fxsv@DAjaVhb&+Q?@z}_PMH>t;3rNA}< z`NjHQc-(hrLY-x!MeWZPvr?LQj29j{rfoK?vTEXX$i}`x2Zqr37>p9nB9) zUT37G=$^>v<+85vAGxhTua}u(<}zcy!P0gpP5x_P>i>c0`2R|nVi0EmF#iis;{RV7 zFVkNJ@c$;OBI|#UsQx{x9xqU$+LTQ0qY?fM+D=3+3KK@%L(I)xw5^~Z z`sBH~kt^bZgaQ+dpc488r1me6*Cq374RqCnu@cgPPlH^Np}M*HafX3;8s2svu%qVq zaqZ{s2TJL#KW^{K{@dx}$&=STqpm^Y>He#A9?+}UL|K0qDv@R=g?`y}UVUUxUtdHR z5H{Yw8Fy~B6i<2D?PR;5)*k8K-+P|_;pX%7QrYdd##_@q({a__{`2XHr0+pyjkYUS z`+8>kVdYYR)>zH8eZ`4plH%-^u z=EF(?;3(m|Iv_{sTuvbV*MZfH|JmDuCDiRL_oq*D$wjeMtosG(Ne#ie*K_^iI@(LT zDlp!Z=n@K6xG^R4cr;p5$t{u8*EGJkweNn9+w8LzBE0n$m(=tY-EO>d7So=2N6iaO zkA(FGIhayuoiP#yCSlAnxA)a`ir1l0_07VQDX94o0o1)ib9%fCMhR0|xN}*VwT9y# z40$eFWpM75MRSLFzi|17=RB_Q(`VfchJ7VE>%SWkp(f>O3egXF=BCP$!PDH5()fN8 zPOvhQ=OqWKiBplZpP+x-5&)sRI$uFl9d$lp;pZE2ej$9&TO?ecePobi^vK8I^kwAB zCja{zk}Vy)B4K|X#^hV=U&6j1?!DiduK!kLKP z#GTh&URle~6YTxhsE{%R4LmaM8wGR+a3t)VEi^QFhgZ&o=0L~dV7>uBa^ylp_8Mg6 zA>T<~h|vhjj?_IPQJFfms3Wg822_BuaSZ=sJG;Q<$4~UD1qqZjUCu-4q~#+n#eUtr zu!dhn@Hco9@(q#KtO}xa*cxe(iy9&|=JkZ1rLn&p$kHcNU*vjzh1d3Agq(4XLkI6;F+Jw@J@|4*}BMHe>=s2l!FZOX{gihE|gkKpeG$VU|keuDRixNoi$rwRn?Or*P*IOw!O+zhc+Qc(;J>;Ro%mY|N*AVl|)_GlH#RTq?^3)_&|JW99 zXpL!w2Kbaa4hO7cLudlEMGSbXd`UT)4+#+1?Ua-xp`Io{(pBI!#x}{s7b8jL=qVLE z51B0S3=izQemc6tK|RL!NorrEq-U`Dvo9L{UTO)Z?6nEVZ#9wB-%o+IZFL_>D#*tA z3_E~sjd)M5Irz3sVlEHvop4>3`Ji(z-5*mBPB;I>{WlCl_a#>Kcty7;DBnsg-7%qm zV4KH+imoKX$iqd-cl=mVH~7@f5q|W5Gt%#a(K4x#^&4u%zR!UQTO+(Z3#H?(=waJZRFAucd_~TAh(VDGPi4%3J#RDv9_YA9dv|6OlH{CP9`OOs9hQp^THW zTgH4T#C248CHt@>&T&jfhubTo6DlZVFxi_tj4umKqcLM9eCinWiE^EgD=$wV3zeOj zyJE#Obhgv^2+pOSy<(la3q6WoXQ_IXhK^u_7(0+8f==A*7GN^a#(7Ih7_`}&uup=( zyai=SJT2KXD6$916OD$x`(ku-f}M^mh&JjR3duILZk2o_>9xxSFM1=OCaN?_v`1cV z|E46wjvj?oRDbzBddO$_t8q;2jfI>(yNb~&Bwu(ki+@>VxJtTZ{;N2h+Bgg9Iv{rBLvH^IM!;aaSVILeA&& z;LKddqK=zhf}ZdI47009Fd=aIw=_E!W?2;j`?5JMe#m_GQ^%Vsiu|~5?8-i|qrGUw z70YPhO}l20burVHwhpuxx;FVmKB2WDLED$vz)J$qaQ%ogeC( ziEa^t@XzoH5aQk(+{z?nuq-|*zr>*) z2MIMwzB?8^N^97mbW;?Vx;l?oc?9K|?J zf+=C@po{c8js`)+oqPS1G0(o~IJR71nop_Xx59Xn&i{V4l?96Q35$Yk8L6 zD!l-=ovf10j1vkw))I7JZ_-|6UCX-7r6n42WN2H7B))spa6}Tm=@b{G!*zVyY$rwX zQ`!n>2(=SAh^vgH(6Fm$B5!4c;^hK*IM-j+XN8M1*;pDfasn^V=#y3a_B@NVW?Fcd zzy4;0>}c2=$X?$xjPUjBQa;R)hojX;;jTLp$C?N1ay^qw8mWt+v^Inm7|lZ1c_=IVb$#uOpyic+b}_J`fzJ$; zmD_FYD@BFgXPgw&E%QM}a9il0ULvL6rL5ZBA%vw?C_@J`cKpSX{{33^!lt^&vr74T zrax1aFfdQZQ#qxc(f11svFDSK>gV$DlA>9PxXZYa&~Kb3D)8UR8|{l(HGE#x<>A~X zD!V?RlV!qEpM-41mcr8LU9yhF>vankoAGxaXgN!Xa4f#j2~FKi@pdKS?`v-?{QSfY zt>S@c-bbCZVvew?&YM)o6MN1=uz6qQcCSVc zo;{q@1M3{T+X&=tv0QSqqgNAx)bHRnt#iS0!g$HmbRH7Lv!7B!=cv9$%;ua@`i{}(^55r<<#xCO9i>&BbaoKVn zA3}L)hM0y{a`$Uk${wo|2KJ1xtM=;2(qcpoH=Ui4P#hfL#%W7Ssiv&>(&MH6Xe4Qg zj~KJ5?K;es!;IE?ZzUo0c-&6BlZxi{#@~{OI z`ozopN;HN0AuX@^mCIk8etbw#StLBgvpU$m7a_cx)bCyuSv65d=&Mj$qYCe^(3Nx1 zw#pl159Zi{c$6Oi@1QLr=&)VysRVdI)-0Nn$3pQuysf9Jot<;y3*5;ZTp&+8!#squ zohc*Z=K+csJ4v?M`=yUS$=S$BL_4>d7SaS0C-9vB3A_jw1C3So|*aZ}q_gX(#!q~puHlc9MGIo)t zQiXiV5eOY~S+NEuq5EQ(z0!nVW56^;j;w#+--n6i6XdywveA9B(}ag<=nb;&Eu?wj z5nQfSiJdeoyQLCwiasjsp>xO$&B3SsE{30Ga!fFwWE7AG5Tc5fe(-VrEhYA|k^5XP z$Hj&e$9ek)E}E8}eBBbAO$lGeGOSlg?^J@(5>F90z;5H%UWAQhlnVze zFO&JSTkk4&*na7Bi!eu-HN&E0+g@tUW;S?4Ab6T3;a1VW zo0%>*Oc~HSs|ycqM`-Ml*@Q%WnD3_s6CE$^4AMN#m#9Q$RBwR8P2*5FDMD7E=Gpm` zFC?FyCUkZmR`>#(fK7F6*HII420$R!T**XXdi{eqBMM<=)dIY+6gn4CYo;BHEefAc zyvU6jfXsD>*&QB_HGjWC*pZ$2KnNRkSV%CY{F}DgsGIOXsnsRx=cRiIU&c(Ey!Q`8 z5%DWFq&-kA#siw4XtE{GK0@)xL+v~Y9L`$g`qYQ6Dk-I-GGXg(aUUM3#nW2Ym{PMO z;Ti{7AFW=b&9@o=6cy)CbA&wIrd0n6N5L?BcSk1!v%R8$-69v@gWEkmtO}L)Qf~Fd zy)!c9*;Q){u|lFQhC# zc{;%M)z>nXfve74zgV?$JH0qe6Pre)-1gLr409182cyl z>aW-JKSFPTNMpwTIq6o)6i86Da`mE<{1+ZDkZ|n!rw}j_>~Gi=gQ|m?z15$nC?Ku( zuPXNM)vUi`{!T&%!2B0>s|WZy+rR7nuKDK_|2s70f2F{RNQwU0@1G-K{zv}R-{S$U zR&|h&5|uM@WccS~8ALVyAdDFqfE!i3T!7f&KZ#@jAdmJhmKRv%-+;OR=0BcbWd;oZ z2g|>tcm2Bw{`tl~C#c|TYUT_iI#d30H^2-uWityapySnxQV5uAX7(o(&CSu#*39k? zcJ@D{Z2jHKKP&y~)%dq*{6*;g7qsU8d%3=U)7k#R5&yrCf&UK*U}OGA{@eeauEf9E z?LS%Ne=GmdPqqwu4Q+4*&nw-f_ z7_jIQsbtjf!h>~fCl*9-XidNfwtky2y9g{CkM6r$1!(dVZ5H>^0p{ z!Pu}AjEr1lOdE@dI2JXiD}$bpiEp5-5n40Y{$(>k zXlTR-{!zY%&bQm&!!UU~DrxX%(VxgQx!SKUj^JH~Jj)&tgKb|y$vQ$cRW?8>++2;h z7CBMAH6rkbRjI>KP*G#iymJ^O@@e>|7p@ZDQ!BQY&BekyT!uhOcMSHDVF?XBrASi< zhxPG;F_tq1rU82p(HAe%QOrZqVdQ=7Qz5?bnP%rcM`l7R&ef9me^tsb5Br3hvyobf zK>XIBK=7vru_pwev_p}<2U>OR;GZh|N7`j|r$|&LPtDBtBJ}+exMm*lTU~E{=EpAj z>nX!Jy@1mM8TCZ6Nr8XYfD5n(5jpu&BEH3^BqOwn3Nu}+g5*XVW=$ZCE`4-YaiK&q z-*mX}FaD1Q0`5SYZ4V16RCz?0gL$OFZhn3!EN5O_5~ zoFGAtP64Do3Pq5eCRvaQda=C4%EYos-#zgZMMac8;3DA*@g9^y1N6y5WLsLa$P!5O*M2OMM;?GD{}v^0s3NddFb7cj>_Upvd!}1rNz2ku zHPKT+4x%D=!y8FrE?xzHIIY)#P{O}VCea{1FDU!N4Qqu}aG;!J0o_}|ff%OXh)cam z1Tkyw4T711OI{_6z-RJc<2}qJ`Y=-taO7|yv{Oy7QGlrKn`SNICII{!nNqY_tKQNS zDuE|RP4RVmEi0=oK{idmm`_x2Q{6op9;=E_4if9}p8ThU*#-vRlm_{QQyg8!h;0V? z_Lru;oZc!;o@(=ueV%sn{a_~oz#aiij^rNem^Tk#Rm@N4EA9aIzTXWOqYeA6$q88d zsr$F*Oz5etZ6nsT2HyKBRD6SN#UO@TNcGBoqZ@LL++GTR#OInNWJpO_~{D zSY%eWBAsj?s=uh)(n05`edU<gxupVLpacixJ_&AUOru^ z#b>}oiF1dC3wNAs5I^A{J0nK%!4^G^(O~ALp{ykwHDH;fL3>?-YjST5Z-CVr4VbDD z+zwwI)$tf*Q>VHWR)L`Zv7G6)L@CK4!&@G{P!jG`hSE>iAi>)!fhypbVCs!L@h##q zX(zzcHIbY*BsJVzFzne^%pohd6Fm0rgdFUqd4ZHZ7y$ZPZwdXHTqJVDfy?(QFNuTX zr$THmUt_mhucnD5+p|NdRJh1@TTz=VI9q>O>|E5yPpHv?m4lRP15IE)b zSFj5VoGv!v?o>Q*x-4o^p(SaY{;L}&`cOiRA@~X;s-G`((H3Cz4qc}M4UUsZ@)1Hg z_r{t|4>URVdA%c!G(N$Cu?0LX7+GNNsH=fgF2QX$^@dW_?wVU){WHi~dkQ|es&t^h zbJhg?tSwd?P1qPeYHlBe7ioPd z9I45M*!a1~EZc%S6S*NVBIzl%2Tq?*5cgM{O*-96Nr?{DYKR9Vor4bL7>x_uC%LST zk)yXZ|DVRcEp|MU+4sLPwvXG>K+iPQi4Ul56mxUbe18 zMzgq=Ag+~-q8}mokwz*%bcfz>Mcaap#QpK}y~+oPCw`{!r3Ul|eV%4gWP-7`J5F~D(Q0uMl15N0EOPm$SZ&>J2!H*rxXh@9E$ZlX_B?G>)mjM)l3754*Ui;^OHuFk zX5up9eT5t%Px{eko++!A9|XE%*nK~XVbCop5i5Umx?_g5yYW*cfdcZBu7aUU!iQXD`MkWTuYW4CQU~w?Wv0D@( zs1{C+hkVDDj5C+r3JGBhsfmMDV%x5CJ`9*v;lnka+)Oe{!dZTi{?Kd_DQc6;n|-`0 z2Kr0ZWx@ZM=2Zk64sA2^3l=ZLv-UsP237g&Q+5 z?_KzxFy_7rJ-_ZVKAxjL!lvpzbs*>uvkoZ8e0IITrfxjt>94=X38Ytj6&pWo5c3KA zeTE@HFY_zLz00^=fZj!}xIfa%fu5vjn$7VMTy%99Z0WavqFhn(0KK`0_X59VR;7_v zxxBY`i{sj0mj8tajs2+@yrb^+EYPz)k~1N1onjjGlw!^dyfzjh!F z3eiCERy0`v$G9ntkCOnhvp(CC?b&3kxHQp9Qxq8;^maZxGN#x!IexD*OQ~30GN+C# z9byeByenoH%qiSohG;CkC3`<|%6jLQ>dD5Y;W{@4q#`bXW%3z*dh=KGVm%;#Ibl`D zWi=(=f&V4D;XNgYXe-4ehiR{aS48G0=sUu?R0}?iN#H4iarHp`-BO=-QoQa5&0NRpBZ!=Il)#KM`tyNdJf4p-Lyp3Zn%l$!PRs3fF zk*!EazMKLkPhO}{vU?#RKH{(Sg)`0UPBP~f?p6AJD}6;q3ZH2@OhNX_G3G`?BW`f@Zd6 zmOzcf$R5CJ1h8~AGv_0=bai#)W?(QiqxZ0~v2y$qi%#$0Y{Bs76N9Lfya780J2Al3 z$l1com5Nu+d(;1g%502`od0#{KU@CR zrUL-Q8Y>HX0I?u3@DzvuW6*)|U6dccLF7QJKukcKK^#C_fG=|pSCBdo0Eh-~*%`zX zxWo*?2*L!y^3N|>IoOK=&kLm}H!~wJ^oo^{gOQV&i;10vk(q*#kpehO&cXD5G6EPc zZ|Y`Z_P@6Kf3M52{1LtWDLMR=qZEv-Rb1^D{hsikxsRU50eH{7AKO0%FQKcVlTWGC(#{ugF6%vV zCIB%dnaar*5%$VzqZ6A^DM?urDdH4X#!VxYBORhvuf>w8d1Pg>tbUe1z+dMVbEikO6iIRd?PK6sF86tLrtOZ656$pQaX&HOHP*UV5Ry2YJr;eohqABtlup)mD(^Y z`Rk82UZwCw$J918*A-W~Q*H98Bksx5pRy!eQ##tD*xx4am?tOXg~VCXDo}SVqU2T5 zOjBP{QD>q>Y3wKiTuXOPtcqGotEF0`sCK{9ap~z5)hfZJWy8rqHoDR&7KmD?hVv@8 z%C9KS-*NqlY$}6)&6%o}@s)p^S|kgTla-D_r)N@4EGh6_PQ_*x8=bB+uSf^RlPl+z zYbh69{TNpjOGWImuJW&HORj2Gz32Ew^Mi=lPUY1}Dy{AmnL4^Omds2j&JbaRsa04y zEmK*g6OUtAy0gq$rc%oJHCGyu4GujPCm3hp`Gv`VuQq?1oNPQD^|i7HRDa~>5~0`Y`t*N6sJYu2d7vga%ql55Js z=Rn=`gU@o8>hn+0O}XfjXmlCYzQ&cXNf=})xN+so)}+?_r4?-70Ke$xX#GX<5AQ3O zEjg=%!_w(0W>OcHLsOl^+|()2<~6N(ZgxO;PqIiarx(>In(fiZ%t&G>VO&bWsHlE0AGDm3OQ;OUNLyoxWtOxRd#iX7 ztJ!8}Hx5{A#a|#)aEWB8$LlbUwj+5!U_*LH<2y&wmTCp@u-XW%lwSL4qjIaI7YQxk zIpT$h?@tv>jkH7AMN@S2(tW{*7uPCwV750v8|Pqj&H{xD8`6vCX~B0cl>Wc~{uA&m zbAt9f-rAY?bX&~UniwosE8`mj#qNpJzoLG?V()hdh~S$AohoN3(RUm!6t(1X8IJILs&C-(aO$5{J^g{tO_D%K`5mQ>39u9ndV%FWSaG>pe^tu}h6b0!s;&Q%Q88 z9McL~#%8|O7Q2#$5yC~6wY5d|z-f~fhcA^$h3p7)QVE<^@^^!S`>Ns#?~B$D+(kq< zW)Y|YyCEGEw*0*r&o22pOH14LT~L-U4Yf%U&?U{qJR)3c*ANz!=&XSXVGwddc{JD9 z8=TYEv=>K*$T)VgBase4*qr6!)8-XYa&@wtMGmZrd4+UroRloS(D$5E+3LQ~&Sthj z3v35;5|eBsQ-cIuMXA=ohM*-V$5CxTBtt#pv7lzfWX{HnUEuu8x6-wpF^T|h==%bs ziJvfhs_MjkTS0Az#n4B4?hHk=j3W;O`Z!SSQLRt|25_CMqFY#Bhr( z=3^=EVKl9UHV&#xuC$#dU51er?_;(w)qMXYW{B` zGfM2&*w^XBx()IP3wlwk(sA*4Rs|dq3X+rubAf2jU+9B`+5$I#@zG?AmRwj9LCl7= z5Jgx4hbOKPi2%rWY2hvjLFx5_FU_Zvh$P6eMp#Oc_)Ku24j-Wa~$fuD)ulC{SQ`k2AYg5$qb<=vX2p+KgK_X|&mAh9Y2RZI+IFvl3e zJWt>mEn|%VymEyqnO!r+K)fJdP@HAtq%h_&7xkj%@E9Xelk%7FgDHoDaHZwl z*5y-JVh}JaFp+T~676}=er#Hvf=~YOrx}Vz*AT^@)b~!zrqrGHl0)vnI+i`#An4H} zk~>6DvY5aE$)CNXK4ENwhHyEPOx?q1OjV>1A|R=0ld#mkgn8f(3xHYe?SKRc`mqFSIEtRtvKD;YQY#ASsvk_ zec)Odyj7JV-6;yAHP&S>FdA~1Sa0}wv;gKI|EL1d(Hd%*D3ACZ1B)2cjEa^8=aZNY zqgs65M3I@x;V{@6n#7(~AI(iSLd8l)2<9PHv=$&s2YA)7-T~r_cuJb$Cej}gq==*` zbmxKEqMuipla-vSj1V5LX;G{vf75nE79semgDh3}jPb7znaA2oZx7YOi#}lJN`Z3l zo4A@l!0?mr3>a>Ko^bJlmo0P?;}3NXH$yts-C!SV8O~>doeZG#G=4SA@`Gs13d_%c zoPrW4PsGVLa{O|OPeSmJ0e)g=n9Wiar=tmD-W3wD@Lg9H~QsC`zij zo9Q5BR8M(>y;#tI9OCpG62=F>c0z)@zlOF(E?;Mn_ALvVNAtMGO96koxBTD30^j+)4;8YfTQ~eFe|NlRzNfywGyKl0_$|pT!a-u!)!)}F zn4k!Ix;c4rJ2CQGp}F$uWWz$Jo|){3u{!pB*r?x*e#R(3zUmkIi*mmH?BqVvOaF=X z#irWh3UKt(y4RUFVL$7i*8l)##r|rOu$#@V+sX`nnYv zhcUO9mkeVDHT@lcSOFKF(%rZ1^0{@$In$qcPTWo8zqQ|aa;c44($dMut%x_K1n~6r z&z8akli$7h@R3in2a3r30^G02a|7Jvvh3~*;z zq=bxsObA3 z<;pb8wUn{rBA24rn94Zmih+3`{UMr-6F!i#%+l^?zIaz$>x%{v@av|Ne`Ti6yJxxl zFyg~Q!1q_BT)^T}@lt*K__ofiqJjRocmBJ&#^!6nVZJ`WhgT|h*q4YyRe{xVm0mge zh!SoJf#-Y@hKV=2b@r54l-zO^KmOHhnY&u~I*T)el=0yx@8K@_`10ZQaGr4?M~5;$ zes;d7D;<-RIzl^Jyf4{O6nSw?ZtHT>~II&AS(Mo94eq zPC>krFO6LM3dt+?%q|C&o^``yX8}s^QTI2T48ll_f&AL=V zeB1KsW(kdiPGP)-{S#DXecPd<++CMwQH4rvIBp*Ks)vq(vVXGM9DdM zW#N|EptlVv>P)@u6jH|Gm-Dysw?j=m_T__JGUT=L!^Riz_O*lb_h^R-?e>mphHM{K z-jl=DolD2Gw!|LUTS-@a^2~#mwdQI9ceW>~&Ea!@kBT-}zqpcsl+H3K_bBD5WqY1Jt<~1-3lMN0X8tgZ{^*Gj=Ti3r{plaCp5oW%zfP& zBeD-8o-ZaODLWn0=jH6|Z%P}WMc&?Zla}xv@!pi4)F@7ek$k3Rys&gSrM^VXp_=VE zSFvZ5c-an5TR5-2CXj@ASxD#m2S!dxq@~)se3!Om-?{wack6Af==U_4aZ+Zc%rU9i z+_Vx8zC~&`n!RB_$@o!kzTa)qE$<}}L_k1@tJls{+vNmCl4N}p znzVh}hAdMxsj^EtzR~B>?Qu%VW|pQlWTU#P4B1Ps%fWV28F7$ZlsR`oMeNRJjWy-i zY0+n!cUr30rO7tywqzMptiUMWTPX7_a9)I21><}kWapxvcRNTQ^9Y~0ER^>&tQbDW1{+FMB!W&mVp3$ZVbOWkT(T#ThtP z+ZUS)sF`0_9whyijypBVYyTT}?-*ps*X92fx@_CFZC7>Kwr$(CZQHihWm{dbY#U$n|2#KmWd-3X=q_DMH5p#%+SnU z0t+jaHxo0QVTr?#OWJFucu}##JS>v=;@F-49g`qmb4o@*r)%xQzoR4r|9LZSs~nG= zP4?|~{HxvoaIKKic#RLC7#A)kT)Zs|jH8Eonn}e8^>dMK%`udnM-T7!swg{YoXzdt zg(!m$?jVw!FXzc`^@K|E{Y-xV+ypBMuuhX$eKAetq}>*uDmHxVQ>F3hUp=xHEbuR@ zj`E?3V3m#$H+D`|o(%&9e{_cAk%(3VgTug^M4&YKeaS;o42 zwP)ewW|5si^E0^9y2w3cXqR*;DJSRTqSyGE%fj$u>phDd-Ej_Z^(hekeOxg)ogZ$t z?j`N0?$k4eAmi-Jdv2Z-=Tmx|u735?e~IVR1v4NTl7rF;t2{jtdfsa5Y~S z^0|#0Mi@?+I5_C5@X;%agFrNg55t~_CivSCE_GoFC7VdtV7lHhPBTI8QVc_RyOq{) z%k~TjNC4OOM%H6%N)KO)dQXt(00?1%Tz-N)eu8{%f*fIzTz--~ev+JOFA64K5+me^HFLz& z?FzRn0<=nt=U2mRY5iJe7UUWlRw8~rZe9bD3(#Y$;;sI7`=0q#98)Xyopss3tj zu6tG6h~)AIlVdl0;hvb2`PzNv=Gdy(l~C=*{KfLnPA!h0GlaI-yVI6fa@F5qTtZ37 z^V`q3$%A5tH3?Drn16Cc;_)9&o%WYVrT%;?`qRBW$oaLf3mtnru`A`%ur5({1NGqU zSkMXWtr-Z7ZtX>Th(U_rTE?t1`1&3F{(T!l*~J1xaG76H^NQf4-W-Qcxq@o?eT#_; z(|vC2%flvgUr2r9=|;YJ`QR!Pv7vdWq-5(EY1w67KEg{j+($OtPc}S2Hatj{L*Jc@ zI#*&eQ(}}#gOS95k;H;AIlQ}SBb$uGeKjRRg?ctc=!HdeI)?0&Y}01PPDc$n2+$H%5#dJL&B za;rK5?m;&areQVmb#vO$*#okw87_4^RIqM|h4Dft*S+DMqx~NUhvf@~qs%*(mAtZwF4zPiwyx4WA={}j4e z+h@j=U6TCpVE@>5nNb|G3T9pyV%&&tFmBQd&dbtbYX9v(b4V#nI*ťm4pLrzv? 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%0AUTwL0A@Du!p%&qNi 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

fb+3(Bp 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 z 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 SYw#8yHv-4O-Tr?${yzX+I-REg literal 0 HcmV?d00001 diff --git a/externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf b/externals/genesis/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90989c4cc27cf3135af011fb83b5a1394c022809 GIT binary patch literal 158334 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 R(6Q8Ut9M+d5#!O0{}(wUXJ!BZ literal 0 HcmV?d00001 diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/addBoost.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addBoost.cmake new file mode 100644 index 0000000..d833dc1 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addBoost.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(Y_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${Y_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${Y_BOOST_LIB_INCLUDE}) + set(SX_BOOST_LIB_PATH ${Y_BOOST_LIB_PATH}) + set(SX_BOOST_LIB_INCLUDE ${Y_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("Y_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") +elseif(SX_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${SX_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${SX_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("SX_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + +else() + message("SX_BOOST_LIB_INCLUDE is not set by user. Searching for boost libraries.") + set(Boost_USE_MULTITHREADED ON) + find_package(Boost COMPONENTS date_time filesystem system program_options chrono thread random unit_test_framework) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + message("Boost found.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + else() + message(STATUS "Boost libraries not found!") + endif() +endif() diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake new file mode 100644 index 0000000..48bd9c6 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +# Seadex preprocessor definitions + + +option("SX_NO_LOGGING" "Use when you want to use no logging at all (no logging code is created).") +if( "${SX_NO_LOGGING}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_LOGGING\"") + message(STATUS "No logging used.") +else() + message(STATUS "Logger is used.") +endif() + + +option("SX_NO_STD_MAKE_UNIQUE" "When the standard make_unique is not available (e.g. no C++14 support), you have to define this preprocessor definition. A yasmine drop-in replacement template will be used instead then.") +if( "${SX_NO_STD_MAKE_UNIQUE}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_STD_MAKE_UNIQUE\"") + message(STATUS "SX_NO_STD_MAKE_UNIQUE is defined.") +endif() + + +option("SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG" "Sets to use a workaround for bug in GCC with expansion of template parameter pack that appears in a lambda-expression (bug reported for GCC 4.8.4)") +if( "${SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG}" ) + set(extra_flags "${extra_flags} -D \"SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG\"") + message(STATUS "SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG is defined.") +endif() \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake new file mode 100644 index 0000000..b568fbb --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake @@ -0,0 +1,112 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +add_compiler_flag("-Wall") + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +#gcc/clang compiler flags + if(NOT "SX_PEDANTIC" STREQUAL "OFF") + add_compiler_flag("-pedantic") + endif() + + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + add_compiler_flag("-g") + endif() + + if("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++03") + add_compiler_flag("-D \"SX_CPP03_BOOST\"") + add_compiler_flag("-D \"SX_NO_VARIADIC_MACRO\"") + elseif("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++14") + else() + add_compiler_flag("-std=c++11") + add_compiler_flag("-D \"SX_NO_STD_MAKE_UNIQUE\"") + endif() + +# platform + if( "${CMAKE_CXX_FLAGS}" STREQUAL "-m64" ) + add_compiler_flag("-m64") + message(STATUS "setting platform x64") + elseif("${CMAKE_CXX_FLAGS}" STREQUAL "-m32") + add_compiler_flag("-m32") + message(STATUS "setting platform x86") + endif() +endif() + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # Checks buffer security. + set(extra_flags "${extra_flags} /GS") + + #Sets output warning level. + set(extra_flags "${extra_flags} /W4") + + #Disable specific Warnings. + set(extra_flags "${extra_flags} /wd\"4127\" /wd\"4250\"") + + #Defines constants and macros. + set(extra_flags "${extra_flags} /D \"_CRT_SECURE_NO_WARNINGS\"") + + #Enables function-level linking. + set(extra_flags "${extra_flags} /Gy") + + #Specifies standard behaviour under /Ze. + set(extra_flags "${extra_flags} /Zc:wchar_t /Zc:inline") + + #Disable minimal rebuild. + set(extra_flags "${extra_flags} /Gm-") + + #Enables additional security features and warnings. + set(extra_flags "${extra_flags} /sdl") + + #Specifies floating-point behaviour. + set(extra_flags "${extra_flags} /fp:precise") + + #Multibyte character sets macro. + set(extra_flags "${extra_flags} /D \"_MBCS\"") + + #Enables you to provide internal compiler error (ICE) information directly to the Visual C++ team. + set(extra_flags "${extra_flags} /errorReport:prompt") + + #Treats warnings as errors. + if( "${MSVC_VERSION}" STRGREATER "1800" ) + set(extra_flags "${extra_flags} /WX") + #else( "${MSVC_VERSION}" STRLESS "1900" ) + else() + set(extra_flags "${extra_flags} /WX-") + endif() + + + #Generates intrinsic functions. + set(extra_flags "${extra_flags} /Oi") + + #Specifies the model of exception handling. + set(extra_flags "${extra_flags} /EHsc") + + #Creates an object file. + set(extra_flags "${extra_flags} /Fo") + + #Marks an executable as verified to be compatible with the Windows Data Execution Prevention feature. + #set(extra_flags "${extra_flags} /NXCOMPAT") + + + # for release + if( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" ) + #Creates fast code. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /PDB-") + + #Controls LINK optimizations. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /OPT:REF /OPT:ICF") + + # for debug + elseif( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) + #Creates a program database (PDB) file. + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /PDB") + endif() + +endif() \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake new file mode 100644 index 0000000..7964d92 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +include("${CMAKE_CURRENT_LIST_DIR}/addSeadexOptions.cmake") + +# yasmine's preprocessor definitions + + +set(Y_OPTIMIZE "SPEED" CACHE STRING "Sets the optimize type. Supported values: SPEED and SIZE. Default value is SPEED.") +if( "${Y_OPTIMIZE}" STREQUAL "SIZE" ) + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SIZE\"") + message(STATUS "Optimizing for size.") +else() + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SPEED\"") + message(STATUS "Optimizing for speed.") +endif() + + +option("Y_LEAN_AND_MEAN" "If you compile the library with Y_LEAN_AND_MEAN being defined or if you define the macro locally before including yasmine.hpp, all the state pseudostates and the asynchronous simple state (with the asynchronous behaviour) are excluded (i.e. those headers are not included). This can reduce compile time.") +if( "${Y_LEAN_AND_MEAN}" ) + set(extra_flags "${extra_flags} -D \"Y_LEAN_AND_MEAN\"") + message(STATUS "Y_LEAN_AND_MEAN is defined.") +endif() + +option("Y_PROFILER" "If Y_PROFILER is defined, the state machine will count the number of events that were processed. The user can query the counter by calling the 'get_number_of_processed_events' method.") +if( "${Y_PROFILER}" ) + set(extra_flags "${extra_flags} -D \"Y_PROFILER\"") + message(STATUS "Y_PROFILER is defined.") +endif() + diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/functions.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/functions.cmake new file mode 100644 index 0000000..3a76857 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/functions.cmake @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +function(use_pthread varName) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(${varName} ${${varName}} pthread PARENT_SCOPE) + endif() +endfunction() + + +function(use_boost_libraries varName) + set(${varName} ${${varName}} ${Boost_LIBRARIES} PARENT_SCOPE) +endfunction() + + +function(add_library_for_linking varName libraryName) + set(${varName} ${${varName}} ${libraryName} PARENT_SCOPE) +endfunction() diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake new file mode 100644 index 0000000..105747b --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +include(CheckCXXCompilerFlag) + + +function(add_compiler_flag varFlag) + string(FIND "${CMAKE_CXX_FLAGS}" "${varFlag}" flag_already_set) + if(flag_already_set EQUAL -1) + check_cxx_compiler_flag("${varFlag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${varFlag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake new file mode 100644 index 0000000..c638987 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +function(use_rapid_JSON) +if(SX_RAPIDJSON) + message("SX_RAPIDJSON is set by user.") +else() + message("SX_RAPIDJSON is not set by user. Setting default value.") + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + find_package(RapidJSON) + if(NOT ("${RAPIDJSON_INCLUDE_DIRS}" STREQUAL "")) + set(SX_RAPIDJSON ${RAPIDJSON_INCLUDE_DIRS}) + message(STATUS "Found rapidjson on: ${RAPIDJSON_INCLUDE_DIRS}") + else() + set(SX_RAPIDJSON /usr/include) + message(STATUS "Set default value for rapidjson") + endif() + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(SX_RAPIDJSON "C:\\Program Files") + endif() +endif() + +include_directories(${SX_RAPIDJSON}) + +message(STATUS "include rapidJSON from: ${SX_RAPIDJSON}") + +endfunction() diff --git a/externals/genesis/source/externals/essentials/source/CMakeHelpers/setVariables.cmake b/externals/genesis/source/externals/essentials/source/CMakeHelpers/setVariables.cmake new file mode 100644 index 0000000..a6f1454 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeHelpers/setVariables.cmake @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +if(("${Y_STATIC}" STREQUAL "ON") OR ("${SX_STATIC}" STREQUAL "ON")) + set(LINK_TYPE "STATIC") +else() + set(LINK_TYPE "SHARED") +endif() diff --git a/externals/genesis/source/externals/essentials/source/CMakeLists.txt b/externals/genesis/source/externals/essentials/source/CMakeLists.txt new file mode 100644 index 0000000..daef5a2 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/CMakeLists.txt @@ -0,0 +1,16 @@ + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +include(./CMakeHelpers/setVariables.cmake) + +include(./CMakeHelpers/addBoost.cmake) +include(./CMakeHelpers/functions.cmake) +include(./CMakeHelpers/functionsAddCompilerFlags.cmake) + +add_subdirectory(essentials) + +if(EXISTS essentials_unit_tests) +add_subdirectory(essentials_unit_tests) +endif() diff --git a/externals/genesis/source/externals/essentials/source/build/c++03.props b/externals/genesis/source/externals/essentials/source/build/c++03.props new file mode 100644 index 0000000..d76c9b5 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/c++03.props @@ -0,0 +1,31 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + <_PropertySheetDisplayName>c++03 + + + + SX_NO_VARIADIC_MACRO;SX_CPP03_BOOST;BOOST_SP_USE_STD_ATOMIC;WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(BOOST_PATH);%(AdditionalIncludeDirectories) + + + + $(BOOST_LIB_PATH);$(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/build/debug_info.props b/externals/genesis/source/externals/essentials/source/build/debug_info.props new file mode 100644 index 0000000..5dc702b --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/debug_info.props @@ -0,0 +1,18 @@ + + + + + + + + + NotSet + true + + + EditAndContinue + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/build/essentials.props b/externals/genesis/source/externals/essentials/source/build/essentials.props new file mode 100644 index 0000000..8bdf813 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/essentials.props @@ -0,0 +1,31 @@ + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + Level4 + 4127;4250 + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + None + false + true + include;%(AdditionalIncludeDirectories) + /D "_STL_WARNING_LEVEL=3" %(AdditionalOptions) + + + + + + No + Default + + + false + + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/build/use_boost.props b/externals/genesis/source/externals/essentials/source/build/use_boost.props new file mode 100644 index 0000000..85fdae4 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/use_boost.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/build/use_boost_as_external.props b/externals/genesis/source/externals/essentials/source/build/use_boost_as_external.props new file mode 100644 index 0000000..cdd4e52 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/use_boost_as_external.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/build/use_boost_externals.props b/externals/genesis/source/externals/essentials/source/build/use_boost_externals.props new file mode 100644 index 0000000..27f07b7 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/use_boost_externals.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/build/use_essentials.props b/externals/genesis/source/externals/essentials/source/build/use_essentials.props new file mode 100644 index 0000000..9f7bfc9 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/use_essentials.props @@ -0,0 +1,32 @@ + + + + + ..\..\..\essentials\source\essentials\include + ..\..\..\essentials\source\essentials\include\compatibility + ..\..\..\essentials\source\$(Platform)\$(Configuration) + + + + + $(ESSENTIALS_INCLUDE_PATH);$(ESSENTIALS_COMPATIBILITY_PATH);%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);$(ESSENTIALS_LIB_PATH);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + + $(ESSENTIALS_INCLUDE_PATH) + + + $(ESSENTIALS_COMPATIBILITY_PATH) + + + $(ESSENTIALS_LIB_PATH) + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/build/use_essentials_base.props b/externals/genesis/source/externals/essentials/source/build/use_essentials_base.props new file mode 100644 index 0000000..7f85a09 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/build/use_essentials_base.props @@ -0,0 +1,28 @@ + + + + + ..\essentials\include + ..\$(Platform)\$(Configuration) + + + + + $(ESSENTIALS_INCLUDE_PATH);$(ESSENTIALS_COMPATIBILITY_PATH);%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);$(ESSENTIALS_LIB_PATH);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + + $(ESSENTIALS_INCLUDE_PATH) + + + $(ESSENTIALS_LIB_PATH) + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/changelog.txt b/externals/genesis/source/externals/essentials/source/changelog.txt new file mode 100644 index 0000000..d1a6a27 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/changelog.txt @@ -0,0 +1,38 @@ +# Change log +All notable changes to this project are documented in this file. + +##[1.3.2] - 2017-12-18 + +### Added +• SX_UNUSED_VARIABLE macro for suppressing warnings for unreferenced variable. +• backward compatibility for macros Y_NO_STD_MAKE_UNIQUE, Y_CPP03_BOOST, Y_UNIQUE_PTR, Y_MAKE_UNIQUE, Y_MAKE_SHARED, Y_UNUSED_PARAMETER + +### Changed +• CMake: use external CMakeHelpers files +• CMake: refactoring of build scripts + +### Fixed +• missing boost namespace in sxprintf + + +##[1.1.0] - 2017-09-20 + +### Added +• Support for Visual Studio 2017 builds +• conversion functions: to_lower and to_upper +• added uri class + + +##[1.0.1] - 2017-04-07 + +### Changed +• macro helpers improved to count up to 15 parameters +• essentials file structure refactoring. All source files are now located in the 'source' folder, the header files for compatibility +are located in the 'include/essentials/compatibility' folder and other header files are located in the 'include/essentials' folder. + + +##[1.0.0] - 2017-03-30 + +• The very first released version of essentials + + diff --git a/externals/genesis/source/externals/essentials/source/essentials.sln b/externals/genesis/source/externals/essentials/source/essentials.sln new file mode 100644 index 0000000..c96fe08 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials.sln @@ -0,0 +1,156 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2010 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials", "essentials\essentials.vcxproj", "{132F81F8-46DA-49D0-9071-D70BC087B38C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials_unit_tests", "essentials_unit_tests\essentials_unit_tests.vcxproj", "{6F4D72B1-E418-4859-8C19-D58659041948}" + ProjectSection(ProjectDependencies) = postProject + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build_tools", "build_tools", "{77439103-0A48-4243-8D07-3223DC5CF353}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMake", "CMake", "{86310DF6-AE4D-48C6-B302-80F5091FC09B}" + ProjectSection(SolutionItems) = preProject + ..\CMakeLists.txt = ..\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{1C08A7CC-21A3-42E1-AA39-7E03F88A73F3}" + ProjectSection(SolutionItems) = preProject + CMakeLists.txt = CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "essentials", "essentials", "{968024AC-A87C-40E9-B75A-B7AE9790C73F}" + ProjectSection(SolutionItems) = preProject + essentials\CMakeLists.txt = essentials\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMakeHelpers", "CMakeHelpers", "{35E7ED3A-7DF9-4E75-B289-99B3D0050992}" + ProjectSection(SolutionItems) = preProject + CMakeHelpers\addBoost.cmake = CMakeHelpers\addBoost.cmake + CMakeHelpers\addSeadexOptions.cmake = CMakeHelpers\addSeadexOptions.cmake + CMakeHelpers\addSpecificFlags.cmake = CMakeHelpers\addSpecificFlags.cmake + CMakeHelpers\addYasmineOptions.cmake = CMakeHelpers\addYasmineOptions.cmake + CMakeHelpers\functions.cmake = CMakeHelpers\functions.cmake + CMakeHelpers\functionsAddCompilerFlags.cmake = CMakeHelpers\functionsAddCompilerFlags.cmake + CMakeHelpers\functionsRapidJSON.cmake = CMakeHelpers\functionsRapidJSON.cmake + CMakeHelpers\setVariables.cmake = CMakeHelpers\setVariables.cmake + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "essentials_unit_tests", "essentials_unit_tests", "{63218938-B7EC-4913-9B3B-CEAE1F2A925B}" + ProjectSection(SolutionItems) = preProject + essentials_unit_tests\CMakeLists.txt = essentials_unit_tests\CMakeLists.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug - C++ 03|Win32 = Debug - C++ 03|Win32 + Debug - C++ 03|x64 = Debug - C++ 03|x64 + Debug - C++ 03|x86 = Debug - C++ 03|x86 + Debug - VS 2015|Win32 = Debug - VS 2015|Win32 + Debug - VS 2015|x64 = Debug - VS 2015|x64 + Debug - VS 2015|x86 = Debug - VS 2015|x86 + Debug - VS 2017|Win32 = Debug - VS 2017|Win32 + Debug - VS 2017|x64 = Debug - VS 2017|x64 + Debug - VS 2017|x86 = Debug - VS 2017|x86 + Release - C++ 03|Win32 = Release - C++ 03|Win32 + Release - C++ 03|x64 = Release - C++ 03|x64 + Release - C++ 03|x86 = Release - C++ 03|x86 + Release - VS 2015|Win32 = Release - VS 2015|Win32 + Release - VS 2015|x64 = Release - VS 2015|x64 + Release - VS 2015|x86 = Release - VS 2015|x86 + Release - VS 2017|Win32 = Release - VS 2017|Win32 + Release - VS 2017|x64 = Release - VS 2017|x64 + Release - VS 2017|x86 = Release - VS 2017|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.Build.2 = Debug - VS 2013|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {86310DF6-AE4D-48C6-B302-80F5091FC09B} = {77439103-0A48-4243-8D07-3223DC5CF353} + {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} = {86310DF6-AE4D-48C6-B302-80F5091FC09B} + {968024AC-A87C-40E9-B75A-B7AE9790C73F} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + {35E7ED3A-7DF9-4E75-B289-99B3D0050992} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + {63218938-B7EC-4913-9B3B-CEAE1F2A925B} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CB028EB1-46EF-44C3-B508-97BC3E09DC4D} + EndGlobalSection +EndGlobal diff --git a/externals/genesis/source/externals/essentials/source/essentials/CMakeLists.txt b/externals/genesis/source/externals/essentials/source/essentials/CMakeLists.txt new file mode 100644 index 0000000..edc08df --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 2.8) + +project(essentials) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +file(GLOB essentials_SRC "include/essentials/*.hpp" "include/essentials/compatibility/*.hpp" "source/*.cpp") + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(./../CMakeHelpers/addSpecificFlags.cmake) +include(./../CMakeHelpers/addSeadexOptions.cmake) + +include_directories("./include") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library(libessentials ${LINK_TYPE} ${essentials_SRC}) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library(essentials STATIC ${essentials_SRC}) +endif() + + +file(GLOB essentials_hpp "include/essentials/*.hpp" "include/essentials/compatibility/*.hpp") +install(FILES ${essentials_hpp} DESTINATION include/essentials/include) + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + install(TARGETS libessentials DESTINATION lib) + set_target_properties(libessentials PROPERTIES PREFIX "") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + install(TARGETS essentials DESTINATION lib) + set_target_properties(essentials PROPERTIES PREFIX "") +endif() diff --git a/externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj b/externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj new file mode 100644 index 0000000..63f7f7e --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj @@ -0,0 +1,545 @@ + + + + + Debug - C++ 03 + Win32 + + + Debug - C++ 03 + x64 + + + Debug - Clang + Win32 + + + Debug - Clang + x64 + + + Debug - VS 2013 + Win32 + + + Debug - VS 2013 + x64 + + + Debug - VS 2015 + Win32 + + + Debug - VS 2015 + x64 + + + Debug - VS 2017 + Win32 + + + Release - C++ 03 + Win32 + + + Release - C++ 03 + x64 + + + Release - Clang + Win32 + + + Release - Clang + x64 + + + Release - VS 2015 + Win32 + + + Release - VS 2015 + x64 + + + Release - VS 2017 + Win32 + + + Debug - VS 2017 + x64 + + + Release - VS 2017 + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {132F81F8-46DA-49D0-9071-D70BC087B38C} + essentials + 8.1 + + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141_clang_c2 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj.filters b/externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj.filters new file mode 100644 index 0000000..e68031a --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/essentials.vcxproj.filters @@ -0,0 +1,107 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4a8b49fc-8912-43d5-a33a-962f5e097001} + + + {13a9f023-217a-4d7a-946f-8147bce1d21a} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + + + + license + + + license + + + license + + + license + + + license + + + + + Header Files\compatibility + + + Header Files\compatibility + + + Header Files\compatibility + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\compatibility + + + \ No newline at end of file diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/base.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/base.hpp new file mode 100644 index 0000000..9ea9eb7 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/base.hpp @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A +#define BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A + + +//!\def SX_ASSERT( _condition, _message ) +//!\brief Assert a given condition. Adds the message to the assert for better diagnostics when the assert is triggered. +#define SX_ASSERT( _condition, _message ) \ + do \ + { \ + assert( ( _condition ) && _message ); \ + } \ + while( 0 ) + +//!\def SX_ASSERTED( _x ) +//!\brief Suppress warnings for variables that are only used within asserts. +#define SX_ASSERTED( _x ) static_cast< void >( _x ); + +//!\def SX_UNUSED_PARAMETER( _x ) +//!\brief Suppress warnings for unreferenced parameters. +#define SX_UNUSED_PARAMETER( _x ) static_cast( _x ) + + +//!\def SX_UNUSED_VARIABLE( _x ) +//!\brief Suppress warnings for unreferenced variable. +#define SX_UNUSED_VARIABLE( _x ) static_cast( _x ) + + +#include + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/build_number.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/build_number.hpp new file mode 100644 index 0000000..6771ace --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/build_number.hpp @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 +#define BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + +namespace version +{ + + + const sxe::uint16_t BUILD_NUMBER( 96 ); + + +} + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp new file mode 100644 index 0000000..1946dc4 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp @@ -0,0 +1,59 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 +#define CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 + + +#ifdef SX_CPP03_BOOST + +#include + +#else + +#include + +#endif + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + using boost::chrono::time_point; + using boost::chrono::system_clock; + using boost::chrono::steady_clock; + using boost::chrono::seconds; + using boost::chrono::milliseconds; + using boost::chrono::duration_cast; + using boost::chrono::time_point; + + +#else // C++11 compatibility + + + using std::chrono::time_point; + using std::chrono::system_clock; + using std::chrono::steady_clock; + using std::chrono::milliseconds; + using std::chrono::seconds; + using std::chrono::duration_cast; + using std::chrono::time_point; + + +#endif + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp new file mode 100644 index 0000000..4d5e764 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp @@ -0,0 +1,184 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 +#define COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 + + +#include "essentials_backward_compatibility.hpp" + + +#ifdef SX_CPP03_BOOST +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4456 ) +#pragma warning( disable : 4996 ) +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#else +#include +#include +#include +#include +#include +#endif + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + #define SX_OVERRIDE + #define SX_FINAL + #define SX_DELETE + #define SX_NULLPTR NULL + + #define SX_FOR(_variable, _container) BOOST_FOREACH( _variable, _container ) + + #define SX_CONSTEXPR const + + #define SX_NOEXCEPT throw() + + + using boost::shared_ptr; + #define SX_UNIQUE_PTR shared_ptr + + #define SX_MAKE_SHARED boost::make_shared + #define SX_MAKE_UNIQUE boost::make_shared + + template + _type& move(_type& _t) + { + return( _t ); + } + + using boost::int8_t; + using boost::int16_t; + using boost::int32_t; + using boost::int64_t; + using boost::uint8_t; + using boost::uint16_t; + using boost::uint32_t; + using boost::uint64_t; + + using boost::bind; + using boost::ref; + using boost::cref; + using boost::placeholders::_1; + using boost::placeholders::_2; + + using boost::function; + + using boost::remove_reference; + using boost::remove_const; + + using boost::random_device; + + +#else // C++11 compatibility + + #ifdef SX_NO_STD_MAKE_UNIQUE + + template< typename t, typename ... args > + std::unique_ptr< t > make_unique(args&& ... _args) + { + return( std::unique_ptr< t >(new t(std::forward< args >(_args)...)) ); + } + + #else + + using std::make_unique; + + #endif + + #define SX_OVERRIDE override + #define SX_FINAL final + #define SX_DELETE = delete + #define SX_NULLPTR nullptr + + #define SX_FOR(_variable, _container) for( _variable : _container ) + + #ifdef _MSC_VER + #if _MSC_VER <= 1800 + #define SX_CONSTEXPR const + #endif + #endif + + #ifndef SX_CONSTEXPR + #define SX_CONSTEXPR constexpr + #endif + +#ifdef _MSC_VER + #if _MSC_VER <= 1800 + #define SX_NOEXCEPT throw() + #else + #define SX_NOEXCEPT noexcept + #endif +#else + #define SX_NOEXCEPT noexcept +#endif + + using std::shared_ptr; + template + using SX_UNIQUE_PTR = std::unique_ptr<_pointee>; + + #define SX_MAKE_SHARED std::make_shared + #define SX_MAKE_UNIQUE sxe::make_unique + + using std::move; + + + using std::int8_t; + using std::int16_t; + using std::int32_t; + using std::int64_t; + using std::uint8_t; + using std::uint16_t; + using std::uint32_t; + using std::uint64_t; + + using std::bind; + using std::ref; + using std::cref; + using std::placeholders::_1; + using std::placeholders::_2; + + using std::function; + + using std::remove_reference; + using std::remove_const; + + using std::random_device; + + +#endif + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp new file mode 100644 index 0000000..c0b2d60 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp @@ -0,0 +1,31 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 +#define ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 + + +#ifdef Y_NO_STD_MAKE_UNIQUE +#define SX_NO_STD_MAKE_UNIQUE +#endif + + +#ifdef Y_CPP03_BOOST +#define SX_CPP03_BOOST +#endif + + +#define Y_UNIQUE_PTR SX_UNIQUE_PTR +#define Y_MAKE_UNIQUE SX_MAKE_UNIQUE +#define Y_MAKE_SHARED SX_MAKE_SHARED +#define Y_UNUSED_PARAMETER SX_UNUSED_PARAMETER + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp new file mode 100644 index 0000000..2381481 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF +#define THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF + + +#ifdef SX_CPP03_BOOST + +#include +#include + +#else + +#include +#include +#include +#include + +#endif + + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + using boost::thread; + using boost::unique_lock; + using boost::mutex; + using boost::lock_guard; + using boost::condition_variable; + using boost::this_thread::sleep_for; + using boost::atomic; + + +#else // C++11 compatibility + + + using std::thread; + using std::unique_lock; + using std::mutex; + using std::lock_guard; + using std::condition_variable; + using std::this_thread::sleep_for; + using std::atomic; + + +#endif + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/conversion.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/conversion.hpp new file mode 100644 index 0000000..c46dd99 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/conversion.hpp @@ -0,0 +1,53 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 +#define CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + + //!\brief Converts a number from string to int. + //!\param _int_as_string Number in string format. + //!\param _result Variable where the result will be stored. + //!\return True on success, false otherwise. + bool string_to_int( const char* const _int_as_string, int& _result ); + + //!\brief Converts a number from unsigned int 32 to string. + //!\param _value Number to be converted. + //!\return Number as string. + std::string to_string( const sxe::uint32_t _value ); + + //!\brief Converts a number from int to string. + //!\param _value Number to be converted. + //!\return Number as string. + std::string to_string( const int _value ); + + //!\brief Converts a string to uppercase. + //!\param _value String to be converted. + //!\return String in uppercase format. + //!\sa to_lower + std::string to_upper( const std::string& _value ); + + //!\brief Converts a string to lowercase. + //!\param _value String to be converted. + //!\return String in lowercase format. + //!\sa to_upper + std::string to_lower( const std::string& _value ); + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp new file mode 100644 index 0000000..96d967f --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E +#define VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + +namespace version +{ + + +void log_version(); + + +sxe::uint16_t get_major_version(); +sxe::uint16_t get_minor_version(); +sxe::uint16_t get_patch_version(); +sxe::uint16_t get_build_number(); + + +} + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception.hpp new file mode 100644 index 0000000..76ad4b8 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception.hpp @@ -0,0 +1,30 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 +#define EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 + + +#include "exception_template.hpp" + + +namespace sxe +{ + + +//!\def SX_EXCEPTION( exception ) +//!\brief The Seadex essentials exception class. +SX_EXCEPTION( exception ) + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp new file mode 100644 index 0000000..2415a7d --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp @@ -0,0 +1,160 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D +#define EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D + + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/sxprintf.hpp" + + +#ifndef SX_CPP03_BOOST + + +//!\def SX_EXCEPTION( _name ) +//!\brief Create an exception class inheriting std::exception with the given name. It also supports +//! creating messages with placeholders by calling sxprintf. +//!\sa sxprintf +#define SX_EXCEPTION( _name ) \ +class _name: public std::exception \ +{ \ +public: \ + template< typename ... args > \ + _name(const std::string & _what, args ... _args ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _args ... ) ) \ + { \ + } \ +\ +\ + virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ +\ +\ + virtual const char* what() const throw () SX_OVERRIDE \ + { \ + return ( what_.c_str() ); \ + } \ +\ +\ +private: \ + std::string what_; \ +\ +\ +}; + + +#else + + +#define SX_EXCEPTION( _name ) \ +class _name: public std::exception \ +{ \ +public: \ + explicit _name(const std::string & _what ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str() ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6 ) ) \ + { \ + } \ +\ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ) \ + { \ + } \ +\ +\ + virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ +\ +\ + virtual const char* what() const throw () SX_OVERRIDE \ + { \ + return ( what_.c_str() ); \ + } \ +\ +\ +private: \ + std::string what_; \ +\ +\ +}; + + +#endif + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp new file mode 100644 index 0000000..757c60a --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp @@ -0,0 +1,45 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB +#define FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB + + +#include + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + +//!\struct format_settings +//!\brief Structure containing information for formatting the output of sxprintf. +struct format_settings SX_FINAL +{ + //!\brief Constructor. + format_settings(); + + + std::string format_string_; + bool missing_closing_bracket_; + bool correct_; + bool hex_; + bool pad_zeros_; + bool places_set_; + int places_; + bool decimal_places_set_; + int decimal_places_; +}; + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp new file mode 100644 index 0000000..b0777eb --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp @@ -0,0 +1,46 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 +#define MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 + + +#ifndef SX_NO_VARIADIC_MACRO + + +//!\def EXPAND( x ) +//!\brief Helper to work around some Visual C++ compiler quirk dealing with variadic macros. +#define EXPAND( x ) x + +//!\def CAT( A, B ) +//!\brief Concatenate two tokens. +#define CAT( A, B ) A ## B + +//!\def SELECT( NAME, NUM ) +//!\brief Creating a name from a base name and a number with underscore between them. +#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM ) + +//!\def GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) +//!\brief Helper for counting the number of parameters of a macro. +#define GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) COUNT + +//!\def VA_SIZE( ... ) +//!\brief Count the number of parameters of a macro. +#define VA_SIZE( ... ) EXPAND( GET_COUNT( __VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1 ) ) + +//!\def VA_SELECT( NAME, ... ) +//!\brief Selects the correct overloaded macro based on the number of parameters. +#define VA_SELECT( NAME, ... ) EXPAND( SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__) ) + + +#endif + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp new file mode 100644 index 0000000..b93fff3 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp @@ -0,0 +1,68 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 +#define NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 + + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST + + +//!\def SX_NO_COPY(_class_name) +//!\brief Delete the copy constructor and assignment operator of the given class. +#define SX_NO_COPY(_class_name)\ +private:\ + _class_name(const _class_name&) SX_DELETE;\ + _class_name& operator=(const _class_name&) SX_DELETE;\ +public:\ +\ + + +//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) +//!\brief Delete the assignment operator of the given class. +#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ +private:\ + _class_name& operator=( const _class_name& ) SX_DELETE;\ +public:\ +\ + + +#else + + +//!\def SX_NO_COPY(_class_name) +//!\brief Delete the copy constructor and assignment operator of the given class. +#define SX_NO_COPY(_class_name)\ + _class_name(const _class_name&) SX_DELETE;\ + _class_name& operator=(const _class_name&) SX_DELETE;\ +\ + + +//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) +//!\brief Delete the assignment operator of the given class. +#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ + _class_name& operator=( const _class_name& ) SX_DELETE;\ +\ + + +#endif + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp new file mode 100644 index 0000000..0d9a863 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp @@ -0,0 +1,242 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 +#define PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 + + +#include +#include + + +#ifdef SX_CPP03_BOOST + #include + #include +#endif + +#include "compatibility/compatibility.hpp" +#include "format_settings.hpp" + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST + typedef boost::variant< bool, int, unsigned int, sxe::int8_t, sxe::uint8_t, sxe::uint16_t, sxe::uint32_t, + std::string, std::size_t, const char*, boost::int_least64_t, double > value_type; + typedef std::vector< value_type > value_types; +#endif + + +extern const char PLACE_HOLDER; +extern const char* const SUPERFLUOUS_PARAMETER_START; +extern const char SUPERFLUOUS_PARAMETER_END; +extern const char OPENING_SQUARE_BRACKET; +extern const char CLOSING_SQUARE_BRACKET; + + +template< typename value > +struct stream_writer +{ + static void print( std::ostream& _os, const value& _value ) + { + _os << _value; + } +}; + + +template< > +struct stream_writer< sxe::uint8_t > +{ + static void print(std::ostream& _os, const sxe::uint8_t& _value) + { + _os << static_cast( _value ); + } +}; + + +// cppcheck-suppress unusedFunction +std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ); +sxe::format_settings parse_format_string( const char** const _format ); + + +#ifdef SX_CPP03_BOOST + +void print_value_type_value( std::ostream& _os, const value_type& _value ); + + +#endif + + +template< typename value > +void print_superfluous_parameters( std::ostream& _os, const value& _value ) +{ + _os << SUPERFLUOUS_PARAMETER_START; +#ifndef SX_CPP03_BOOST + stream_writer< value >::print( _os, _value ); +#else + print_value_type_value( _os, _value ); +#endif + _os << SUPERFLUOUS_PARAMETER_END; +} + + +#ifndef SX_CPP03_BOOST + + +template< typename value, typename ... args > +void print_superfluous_parameters( std::ostream& _os, + const value& _value, args ... _args ) +{ + _os << SUPERFLUOUS_PARAMETER_START; + stream_writer< value >::print( _os, _value ); + _os << SUPERFLUOUS_PARAMETER_END; + print_superfluous_parameters( _os, _args ... ); +} + + +#else + + +#endif + + +void sxprintf( std::ostream& _os, const char* _format ); + +#ifndef SX_CPP03_BOOST +template< typename value, typename ... args > +void sxprintf( std::ostream& _os, const char* _format, const value& _value, args ... _args ) +{ + while( *_format ) + { + if( PLACE_HOLDER == *_format ) + { + if( PLACE_HOLDER == *( _format + 1 ) ) + { + ++_format; // skip first place holder + _os << *_format++; // output of the second place holder + } + else + { + if( OPENING_SQUARE_BRACKET == *( _format + 1 ) ) + { + ++_format; + const sxe::format_settings format_settings = sxe::parse_format_string( &_format ); + const std::ios_base::fmtflags stream_flags = _os.flags(); + const char streafill_ = _os.fill(); + if( format_settings.correct_ ) + { + _os << format_settings; + stream_writer< value >::print( _os, _value ); + } + else + { + while( CLOSING_SQUARE_BRACKET != *( _format ) ) + { + ++_format; + } + stream_writer< value >::print( _os, _value ); + _os << format_settings; + } + _os.flags( stream_flags ); + _os.fill( streafill_ ); + } + else + { + stream_writer< value >::print( _os, _value ); + } + + sxprintf( _os, _format + 1, _args ... ); + return; + } + } + else + { + _os << *_format++; + } + } + + print_superfluous_parameters( _os, _value, _args ... ); +} + + +//!\brief Creates a formatted message. The format string can contain placeholders ('%'s) that will be replaced with +//!the parameters by this function. To emit a '%' use two percent signs ("%%"). +//!\param _format The format string in which will the placeholders will be replaced (if there are any). +//!\param _args The arguments that will replace the placeholders in the format string. The number of parameters in +//!_args has to be equal to the number of placeholders in the format string. If you pass too few or too many +//!arguments, the resulting string will contain diagnostics in the resulting string +//!([Missing parameter!] or [Superfluous parameter: x]). +//!\return String containing the complete formatted message. +template< typename ... args > +std::string sxprintf(const char* const _format, args ... _args) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _args ...); + return( target_string_stream.str() ); +} + +#else + +std::string sxprintf(const char* const _format); +std::string sxprintf(const char* const _format, const value_type& _value1); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9, const value_type& _value10); + + +void sxprintf(std::ostream& _os, const char* const _format); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10); + + void sxprintf(std::ostream& _os, const char* const _format, const value_types& _values); + +#endif + + +} + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/include/essentials/uri.hpp b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/uri.hpp new file mode 100644 index 0000000..0499a44 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/include/essentials/uri.hpp @@ -0,0 +1,55 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D +#define URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D + + +#include + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sxe +{ + + +const char URI_DELIMITER = '/'; + + +class uri SX_FINAL +{ +public: + explicit uri( const std::string& _uri = "" ); + ~uri() SX_NOEXCEPT; + bool is_empty() const; + const std::string to_string() const; + const std::string& get_front() const; + const std::string& get_back(); + void push_front( const std::string& _segment ); + void push_back( const std::string& _segment ); + void pop_front(); + void pop_back(); + size_t size() const; + + +private: + const std::string build_uri() const; + void split_string_to_uri_segments( const std::string& _uri ); + + + std::deque< std::string > uri_; +}; + + +} + + +#endif diff --git a/externals/genesis/source/externals/essentials/source/essentials/source/conversion.cpp b/externals/genesis/source/externals/essentials/source/essentials/source/conversion.cpp new file mode 100644 index 0000000..ed91544 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/source/conversion.cpp @@ -0,0 +1,103 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/conversion.hpp" + +#include +#include +#include + +#ifndef SX_CPP03_BOOST + #include +#else + #include +#endif + + +namespace sxe +{ + + +bool string_to_int( const char* const _int_as_string, int& _result ) +{ + bool success = false; + try + { +#ifndef SX_CPP03_BOOST + _result = std::stoi( std::string( _int_as_string ) ); + success = true; +#else + std::istringstream is( _int_as_string ); + if (is >> _result) + { + success = true; + } + else + { + success = false; + } +#endif + + } + catch ( const std::invalid_argument& ) + { + success = false; + } + catch ( const std::out_of_range& ) + { + success = false; + } + return( success ); +} + + +std::string to_string( const sxe::uint32_t _value ) +{ +#ifndef SX_CPP03_BOOST + return( std::to_string( _value ) ); +#else + std::ostringstream ostr; + ostr << _value; + return( ostr.str() ); +#endif +} + + +std::string to_string( const int _value ) +{ +#ifndef SX_CPP03_BOOST + return( std::to_string( _value ) ); +#else + std::ostringstream ostr; + ostr << _value; + return( ostr.str() ); +#endif +} + + +// cppcheck-suppress unusedFunction +std::string to_upper( const std::string& _value ) +{ + std::string value_caps = _value; + std::transform( value_caps.begin(), value_caps.end(), value_caps.begin(), static_cast< int( *)( int ) >( ::std::toupper ) ); + return( value_caps ); +} + + +// cppcheck-suppress unusedFunction +std::string to_lower( const std::string& _value ) +{ + std::string value_to_lower = _value; + std::transform( value_to_lower.begin(), value_to_lower.end(), value_to_lower.begin(), static_cast< int( *)( int ) >( ::std::tolower ) ); + return( value_to_lower ); +} + + +} diff --git a/externals/genesis/source/externals/essentials/source/essentials/source/essentials_version.cpp b/externals/genesis/source/externals/essentials/source/essentials/source/essentials_version.cpp new file mode 100644 index 0000000..7279071 --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/source/essentials_version.cpp @@ -0,0 +1,74 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "essentials/essentials_version.hpp" + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/build_number.hpp" +#include "essentials/sxprintf.hpp" + + +namespace sxe +{ + + +namespace version +{ + + +namespace +{ + + +const sxe::uint16_t VERSION_MAJOR( 1 ); +const sxe::uint16_t VERSION_MINOR( 3 ); +const sxe::uint16_t VERSION_PATCH( 2 ); + + +} + + +// cppcheck-suppress unusedFunction +void log_version() +{ + std::cout << sxe::sxprintf( "essentials library version %.%.%.%.", get_major_version(), + get_minor_version(), get_patch_version(), get_build_number() ) << std::endl; +} + + +sxe::uint16_t get_major_version() +{ + return( VERSION_MAJOR ); +} + + +sxe::uint16_t get_minor_version() +{ + return( VERSION_MINOR ); +} + + +sxe::uint16_t get_patch_version() +{ + return( VERSION_PATCH ); +} + + +sxe::uint16_t get_build_number() +{ + return( BUILD_NUMBER ); +} + + +} + + +} diff --git a/externals/genesis/source/externals/essentials/source/essentials/source/format_settings.cpp b/externals/genesis/source/externals/essentials/source/essentials/source/format_settings.cpp new file mode 100644 index 0000000..0417c8a --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/source/format_settings.cpp @@ -0,0 +1,32 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "essentials/format_settings.hpp" + + +namespace sxe +{ + + +format_settings::format_settings(): + format_string_(), + missing_closing_bracket_( false ), + correct_( false ), + hex_( false ), + pad_zeros_( false ), + places_set_( false ), + places_( 0 ), + decimal_places_set_( false ), + decimal_places_( 0 ) +{ + // Nothing to do... +} + + +} diff --git a/externals/genesis/source/externals/essentials/source/essentials/source/sxprintf.cpp b/externals/genesis/source/externals/essentials/source/essentials/source/sxprintf.cpp new file mode 100644 index 0000000..99844aa --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/source/sxprintf.cpp @@ -0,0 +1,628 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/sxprintf.hpp" + +#include + +#include "essentials/base.hpp" +#include "essentials/conversion.hpp" + + +namespace sxe +{ + + +namespace +{ + + + const char MISSING_PARAMETERS_MESSAGE[] = "[Missing parameter!]"; + const char MISSING_TERMINATOR[] = "[Missing output modifier terminator!]"; + const char ILLEGAL_MODIFIER[] = "[Illegal output modifier!]"; + const char POINT = '.'; + const char ZERO = '0'; + const char X = 'x'; + const char CAPS_X = 'X'; + + +} + + +const char PLACE_HOLDER = '%'; +const char* const SUPERFLUOUS_PARAMETER_START = "[Superfluous parameter: "; +const char SUPERFLUOUS_PARAMETER_END = ']'; +const char OPENING_SQUARE_BRACKET = '['; +const char CLOSING_SQUARE_BRACKET = ']'; + + +// cppcheck-suppress unusedFunction +std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ) +{ + if( !_format.correct_ ) + { + _os << ILLEGAL_MODIFIER; + } + else if( _format.missing_closing_bracket_ ) + { + _os << MISSING_TERMINATOR; + } + else + { + if( _format.hex_ ) + { + _os << std::hex; + _os << std::showbase; + _os.fill( '0' ); + } + else + { + if( _format.pad_zeros_ ) + { + _os.fill( '0' ); + } + + if( _format.places_set_ ) + { + _os.width( _format.places_ ); + } + + if( _format.decimal_places_set_ ) + { + _os.precision( _format.decimal_places_ ); + } + } + } + + return( _os ); +} + + +bool is_allowed_char( const char _char ) +{ + const bool success = ( std::isdigit( _char ) || ( X == _char ) || ( CAPS_X == _char ) ); + return( success ); +} + + +sxe::format_settings parse_format_string( const char** const _format ) +{ + sxe::format_settings format_settings; + format_settings.correct_ = true; + SX_ASSERT( ( OPENING_SQUARE_BRACKET == **_format ), "Format string to parse doesn't start with [." ); + ++*_format; + format_settings.missing_closing_bracket_ = true; + bool point_found = false; + const char* text_before_point = *_format; + std::size_t text_before_point_size = 0; + const char* text_after_point = SX_NULLPTR; + std::size_t text_after_point_size = 0; + while( **_format ) + { + if( CLOSING_SQUARE_BRACKET == **_format ) + { + format_settings.missing_closing_bracket_ = false; + break; + } + else + if( POINT == **_format ) + { + if( point_found ) + { + format_settings.correct_ = false; + break; + } + else + { + point_found = true; + text_after_point = ( *_format ) + 1; + text_after_point_size = 0; + } + } + else + { + const char _text_char = **_format; + if( is_allowed_char( _text_char ) ) + { + if( point_found ) + { + ++text_after_point_size; + } + else + { + ++text_before_point_size; + } + } + else + { + format_settings.correct_ = false; + break; + } + } + + ++( *_format ); + } + + SX_ASSERT( text_before_point, "Logic error parsing format string!" ); + if( ( 0 == text_before_point_size ) && ( 0 == text_after_point_size ) ) + { + format_settings.correct_ = false; + } + + if( ( !format_settings.missing_closing_bracket_ ) && format_settings.correct_ ) + { + if( ( 0 < text_before_point_size ) && ( ( X == text_before_point[ 0 ] ) || ( CAPS_X == text_before_point[ 0 ] ) ) ) + { + format_settings.hex_ = true; + ++text_before_point; + --text_before_point_size; + } + + if( ( 0 < text_before_point_size ) && ( ZERO == text_before_point[ 0 ] ) ) + { + format_settings.pad_zeros_ = true; + ++text_before_point; + --text_before_point_size; + } + + if( 0 < text_before_point_size ) + { + format_settings.places_set_ = true; + if( !string_to_int( text_before_point, format_settings.places_ ) ) + { + format_settings.correct_ = false; + } + } + + if( 0 < text_after_point_size ) + { + SX_ASSERT( text_after_point, "Logic error parsing format string!" ); + format_settings.decimal_places_set_ = true; + if( !string_to_int( text_after_point, format_settings.decimal_places_ ) ) + { + format_settings.correct_ = false; + } + } + } + + return( format_settings ); +} + + +#ifdef SX_CPP03_BOOST + + +void print_superfluous_parameters( std::ostream& _os, const value_types& _values, value_types::const_iterator& _position ) +{ + while( _position != _values.end() ) + { + print_superfluous_parameters( _os, *_position ); + ++_position; + } +} + + +#endif + + +void sxprintf( std::ostream& _os, const char* _format ) +{ + while( *_format ) + { + if( PLACE_HOLDER == *_format ) + { + if( PLACE_HOLDER == *( _format + 1 ) ) + { + ++_format; + } + else + { + _os << MISSING_PARAMETERS_MESSAGE; + } + } + _os << *_format++; + } +} + + +#ifdef SX_CPP03_BOOST + + +std::string sxprintf(const char* const _format) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9, const value_type& _value10) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10); + return( target_string_stream.str() ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1 ) +{ + value_types values; + values.push_back( _value1 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + values.push_back( _value9 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + values.push_back( _value9 ); + values.push_back( _value10 ); + sxprintf( _os, _format, values ); +} + + +const char* sxprintf_impl( std::ostream& _os, const char* _format, value_types::const_iterator& _position, + const value_types::const_iterator _end, bool& printed ) +{ + while (*_format) + { + if (PLACE_HOLDER == *_format) + { + if (PLACE_HOLDER == *( _format + 1 )) + { + ++_format; // skip first place holder + _os << *_format++; // output of the second place holder + } + else + { + if (OPENING_SQUARE_BRACKET == *( _format + 1 )) + { + ++_format; + const sxe::format_settings format_settings = sxe::parse_format_string(&_format); + const std::ios_base::fmtflags stream_flags = _os.flags(); + const char streafill_ = _os.fill(); + _os << format_settings; + print_value_type_value( _os, *_position ); + _os.flags(stream_flags); + _os.fill(streafill_); + printed = true; + if( !format_settings.missing_closing_bracket_ ) + { + if( CLOSING_SQUARE_BRACKET == *( _format ) ) + { + ++_format; + } + } + else + { + if( !format_settings.correct_ ) + { + ++_format; + } + } + } + else + { + print_value_type_value( _os, *_position ); + printed = true; + ++_format; + break; + } + + if( _position + 1 != _end ) + { + if( *_format != '\0' ) + { + ++_position; + _format = sxprintf_impl( _os, _format, _position, _end, printed ); + } + } + return( _format ); + } + } + else + { + _os << *_format++; + } + } + return ( _format ); +} + + +void sxprintf( std::ostream& _os, const char * const _format, const value_types& _values ) +{ + SX_ASSERT( _format, "No format string to parse was passed!" ); + const char* current_position = _format; + + value_types::const_iterator _end = _values.end(); + value_types::const_iterator _position = _values.begin(); + while( _position != _end ) + { + bool printed = false; + current_position = sxprintf_impl( _os, current_position, _position, _end, printed ); + if( printed ) + { + ++_position; + } + if( current_position[0] == '\0' ) + { + break; + } + } + + sxprintf( _os, current_position ); + + if( _position != _end ) + { + print_superfluous_parameters( _os, _values, _position ); + } +} + + +void print_value_type_value( std::ostream& _os, const value_type& _value ) +{ + const std::type_info& type_info = _value.type(); + + if( type_info == typeid ( bool ) ) + { + stream_writer< bool >::print( _os, boost::get< bool >( _value ) ); + } + else if( type_info == typeid ( int ) ) + { + stream_writer< int >::print( _os, boost::get< int >( _value ) ); + } + else if( type_info == typeid ( unsigned int ) ) + { + stream_writer< unsigned int >::print( _os, boost::get< unsigned int >( _value ) ); + } + else if( type_info == typeid ( sxe::int8_t ) ) + { + stream_writer< sxe::int8_t >::print( _os, boost::get< sxe::int8_t >( _value ) ); + } + else if (type_info == typeid ( sxe::uint8_t )) + { + stream_writer< sxe::uint8_t >::print(_os, boost::get< sxe::uint8_t >(_value)); + } + else if( type_info == typeid ( sxe::uint16_t ) ) + { + stream_writer< sxe::uint16_t >::print( _os, boost::get< sxe::uint16_t >( _value ) ); + } + else if( type_info == typeid ( sxe::uint32_t ) ) + { + stream_writer< sxe::uint32_t >::print( _os, boost::get< sxe::uint32_t >( _value ) ); + } + else if( type_info == typeid ( std::string ) ) + { + stream_writer< std::string >::print( _os, boost::get< std::string >( _value ) ); + } + else if( type_info == typeid ( std::size_t ) ) + { + stream_writer< std::size_t >::print( _os, boost::get< std::size_t >( _value ) ); + } + else if( type_info == typeid ( const char* ) ) + { + stream_writer< const char* >::print( _os, boost::get< const char* >( _value ) ); + } + else if( type_info == typeid ( boost::int_least64_t ) ) + { + stream_writer< boost::int_least64_t >::print( _os, boost::get< boost::int_least64_t >( _value ) ); + } + else if( type_info == typeid ( double ) ) + { + stream_writer< double >::print( _os, boost::get< double >( _value ) ); + } +} + + +#endif + + +} diff --git a/externals/genesis/source/externals/essentials/source/essentials/source/uri.cpp b/externals/genesis/source/externals/essentials/source/essentials/source/uri.cpp new file mode 100644 index 0000000..1460efb --- /dev/null +++ b/externals/genesis/source/externals/essentials/source/essentials/source/uri.cpp @@ -0,0 +1,136 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/uri.hpp" + +#include +#include + +#include "essentials/base.hpp" + + +namespace sxe +{ + + +uri::uri( const std::string& _uri ) + : uri_() +{ + split_string_to_uri_segments( _uri ); +} + + +uri::~uri() SX_NOEXCEPT +{ + // Nothing to do... +} + + +bool uri::is_empty() const +{ + return( uri_.empty() ); +} + + +const std::string uri::to_string() const +{ + return( build_uri() ); +} + + +const std::string& uri::get_front() const +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + return( uri_.front() ); +} + + +const std::string& uri::get_back() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + return( uri_.back() ); +} + + +void uri::push_front( const std::string& _segment ) +{ + uri_.push_front( _segment ); +} + + +void uri::push_back( const std::string& _segment ) +{ + uri_.push_back( _segment ); +} + + +void uri::pop_front() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + uri_.pop_front(); +} + + +void uri::pop_back() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + uri_.pop_back(); +} + + +size_t uri::size() const +{ + return( uri_.size() ); +} + + +const std::string uri::build_uri() const +{ + std::stringstream uri; + + SX_FOR( const std::string& uri_element, uri_ ) + { + uri << URI_DELIMITER << uri_element; + } + + return( uri.str() ); +} + + +void uri::split_string_to_uri_segments( const std::string& _uri ) +{ + std::string uri = _uri; + if( !_uri.empty() ) + { + if( URI_DELIMITER == _uri[ 0 ] ) + { + uri = _uri.substr( 1 ); + } + + std::string::size_type start = 0; + std::string::size_type end = uri.find( URI_DELIMITER ); + while( end != std::string::npos ) + { + const std::string& segment = uri.substr( start, end - start ); + uri_.push_back( segment ); + start = ++end; + end = uri.find( URI_DELIMITER, end ); + } + + const std::string& last_segment = uri.substr( start ); + if( last_segment[ 0 ] != URI_DELIMITER ) + { + uri_.push_back( last_segment ); + } + } +} + + +} diff --git a/externals/genesis/source/genesis.sln b/externals/genesis/source/genesis.sln new file mode 100644 index 0000000..1083fcd --- /dev/null +++ b/externals/genesis/source/genesis.sln @@ -0,0 +1,163 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2009 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genesis", "genesis\genesis.vcxproj", "{466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}" + ProjectSection(ProjectDependencies) = postProject + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{7BB2B202-754C-4640-9E43-B3AB017EFD9C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "html_page_generator", "examples\html_page_generator\html_page_generator.vcxproj", "{A4401298-EBE7-4861-AC15-E23071C4FCE5}" + ProjectSection(ProjectDependencies) = postProject + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357} = {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "externals", "externals", "{0FEFD4B7-9FBD-441B-AF1B-FD52E1E04F08}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials", "externals\essentials\source\essentials\essentials.vcxproj", "{132F81F8-46DA-49D0-9071-D70BC087B38C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build_tools", "build_tools", "{9621FF20-55AE-415B-B00A-55853998E619}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMake", "CMake", "{9513E631-618B-43D4-9FCA-5C4E8E3A48D0}" + ProjectSection(SolutionItems) = preProject + ..\CMakeLists.txt = ..\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{E351D004-E257-41B2-A2F9-34B85A5F272D}" + ProjectSection(SolutionItems) = preProject + CMakeLists.txt = CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "genesis", "genesis", "{C11DB251-3197-4B9D-B650-DBE49E8115CD}" + ProjectSection(SolutionItems) = preProject + genesis\CMakeLists.txt = genesis\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{7EB93F3B-F90E-47A4-8459-67AF40729913}" + ProjectSection(SolutionItems) = preProject + examples\CMakeLists.txt = examples\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "html_page_generator", "html_page_generator", "{8F23A302-B312-445A-AC0A-73307CFEE362}" + ProjectSection(SolutionItems) = preProject + examples\html_page_generator\CMakeLists.txt = examples\html_page_generator\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "externals", "externals", "{2D664D50-E4A5-4621-A701-4B4CE01079BB}" + ProjectSection(SolutionItems) = preProject + externals\CMakeLists.txt = externals\CMakeLists.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug - C++ 03|Win32 = Debug - C++ 03|Win32 + Debug - C++ 03|x64 = Debug - C++ 03|x64 + Debug - VS 2015|Win32 = Debug - VS 2015|Win32 + Debug - VS 2015|x64 = Debug - VS 2015|x64 + Debug - VS 2017|Win32 = Debug - VS 2017|Win32 + Debug - VS 2017|x64 = Debug - VS 2017|x64 + Release - C++ 03|Win32 = Release - C++ 03|Win32 + Release - C++ 03|x64 = Release - C++ 03|x64 + Release - VS 2015|Win32 = Release - VS 2015|Win32 + Release - VS 2015|x64 = Release - VS 2015|x64 + Release - VS 2017|Win32 = Release - VS 2017|Win32 + Release - VS 2017|x64 = Release - VS 2017|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - C++ 03|Win32.ActiveCfg = Debug - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - C++ 03|Win32.Build.0 = Debug - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - C++ 03|Win32.Deploy.0 = Debug - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - C++ 03|x64.ActiveCfg = Debug - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - C++ 03|x64.Build.0 = Debug - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - C++ 03|x64.Deploy.0 = Debug - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - C++ 03|Win32.ActiveCfg = Release - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - C++ 03|Win32.Build.0 = Release - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - C++ 03|Win32.Deploy.0 = Release - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - C++ 03|x64.ActiveCfg = Release - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - C++ 03|x64.Build.0 = Release - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - C++ 03|x64.Deploy.0 = Release - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {A4401298-EBE7-4861-AC15-E23071C4FCE5}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {A4401298-EBE7-4861-AC15-E23071C4FCE5} = {7BB2B202-754C-4640-9E43-B3AB017EFD9C} + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {0FEFD4B7-9FBD-441B-AF1B-FD52E1E04F08} + {9513E631-618B-43D4-9FCA-5C4E8E3A48D0} = {9621FF20-55AE-415B-B00A-55853998E619} + {E351D004-E257-41B2-A2F9-34B85A5F272D} = {9513E631-618B-43D4-9FCA-5C4E8E3A48D0} + {C11DB251-3197-4B9D-B650-DBE49E8115CD} = {E351D004-E257-41B2-A2F9-34B85A5F272D} + {7EB93F3B-F90E-47A4-8459-67AF40729913} = {E351D004-E257-41B2-A2F9-34B85A5F272D} + {8F23A302-B312-445A-AC0A-73307CFEE362} = {7EB93F3B-F90E-47A4-8459-67AF40729913} + {2D664D50-E4A5-4621-A701-4B4CE01079BB} = {E351D004-E257-41B2-A2F9-34B85A5F272D} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D2B39A2A-793E-484D-9858-C96385A3F50B} + EndGlobalSection +EndGlobal diff --git a/genesis/CMakeLists.txt b/externals/genesis/source/genesis/CMakeLists.txt similarity index 56% rename from genesis/CMakeLists.txt rename to externals/genesis/source/genesis/CMakeLists.txt index ffff76e..55ffd57 100644 --- a/genesis/CMakeLists.txt +++ b/externals/genesis/source/genesis/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 2.8) project(genesis) +set(CMAKE_VERBOSE_MAKEFILE, 1) + if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() @@ -13,23 +15,39 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) include(./../CMakeHelpers/addSpecificFlags.cmake) -include(./../CMakeHelpers/addYasmineOptions.cmake) +include(./../CMakeHelpers/addSeadexOptions.cmake) include_directories("./include") -include_directories("./../externals/essentials/include") +include_directories("./../externals/essentials/source/essentials/include") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") +set(link_libraries_list "") + +if("${CPP_VERSION}" STREQUAL "03") + use_boost_libraries(link_libraries_list) +endif() if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - add_library(libgenesis ${LINK_TYPE} ${genesis_SRC}) + add_library_for_linking(link_libraries_list libessentials) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library_for_linking(link_libraries_list essentials) +endif() + +message(STATUS "genesis linking to libraries: ${link_libraries_list}" ) + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library(libgenesis SHARED ${genesis_SRC}) + target_link_libraries(libgenesis LINK_PUBLIC ${link_libraries_list}) elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") add_library(genesis STATIC ${genesis_SRC}) + target_link_libraries(genesis LINK_PUBLIC ${link_libraries_list}) endif() -file(GLOB genesis_hpp "include/*.hpp") +file(GLOB genesis_hpp "./include/*.hpp") install(FILES ${genesis_hpp} DESTINATION include/genesis/include) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") install(TARGETS libgenesis DESTINATION lib) set_target_properties(libgenesis PROPERTIES PREFIX "") diff --git a/externals/genesis/source/genesis/changelog.txt b/externals/genesis/source/genesis/changelog.txt new file mode 100644 index 0000000..8b47c2b --- /dev/null +++ b/externals/genesis/source/genesis/changelog.txt @@ -0,0 +1,33 @@ +# Change log +All notable changes to this project are documented in this file. + + +##[0.3.2] - 2017-12-18 + +### Changed +• use essentials and hermes as libraries +• CMake: use external CMakeHelpers files +• CMake: refactoring of build files + +### Fixed +• rename private method recipe::create to recipe::create_impl because of bug (warning in clang) +• added SX_UNUSED_VARIABLE to is_delimiter_char, else a warning is generated in clang as it is not used (SX_ASSERT) + + +##[0.2.0] - 2017-09-20 + +### Added +• Support for Visual Studio 2017 builds +• C++03 compatibility + +### Changed +• rename: condition_block's private method check_modifier to apply_modifier +• method create_child of the class recipe_block is now protected + +### Fixed +• added missing override specifier to template_block::create method + + +##[0.1.0] - 2017-04-21 + +• The very first release version of genesis diff --git a/genesis/genesis.vcxproj b/externals/genesis/source/genesis/genesis.vcxproj similarity index 93% rename from genesis/genesis.vcxproj rename to externals/genesis/source/genesis/genesis.vcxproj index babd1f5..d618452 100644 --- a/genesis/genesis.vcxproj +++ b/externals/genesis/source/genesis/genesis.vcxproj @@ -1,755 +1,732 @@ - - - - - Debug - C++ 03 - Win32 - - - Debug - C++ 03 - x64 - - - Debug - Clang - Win32 - - - Debug - Clang - x64 - - - Debug - VS 2013 - Win32 - - - Debug - VS 2013 - x64 - - - Debug - VS 2015 - Win32 - - - Debug - VS 2015 - x64 - - - Debug - VS 2017 - Win32 - - - Debug - VS 2017 - x64 - - - Release - C++ 03 - Win32 - - - Release - C++ 03 - x64 - - - Release - Clang - Win32 - - - Release - Clang - x64 - - - Release - VS 2013 - Win32 - - - Release - VS 2013 - x64 - - - Release - VS 2015 - Win32 - - - Release - VS 2015 - x64 - - - Release - VS 2017 - Win32 - - - Release - VS 2017 - x64 - - - - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357} - genesis - 8.1 - - - - StaticLibrary - true - v141 - MultiByte - - - StaticLibrary - true - v141_clang_c2 - MultiByte - - - StaticLibrary - true - v140 - MultiByte - - - StaticLibrary - true - v120 - MultiByte - - - StaticLibrary - true - v141 - MultiByte - - - StaticLibrary - true - v120 - MultiByte - - - StaticLibrary - false - v141 - true - MultiByte - - - StaticLibrary - false - v141_clang_c2 - true - MultiByte - - - StaticLibrary - false - v140 - true - MultiByte - - - StaticLibrary - false - v120 - true - MultiByte - - - StaticLibrary - false - v141 - true - MultiByte - - - StaticLibrary - false - v120 - true - MultiByte - - - StaticLibrary - true - v141 - MultiByte - - - StaticLibrary - true - v141_clang_c2 - MultiByte - - - StaticLibrary - true - v140 - MultiByte - - - StaticLibrary - true - v120 - MultiByte - - - StaticLibrary - true - v141 - MultiByte - - - StaticLibrary - true - v120 - MultiByte - - - StaticLibrary - false - v141 - true - MultiByte - - - StaticLibrary - false - v141_clang_c2 - true - MultiByte - - - StaticLibrary - false - v140 - true - MultiByte - - - StaticLibrary - false - v120 - true - MultiByte - - - StaticLibrary - false - v141 - true - MultiByte - - - StaticLibrary - false - v120 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - Disabled - true - - - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug - C++ 03 + Win32 + + + Debug - C++ 03 + x64 + + + Debug - Clang + Win32 + + + Debug - Clang + x64 + + + Debug - VS 2013 + Win32 + + + Debug - VS 2013 + x64 + + + Debug - VS 2015 + Win32 + + + Debug - VS 2015 + x64 + + + Debug - VS 2017 + Win32 + + + Debug - VS 2017 + x64 + + + Release - C++ 03 + Win32 + + + Release - C++ 03 + x64 + + + Release - Clang + Win32 + + + Release - Clang + x64 + + + Release - VS 2013 + Win32 + + + Release - VS 2013 + x64 + + + Release - VS 2015 + Win32 + + + Release - VS 2015 + x64 + + + Release - VS 2017 + Win32 + + + Release - VS 2017 + x64 + + + + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357} + genesis + 8.1 + + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141_clang_c2 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141_clang_c2 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/genesis/genesis.vcxproj.filters b/externals/genesis/source/genesis/genesis.vcxproj.filters similarity index 64% rename from genesis/genesis.vcxproj.filters rename to externals/genesis/source/genesis/genesis.vcxproj.filters index 01f8b19..f61e34a 100644 --- a/genesis/genesis.vcxproj.filters +++ b/externals/genesis/source/genesis/genesis.vcxproj.filters @@ -1,218 +1,158 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {e4072d57-8fc3-45b0-8a55-890235596a11} - - - {405c586e-518d-4d17-880c-e561a09a5c77} - - - {15239cf0-0a42-40d5-80ce-15256d0c1587} - - - {a2ba6865-a71e-441f-9efc-b6c67888c0a0} - - - {fc0c0321-a05d-41cd-a99c-11c3b68abbc0} - - - {5dc27c9e-86a8-4fb6-a2a8-bbdf434e29a0} - - - {97c6b545-0106-4ab1-8645-a95c5e9add8b} - - - - - license - - - license - - - license - - - license - - - license - - - license\essentials - - - license\essentials - - - license\essentials - - - license\essentials - - - license\essentials - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files\external\essentials - - - Header Files\external\essentials - - - Header Files\external\essentials - - - Header Files\external\essentials - - - Header Files\external\essentials - - - Header Files\external\essentials - - - Header Files\external\essentials - - - Header Files\external\essentials - - - Header Files\external\essentials\compatibility - - - Header Files\external\essentials\compatibility - - - Header Files\external\essentials\compatibility - - - Header Files - - - Header Files - - - Header Files - - - Header Files\external\essentials\compatibility - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files\external\essentials - - - Source Files\external\essentials - - - Source Files\external\essentials - - - Source Files - - - Source Files - - - - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {e4072d57-8fc3-45b0-8a55-890235596a11} + + + {97c6b545-0106-4ab1-8645-a95c5e9add8b} + + + + + license + + + license + + + license + + + license + + + license + + + license\essentials + + + license\essentials + + + license\essentials + + + license\essentials + + + license\essentials + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + \ No newline at end of file diff --git a/genesis/include/build_number.hpp b/externals/genesis/source/genesis/include/build_number.hpp similarity index 92% rename from genesis/include/build_number.hpp rename to externals/genesis/source/genesis/include/build_number.hpp index 05323f7..094a30b 100644 --- a/genesis/include/build_number.hpp +++ b/externals/genesis/source/genesis/include/build_number.hpp @@ -1,42 +1,42 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef BUILD_NUMBER_C13F16F5_B4C0_48CA_BF09_D5EB14953C3C -#define BUILD_NUMBER_C13F16F5_B4C0_48CA_BF09_D5EB14953C3C - - -#include "essentials/compatibility/compatibility.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -namespace version -{ - - -const sxe::uint16_t BUILD_NUMBER( 31 ); - - -} - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BUILD_NUMBER_C13F16F5_B4C0_48CA_BF09_D5EB14953C3C +#define BUILD_NUMBER_C13F16F5_B4C0_48CA_BF09_D5EB14953C3C + + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +namespace version +{ + + +const sxe::uint16_t BUILD_NUMBER( 56 ); + + +} + + +} + + +} + + +#endif diff --git a/genesis/include/condition_block.hpp b/externals/genesis/source/genesis/include/condition_block.hpp similarity index 96% rename from genesis/include/condition_block.hpp rename to externals/genesis/source/genesis/include/condition_block.hpp index a2b684f..77ecb2e 100644 --- a/genesis/include/condition_block.hpp +++ b/externals/genesis/source/genesis/include/condition_block.hpp @@ -1,62 +1,62 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef CONDITION_BLOCK_3922737B_1A00_451A_AFCB_B29D0123210C -#define CONDITION_BLOCK_3922737B_1A00_451A_AFCB_B29D0123210C - - -#include "recipe_block.hpp" -#include "condition_modifier.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -//!\class confition_block -//!\brief class representing an 'if'. This block can have children. -class condition_block SX_FINAL - : public recipe_block -{ -public: - //!\brief constructor - //!\param _condition_name name of the condition block. - //!\param _modifier condition modifier. default value is none. - //!\sa condition_modifier - explicit condition_block( const std::string& _condition_name, const condition_modifier& _modifier = condition_modifier::NONE ); - virtual ~condition_block() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( condition_block ) - - //!\brief create the output for a step. - //!\param _recipe_callback generator callback - //!\param _ostream stream to which the generator writes. - virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; - - -private: - void apply_modifier( bool& _result ) const; - - const std::string condition_name_; - const condition_modifier modifier_; - - -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef CONDITION_BLOCK_3922737B_1A00_451A_AFCB_B29D0123210C +#define CONDITION_BLOCK_3922737B_1A00_451A_AFCB_B29D0123210C + + +#include "recipe_block.hpp" +#include "condition_modifier.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +//!\class confition_block +//!\brief class representing an 'if'. This block can have children. +class condition_block SX_FINAL + : public recipe_block +{ +public: + //!\brief constructor + //!\param _condition_name name of the condition block. + //!\param _modifier condition modifier. default value is none. + //!\sa condition_modifier + explicit condition_block( const std::string& _condition_name, const condition_modifier& _modifier = condition_modifier::NONE ); + virtual ~condition_block() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( condition_block ) + + //!\brief create the output for a step. + //!\param _recipe_callback generator callback + //!\param _ostream stream to which the generator writes. + virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; + + +private: + void apply_modifier( bool& _result ) const; + + const std::string condition_name_; + const condition_modifier modifier_; + + +}; + + +} + + +} + + +#endif diff --git a/genesis/include/condition_modifier.hpp b/externals/genesis/source/genesis/include/condition_modifier.hpp similarity index 96% rename from genesis/include/condition_modifier.hpp rename to externals/genesis/source/genesis/include/condition_modifier.hpp index ae2dbd4..ae1e766 100644 --- a/genesis/include/condition_modifier.hpp +++ b/externals/genesis/source/genesis/include/condition_modifier.hpp @@ -1,102 +1,102 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef CONDITION_MODIFIER_5286AF53_4751_4FDE_B4C9_E097AC8FB331 -#define CONDITION_MODIFIER_5286AF53_4751_4FDE_B4C9_E097AC8FB331 - - -#include - - -namespace sx -{ - - -namespace genesis -{ - - -#ifndef SX_CPP03_BOOST - -//!\enum condition_modifier -//!\brief Modifier for conditions. E.g. negate the result of a check. -enum class condition_modifier -{ - NONE = 0, NOT = 1 -}; - - -#else - - - //!\struct condition_modifier - //!\brief Structure representing a predefined modifier for conditions (enum wrapper for C++11 enum class like behavior). - struct condition_modifier - { - //!\enum condition_modifier - //!\brief Enumeration for predefined modifier for conditions. - enum inner - { - NONE = 0, NOT = 1 - }; - - - //!\brief Constructor. Default value is white. - condition_modifier() : value_( NONE ) - { - // Nothing to do... - } - - - //!\brief Constructor - //!\param _value Given modifier for conditions value that is represented by the structure. - condition_modifier( const inner _value ) : value_( _value ) - { - // Nothing to do... - } - - - //!\brief Constructor - //!\param _condition_modifier Given modifier for conditions structure containing the modifier for conditions that is represented by the structure. - condition_modifier( const condition_modifier& _condition_modifier ) : value_( _condition_modifier.value_ ) - { - // Nothing to do... - } - - - //!\brief Get the modifier for conditions value represented by the structure. - operator inner() const - { - return ( value_ ); - } - - - //!\brief Modifier for conditions represented by the structure. - inner value_; - - }; - - -#endif - - -//!\fn -//!\brief Get the condition modifier value from a string. -//!\param _condition_modifier Modifier as a string, generally read from template files. -//!\return Condition modifier enum value corresponding to the given value. -condition_modifier get_condition_modifier_from_string( const std::string& _condition_modifier ); - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef CONDITION_MODIFIER_5286AF53_4751_4FDE_B4C9_E097AC8FB331 +#define CONDITION_MODIFIER_5286AF53_4751_4FDE_B4C9_E097AC8FB331 + + +#include + + +namespace sx +{ + + +namespace genesis +{ + + +#ifndef SX_CPP03_BOOST + +//!\enum condition_modifier +//!\brief Modifier for conditions. E.g. negate the result of a check. +enum class condition_modifier +{ + NONE = 0, NOT = 1 +}; + + +#else + + + //!\struct condition_modifier + //!\brief Structure representing a predefined modifier for conditions (enum wrapper for C++11 enum class like behavior). + struct condition_modifier + { + //!\enum condition_modifier + //!\brief Enumeration for predefined modifier for conditions. + enum inner + { + NONE = 0, NOT = 1 + }; + + + //!\brief Constructor. Default value is white. + condition_modifier() : value_( NONE ) + { + // Nothing to do... + } + + + //!\brief Constructor + //!\param _value Given modifier for conditions value that is represented by the structure. + condition_modifier( const inner _value ) : value_( _value ) + { + // Nothing to do... + } + + + //!\brief Constructor + //!\param _condition_modifier Given modifier for conditions structure containing the modifier for conditions that is represented by the structure. + condition_modifier( const condition_modifier& _condition_modifier ) : value_( _condition_modifier.value_ ) + { + // Nothing to do... + } + + + //!\brief Get the modifier for conditions value represented by the structure. + operator inner() const + { + return ( value_ ); + } + + + //!\brief Modifier for conditions represented by the structure. + inner value_; + + }; + + +#endif + + +//!\fn +//!\brief Get the condition modifier value from a string. +//!\param _condition_modifier Modifier as a string, generally read from template files. +//!\return Condition modifier enum value corresponding to the given value. +condition_modifier get_condition_modifier_from_string( const std::string& _condition_modifier ); + + +} + + +} + + +#endif diff --git a/genesis/include/file_reader.hpp b/externals/genesis/source/genesis/include/file_reader.hpp similarity index 97% rename from genesis/include/file_reader.hpp rename to externals/genesis/source/genesis/include/file_reader.hpp index 9e9be92..e066747 100644 --- a/genesis/include/file_reader.hpp +++ b/externals/genesis/source/genesis/include/file_reader.hpp @@ -1,39 +1,39 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef FILE_READER_20EC6A5D_A4B2_4EDC_9B67_57B4B0A0DA31 -#define FILE_READER_20EC6A5D_A4B2_4EDC_9B67_57B4B0A0DA31 - - -#include - - -namespace sx -{ - - -namespace genesis -{ - - -//!\fn -//!\brief Function that reads a file into a given string variable. -//!\param _file_path File that is read. -//!\param _content Target for the content of the file. -//!\return True if the read was successful, false otherwise. -bool read( const std::string& _file_path, std::string& _content ); - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef FILE_READER_20EC6A5D_A4B2_4EDC_9B67_57B4B0A0DA31 +#define FILE_READER_20EC6A5D_A4B2_4EDC_9B67_57B4B0A0DA31 + + +#include + + +namespace sx +{ + + +namespace genesis +{ + + +//!\fn +//!\brief Function that reads a file into a given string variable. +//!\param _file_path File that is read. +//!\param _content Target for the content of the file. +//!\return True if the read was successful, false otherwise. +bool read( const std::string& _file_path, std::string& _content ); + + +} + + +} + + +#endif diff --git a/genesis/include/file_writer.hpp b/externals/genesis/source/genesis/include/file_writer.hpp similarity index 97% rename from genesis/include/file_writer.hpp rename to externals/genesis/source/genesis/include/file_writer.hpp index d1f6170..635e36d 100644 --- a/genesis/include/file_writer.hpp +++ b/externals/genesis/source/genesis/include/file_writer.hpp @@ -1,37 +1,37 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef FILE_WRITER_27D8B8DE_AD70_4536_857C_1D75B5D34EB8 -#define FILE_WRITER_27D8B8DE_AD70_4536_857C_1D75B5D34EB8 - - -#include - - -namespace sx -{ - - -namespace genesis -{ - - -//!\fn -//!\brief Function that writes the content of a ostream to the file with the given name. -//!\param _file_path Name of the file that will be written. -//!\param _output_stream Stream that is written to the file. -void write( const std::string& _file_path, const std::ostream& _output_stream ); - - -} - - -} - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef FILE_WRITER_27D8B8DE_AD70_4536_857C_1D75B5D34EB8 +#define FILE_WRITER_27D8B8DE_AD70_4536_857C_1D75B5D34EB8 + + +#include + + +namespace sx +{ + + +namespace genesis +{ + + +//!\fn +//!\brief Function that writes the content of a ostream to the file with the given name. +//!\param _file_path Name of the file that will be written. +//!\param _output_stream Stream that is written to the file. +void write( const std::string& _file_path, const std::ostream& _output_stream ); + + +} + + +} + +#endif diff --git a/genesis/include/genesis_exception.hpp b/externals/genesis/source/genesis/include/genesis_exception.hpp similarity index 97% rename from genesis/include/genesis_exception.hpp rename to externals/genesis/source/genesis/include/genesis_exception.hpp index bb7cfbd..c508b19 100644 --- a/genesis/include/genesis_exception.hpp +++ b/externals/genesis/source/genesis/include/genesis_exception.hpp @@ -1,35 +1,35 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef GENESIS_EXCEPTION_FDA50E1B_5130_4353_9100_E40405E1C32D -#define GENESIS_EXCEPTION_FDA50E1B_5130_4353_9100_E40405E1C32D - - -#include "essentials/exception_template.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -//!\brief Exception class of the genesis library. -SX_EXCEPTION( genesis_exception ) - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GENESIS_EXCEPTION_FDA50E1B_5130_4353_9100_E40405E1C32D +#define GENESIS_EXCEPTION_FDA50E1B_5130_4353_9100_E40405E1C32D + + +#include "essentials/exception_template.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +//!\brief Exception class of the genesis library. +SX_EXCEPTION( genesis_exception ) + + +} + + +} + + +#endif diff --git a/genesis/include/grammar.hpp b/externals/genesis/source/genesis/include/grammar.hpp similarity index 97% rename from genesis/include/grammar.hpp rename to externals/genesis/source/genesis/include/grammar.hpp index 4bfb86f..0253805 100644 --- a/genesis/include/grammar.hpp +++ b/externals/genesis/source/genesis/include/grammar.hpp @@ -1,56 +1,56 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef GRAMMAR_F628CCE8_06DD_43A9_BEE3_C3EB343AC539 -#define GRAMMAR_F628CCE8_06DD_43A9_BEE3_C3EB343AC539 - - -#include - - -namespace sx -{ - - -namespace genesis -{ - - -extern const std::string condition_modifier_NOT; -extern const std::string condition_modifier_NONE; -extern const char DELIMITER_CHAR; -extern const char LINE_BREAK_CHAR; -extern const char OPEN_PARENTHESIS_CHAR; -extern const char CLOSE_PARENTHESIS_CHAR; -extern const char COMMA_CHAR; -extern const std::string COMMA_CLOSE_PARENTHESIS; -extern const std::string VARIABLE_COMMAND; -extern const std::string LOOP_START_COMMAND; -extern const std::string LOOP_END_COMMAND; -extern const std::string IF_START_COMMAND; -extern const std::string IF_END_COMMAND; -extern const std::string SWITCH_START_COMMAND; -extern const std::string SWITCH_END_COMMAND; -extern const std::string SWITCH_CASE_START_COMMAND; -extern const std::string SWITCH_CASE_END_COMMAND; -extern const std::string SWITCH_DEFAULT_START_COMMAND; -extern const std::string SWITCH_DEFAULT_END_COMMAND; -extern const int SWITCH_DEFAULT_INDEX_VALUE; -extern const std::string TEMPLATE_COMMAND; -extern const char NEW_LINE_CHAR; -extern const std::size_t SIZE_ONE; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GRAMMAR_F628CCE8_06DD_43A9_BEE3_C3EB343AC539 +#define GRAMMAR_F628CCE8_06DD_43A9_BEE3_C3EB343AC539 + + +#include + + +namespace sx +{ + + +namespace genesis +{ + + +extern const std::string condition_modifier_NOT; +extern const std::string condition_modifier_NONE; +extern const char DELIMITER_CHAR; +extern const char LINE_BREAK_CHAR; +extern const char OPEN_PARENTHESIS_CHAR; +extern const char CLOSE_PARENTHESIS_CHAR; +extern const char COMMA_CHAR; +extern const std::string COMMA_CLOSE_PARENTHESIS; +extern const std::string VARIABLE_COMMAND; +extern const std::string LOOP_START_COMMAND; +extern const std::string LOOP_END_COMMAND; +extern const std::string IF_START_COMMAND; +extern const std::string IF_END_COMMAND; +extern const std::string SWITCH_START_COMMAND; +extern const std::string SWITCH_END_COMMAND; +extern const std::string SWITCH_CASE_START_COMMAND; +extern const std::string SWITCH_CASE_END_COMMAND; +extern const std::string SWITCH_DEFAULT_START_COMMAND; +extern const std::string SWITCH_DEFAULT_END_COMMAND; +extern const int SWITCH_DEFAULT_INDEX_VALUE; +extern const std::string TEMPLATE_COMMAND; +extern const char NEW_LINE_CHAR; +extern const std::size_t SIZE_ONE; + + +} + + +} + + +#endif diff --git a/genesis/include/loop_block.hpp b/externals/genesis/source/genesis/include/loop_block.hpp similarity index 96% rename from genesis/include/loop_block.hpp rename to externals/genesis/source/genesis/include/loop_block.hpp index 6b7b453..02ee0bf 100644 --- a/genesis/include/loop_block.hpp +++ b/externals/genesis/source/genesis/include/loop_block.hpp @@ -1,54 +1,54 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef LOOP_BLOCK_08F296C5_8660_453B_9AE3_903E1AEE52D9 -#define LOOP_BLOCK_08F296C5_8660_453B_9AE3_903E1AEE52D9 - - -#include "recipe_block.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -//!\class loop_block -//!\brief Class representing a loop. This block can have children. -class loop_block SX_FINAL - : public recipe_block -{ -public: - //!\brief Constructor - //!\param _loop_name Name of the loop block. - explicit loop_block( const std::string& _loop_name); - virtual ~loop_block() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( loop_block ) - - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream Stream to which the generator writes. - virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; - - -private: - const std::string loop_name_; -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef LOOP_BLOCK_08F296C5_8660_453B_9AE3_903E1AEE52D9 +#define LOOP_BLOCK_08F296C5_8660_453B_9AE3_903E1AEE52D9 + + +#include "recipe_block.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +//!\class loop_block +//!\brief Class representing a loop. This block can have children. +class loop_block SX_FINAL + : public recipe_block +{ +public: + //!\brief Constructor + //!\param _loop_name Name of the loop block. + explicit loop_block( const std::string& _loop_name); + virtual ~loop_block() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( loop_block ) + + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream Stream to which the generator writes. + virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; + + +private: + const std::string loop_name_; +}; + + +} + + +} + + +#endif diff --git a/genesis/include/messages.hpp b/externals/genesis/source/genesis/include/messages.hpp similarity index 96% rename from genesis/include/messages.hpp rename to externals/genesis/source/genesis/include/messages.hpp index 9a4bef3..2ac68ba 100644 --- a/genesis/include/messages.hpp +++ b/externals/genesis/source/genesis/include/messages.hpp @@ -1,35 +1,35 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef MESSAGES_790A336F_D398_4F59_93F0_8C44B7267E3D -#define MESSAGES_790A336F_D398_4F59_93F0_8C44B7267E3D - - -#include - - -namespace sx -{ - - -namespace genesis -{ - - -//!\brief Message for reporting an error while writing a file. -extern const std::string ERROR_WRITE_FILE; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef MESSAGES_790A336F_D398_4F59_93F0_8C44B7267E3D +#define MESSAGES_790A336F_D398_4F59_93F0_8C44B7267E3D + + +#include + + +namespace sx +{ + + +namespace genesis +{ + + +//!\brief Message for reporting an error while writing a file. +extern const std::string ERROR_WRITE_FILE; + + +} + + +} + + +#endif diff --git a/genesis/include/recipe.hpp b/externals/genesis/source/genesis/include/recipe.hpp similarity index 96% rename from genesis/include/recipe.hpp rename to externals/genesis/source/genesis/include/recipe.hpp index 0da0794..7ff6a88 100644 --- a/genesis/include/recipe.hpp +++ b/externals/genesis/source/genesis/include/recipe.hpp @@ -1,64 +1,64 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef RECIPE_20F2FCF1_99D0_4CC6_9E59_3E9BE7C1A2A6 -#define RECIPE_20F2FCF1_99D0_4CC6_9E59_3E9BE7C1A2A6 - - -#include "template_block.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -class recipe_step; - -//!\class recipe -//!\brief Class for generating code from the given template and using the given callback. It can write the generated code -//!\to the given file. -class recipe : public template_block -{ -public: - //!\brief Constructor - //!\param _template_name Name of the file containing the used template. - //!\param _recipe_callback Generator callback - //!\param _templates_path Path to the templates folder. - explicit recipe( const std::string& _template_name, recipe_callback& _recipe_callback, - const std::string& _templates_path ); - virtual ~recipe() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( recipe ) - - //!\brief Generates the code in a internal stream. - void generate(); - - //!\brief Write the generated code to the file with the given name. - //!\param _file_path Path of the while to which the generated code will be written. - void write_to_file( const std::string& _file_path ) const; - - -private: - void create_impl( recipe_callback& _recipe_callback ); - - recipe_callback& recipe_callback_; - std::stringstream stream_; -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef RECIPE_20F2FCF1_99D0_4CC6_9E59_3E9BE7C1A2A6 +#define RECIPE_20F2FCF1_99D0_4CC6_9E59_3E9BE7C1A2A6 + + +#include "template_block.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +class recipe_step; + +//!\class recipe +//!\brief Class for generating code from the given template and using the given callback. It can write the generated code +//!\to the given file. +class recipe : public template_block +{ +public: + //!\brief Constructor + //!\param _template_name Name of the file containing the used template. + //!\param _recipe_callback Generator callback + //!\param _templates_path Path to the templates folder. + explicit recipe( const std::string& _template_name, recipe_callback& _recipe_callback, + const std::string& _templates_path ); + virtual ~recipe() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( recipe ) + + //!\brief Generates the code in a internal stream. + void generate(); + + //!\brief Write the generated code to the file with the given name. + //!\param _file_path Path of the while to which the generated code will be written. + void write_to_file( const std::string& _file_path ) const; + + +private: + void create_impl( recipe_callback& _recipe_callback ); + + recipe_callback& recipe_callback_; + std::stringstream stream_; +}; + + +} + + +} + + +#endif diff --git a/genesis/include/recipe_block.hpp b/externals/genesis/source/genesis/include/recipe_block.hpp similarity index 96% rename from genesis/include/recipe_block.hpp rename to externals/genesis/source/genesis/include/recipe_block.hpp index 73d72ea..339127e 100644 --- a/genesis/include/recipe_block.hpp +++ b/externals/genesis/source/genesis/include/recipe_block.hpp @@ -1,59 +1,59 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef RECIPE_BLOCK_A5AF03FF_E23E_4887_A4C8_44C6E8605983 -#define RECIPE_BLOCK_A5AF03FF_E23E_4887_A4C8_44C6E8605983 - - -#include - -#include "recipe_step.hpp" - - -namespace sx -{ - - -namespace genesis -{ - -//!\class recipe_block -//!\brief Class that represents a recipe block. This block can have children. -class recipe_block : public recipe_step -{ -public: - //!\brief Constructor - explicit recipe_block(); - virtual ~recipe_block() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( recipe_block ) - - //!\brief Add a child to the list of children. - //!\param _child New child - virtual void add_child( sxe::SX_UNIQUE_PTR _child ); - - -protected: - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream Stream to which the generator writes. - virtual void create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ); - - -private: - std::vector< sxe::SX_UNIQUE_PTR > child_recipes_; -}; - - -} - - -} - - +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef RECIPE_BLOCK_A5AF03FF_E23E_4887_A4C8_44C6E8605983 +#define RECIPE_BLOCK_A5AF03FF_E23E_4887_A4C8_44C6E8605983 + + +#include + +#include "recipe_step.hpp" + + +namespace sx +{ + + +namespace genesis +{ + +//!\class recipe_block +//!\brief Class that represents a recipe block. This block can have children. +class recipe_block : public recipe_step +{ +public: + //!\brief Constructor + explicit recipe_block(); + virtual ~recipe_block() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( recipe_block ) + + //!\brief Add a child to the list of children. + //!\param _child New child + virtual void add_child( sxe::SX_UNIQUE_PTR _child ); + + +protected: + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream Stream to which the generator writes. + virtual void create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ); + + +private: + std::vector< sxe::SX_UNIQUE_PTR > child_recipes_; +}; + + +} + + +} + + #endif \ No newline at end of file diff --git a/genesis/include/recipe_callback.hpp b/externals/genesis/source/genesis/include/recipe_callback.hpp similarity index 97% rename from genesis/include/recipe_callback.hpp rename to externals/genesis/source/genesis/include/recipe_callback.hpp index 4d80fe7..46c696d 100644 --- a/genesis/include/recipe_callback.hpp +++ b/externals/genesis/source/genesis/include/recipe_callback.hpp @@ -1,98 +1,98 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef RECIPE_CALLBACK_94CA6C50_A463_41C9_B424_D595F361B6C2 -#define RECIPE_CALLBACK_94CA6C50_A463_41C9_B424_D595F361B6C2 - - -#include "essentials/compatibility/compatibility.hpp" -#include "essentials/non_copyable.hpp" - -#include "condition_modifier.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -//!\interface -//!\brief Callback Interface that needs to be implemented by a generator. -class recipe_callback -{ -public: - //!\brief Constructor - explicit recipe_callback() - { - // Nothing to do... - } - - - virtual ~recipe_callback() SX_NOEXCEPT - { - // Nothing to do... - } - - - SX_NO_COPY( recipe_callback ) - - //!\brief Get the content of a variable. - //!\param _variable_name Name of the variable for which the value is requested. - //!\return String Value of the given variable. - virtual std::string get_variable_content( const std::string& _variable_name ) = 0; - - //!\brief Check the condition of a loop_block. - //!\param _loop_name Name of the loop block that is executed. - virtual bool check_loop_condition( const std::string& _loop_name ) const = 0; - - //!\brief Execute actions before a loop_block. - //!\param _loop_name Name of the loop block that is executed. - virtual void before_loop( const std::string& _loop_name ) = 0; - - //!\brief Execute actions before an iteration of a loop_block. - //!\param _loop_name Name of the loop block that is executed. - virtual void before_loop_iteration( const std::string& _loop_name ) = 0; - - //!\brief Execute actions after an iteration of a loop_block. - //!\param _loop_name Name of the loop block that is executed. - virtual void after_loop_iteration( const std::string& _loop_name ) = 0; - - //!\brief Execute actions after a loop_block. - //!\param _loop_name Name of the loop block that is executed. - virtual void after_loop( const std::string& _loop_name ) = 0; - - //!\brief Check the condition of a condition_block. - //!\param _loop_name Name of the condition block that is executed. - virtual bool check_condition( const std::string& _condition_name ) const = 0; - - //!\brief Execute actions before a condition_block. - //!\param _loop_name Name of the condition block that is executed. - virtual void condition_begin( const std::string& _condition_name ) = 0; - - //!\brief Execute actions after a condition_block. - //!\param _loop_name Name of the condition block that is executed. - virtual void condition_end( const std::string& _condition_name ) = 0; - - //!\brief Returns the index of the case of the switch with the given name which shall be executed. - //!\param _switch_name Name of the switch block for which the case index is requested. - //!\return The index of the case that shall be executed. - virtual int get_switch_case( const std::string& _switch_name ) = 0; -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef RECIPE_CALLBACK_94CA6C50_A463_41C9_B424_D595F361B6C2 +#define RECIPE_CALLBACK_94CA6C50_A463_41C9_B424_D595F361B6C2 + + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/non_copyable.hpp" + +#include "condition_modifier.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +//!\interface +//!\brief Callback Interface that needs to be implemented by a generator. +class recipe_callback +{ +public: + //!\brief Constructor + explicit recipe_callback() + { + // Nothing to do... + } + + + virtual ~recipe_callback() SX_NOEXCEPT + { + // Nothing to do... + } + + + SX_NO_COPY( recipe_callback ) + + //!\brief Get the content of a variable. + //!\param _variable_name Name of the variable for which the value is requested. + //!\return String Value of the given variable. + virtual std::string get_variable_content( const std::string& _variable_name ) = 0; + + //!\brief Check the condition of a loop_block. + //!\param _loop_name Name of the loop block that is executed. + virtual bool check_loop_condition( const std::string& _loop_name ) const = 0; + + //!\brief Execute actions before a loop_block. + //!\param _loop_name Name of the loop block that is executed. + virtual void before_loop( const std::string& _loop_name ) = 0; + + //!\brief Execute actions before an iteration of a loop_block. + //!\param _loop_name Name of the loop block that is executed. + virtual void before_loop_iteration( const std::string& _loop_name ) = 0; + + //!\brief Execute actions after an iteration of a loop_block. + //!\param _loop_name Name of the loop block that is executed. + virtual void after_loop_iteration( const std::string& _loop_name ) = 0; + + //!\brief Execute actions after a loop_block. + //!\param _loop_name Name of the loop block that is executed. + virtual void after_loop( const std::string& _loop_name ) = 0; + + //!\brief Check the condition of a condition_block. + //!\param _loop_name Name of the condition block that is executed. + virtual bool check_condition( const std::string& _condition_name ) const = 0; + + //!\brief Execute actions before a condition_block. + //!\param _loop_name Name of the condition block that is executed. + virtual void condition_begin( const std::string& _condition_name ) = 0; + + //!\brief Execute actions after a condition_block. + //!\param _loop_name Name of the condition block that is executed. + virtual void condition_end( const std::string& _condition_name ) = 0; + + //!\brief Returns the index of the case of the switch with the given name which shall be executed. + //!\param _switch_name Name of the switch block for which the case index is requested. + //!\return The index of the case that shall be executed. + virtual int get_switch_case( const std::string& _switch_name ) = 0; +}; + + +} + + +} + + +#endif diff --git a/genesis/include/recipe_step.hpp b/externals/genesis/source/genesis/include/recipe_step.hpp similarity index 96% rename from genesis/include/recipe_step.hpp rename to externals/genesis/source/genesis/include/recipe_step.hpp index 553992f..aa0418b 100644 --- a/genesis/include/recipe_step.hpp +++ b/externals/genesis/source/genesis/include/recipe_step.hpp @@ -1,63 +1,63 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef RECIPE_STEP_1A42F342_F0C6_49C9_8FC3_0BAEDFBD05AE -#define RECIPE_STEP_1A42F342_F0C6_49C9_8FC3_0BAEDFBD05AE - - -#include - -#include "essentials/compatibility/compatibility.hpp" -#include "essentials/non_copyable.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -class recipe_callback; - - -//!\interface recipe_step -//!\brief A step of a recipe. -class recipe_step -{ -public: - //!\brief Constructor - recipe_step() - { - // Nothing to do... - } - - - virtual ~recipe_step() SX_NOEXCEPT - { - // Nothing to do... - } - - - SX_NO_COPY( recipe_step ) - - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream Stream to which the generator writes. - virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) = 0; -}; - - -} - - -} - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef RECIPE_STEP_1A42F342_F0C6_49C9_8FC3_0BAEDFBD05AE +#define RECIPE_STEP_1A42F342_F0C6_49C9_8FC3_0BAEDFBD05AE + + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/non_copyable.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +class recipe_callback; + + +//!\interface recipe_step +//!\brief A step of a recipe. +class recipe_step +{ +public: + //!\brief Constructor + recipe_step() + { + // Nothing to do... + } + + + virtual ~recipe_step() SX_NOEXCEPT + { + // Nothing to do... + } + + + SX_NO_COPY( recipe_step ) + + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream Stream to which the generator writes. + virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) = 0; +}; + + +} + + +} + +#endif diff --git a/genesis/include/switch_block.hpp b/externals/genesis/source/genesis/include/switch_block.hpp similarity index 97% rename from genesis/include/switch_block.hpp rename to externals/genesis/source/genesis/include/switch_block.hpp index 3ad8e38..331068c 100644 --- a/genesis/include/switch_block.hpp +++ b/externals/genesis/source/genesis/include/switch_block.hpp @@ -1,75 +1,75 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SWITCH_BLOCK_DBBA48C9_294D_4F33_8424_CCD31767B4BC -#define SWITCH_BLOCK_DBBA48C9_294D_4F33_8424_CCD31767B4BC - - -#include "recipe_block.hpp" - -#include - - -namespace sx -{ - - -namespace genesis -{ - - -//!\class switch_block -//!\brief class representing an 'switch'. This block can have children. -class switch_block SX_FINAL - : public recipe_block -{ -public: - //!\brief constructor - //!\param _switch_name Name of the switch block. - explicit switch_block( const std::string& _switch_name ); - virtual ~switch_block() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( switch_block ) - - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream stream to which the generator writes. - virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; - - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream Stream to which the generator writes. - virtual void create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; - - //!\brief Add a child to the list of children. - //!\param _child New child - virtual void add_child( sxe::SX_UNIQUE_PTR _child ) SX_OVERRIDE; - - - //!\brief Set the internal index for the current case. This is only used during parsing of a template. - //!\param _index Index value. Index value must be greater than or equal to zero. - void set_case_index( const int _index ); - - -private: - const std::string switch_name_; - int current_case_index_; - std::map< int, std::vector< sxe::SX_UNIQUE_PTR > > switch_cases_; - std::vector< sxe::SX_UNIQUE_PTR > default_; - - -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SWITCH_BLOCK_DBBA48C9_294D_4F33_8424_CCD31767B4BC +#define SWITCH_BLOCK_DBBA48C9_294D_4F33_8424_CCD31767B4BC + + +#include "recipe_block.hpp" + +#include + + +namespace sx +{ + + +namespace genesis +{ + + +//!\class switch_block +//!\brief class representing an 'switch'. This block can have children. +class switch_block SX_FINAL + : public recipe_block +{ +public: + //!\brief constructor + //!\param _switch_name Name of the switch block. + explicit switch_block( const std::string& _switch_name ); + virtual ~switch_block() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( switch_block ) + + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream stream to which the generator writes. + virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; + + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream Stream to which the generator writes. + virtual void create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; + + //!\brief Add a child to the list of children. + //!\param _child New child + virtual void add_child( sxe::SX_UNIQUE_PTR _child ) SX_OVERRIDE; + + + //!\brief Set the internal index for the current case. This is only used during parsing of a template. + //!\param _index Index value. Index value must be greater than or equal to zero. + void set_case_index( const int _index ); + + +private: + const std::string switch_name_; + int current_case_index_; + std::map< int, std::vector< sxe::SX_UNIQUE_PTR > > switch_cases_; + std::vector< sxe::SX_UNIQUE_PTR > default_; + + +}; + + +} + + +} + + +#endif diff --git a/genesis/include/template_block.hpp b/externals/genesis/source/genesis/include/template_block.hpp similarity index 96% rename from genesis/include/template_block.hpp rename to externals/genesis/source/genesis/include/template_block.hpp index c284590..f9ac035 100644 --- a/genesis/include/template_block.hpp +++ b/externals/genesis/source/genesis/include/template_block.hpp @@ -1,103 +1,103 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef TEMPLATE_BLOCK_43849414_0A6E_429C_9D51_FB0562A58B05 -#define TEMPLATE_BLOCK_43849414_0A6E_429C_9D51_FB0562A58B05 - - -#include - -#include "recipe_block.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -class text_step; -class variable_step; -class loop_block; -class condition_block; - - -//!\class template_block -//!\brief Class representing a recipe block created from a template file. -class template_block - : public recipe_block -{ -public: - //!\brief Constructor. Get the template file name and the path to the template directory. - //!\param _template_name Name of the template file. - //!\param _template_path Path to templates directory - explicit template_block( const std::string& _template_name, const std::string& _template_path ); - virtual ~template_block() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( template_block ) - - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream Stream to which the generator writes. - virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; - - -private: - void parse( std::string& _file_buffer ); - void get_text( std::string &_file_buffer ); - std::string get_keyword( std::string& _file_buffer ); - void get_variable( std::string &_file_buffer ); - void get_loop( std::string &_file_buffer ); - void get_if( std::string &_file_buffer ); - void get_switch( std::string& _file_buffer ); - void get_switch_case( std::string& _file_buffer ); - void get_switch_default( std::string& _file_buffer ); - void get_template( std::string &_file_buffer ); - const std::string get_last_to_be_closed() const; - static std::string read_template_file( const std::string& _file_buffer, const std::string& _templates_path ); - void check_new_line_after_end_command( std::string &_file_buffer ); - void close_loop( std::string& _file_buffer ); - void close_condition( std::string& _file_buffer ); - void close_switch( std::string& _file_buffer ); - void close_switch_case( std::string& _file_buffer ); - void close_switch_default( std::string& _file_buffer ); - bool is_any_recipe_open() const; - std::vector get_parameters( std::string& _file_buffer ) const; - void final_check() const; - - template - void add_child_to_recipe( sxe::SX_UNIQUE_PTR _child ) - { - if( opened_recipes_.empty() ) - { - add_child( sxe::move( _child ) ); - } - else - { - opened_recipes_.top()->add_child( sxe::move( _child ) ); - } - } - - - std::stack opened_recipes_; - std::vector keywords_; - std::string template_to_parse_; - const std::string& template_path_; - const std::string& template_file_; -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef TEMPLATE_BLOCK_43849414_0A6E_429C_9D51_FB0562A58B05 +#define TEMPLATE_BLOCK_43849414_0A6E_429C_9D51_FB0562A58B05 + + +#include + +#include "recipe_block.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +class text_step; +class variable_step; +class loop_block; +class condition_block; + + +//!\class template_block +//!\brief Class representing a recipe block created from a template file. +class template_block + : public recipe_block +{ +public: + //!\brief Constructor. Get the template file name and the path to the template directory. + //!\param _template_name Name of the template file. + //!\param _template_path Path to templates directory + explicit template_block( const std::string& _template_name, const std::string& _template_path ); + virtual ~template_block() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( template_block ) + + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream Stream to which the generator writes. + virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; + + +private: + void parse( std::string& _file_buffer ); + void get_text( std::string &_file_buffer ); + std::string get_keyword( std::string& _file_buffer ); + void get_variable( std::string &_file_buffer ); + void get_loop( std::string &_file_buffer ); + void get_if( std::string &_file_buffer ); + void get_switch( std::string& _file_buffer ); + void get_switch_case( std::string& _file_buffer ); + void get_switch_default( std::string& _file_buffer ); + void get_template( std::string &_file_buffer ); + const std::string get_last_to_be_closed() const; + static std::string read_template_file( const std::string& _file_buffer, const std::string& _templates_path ); + void check_new_line_after_end_command( std::string &_file_buffer ); + void close_loop( std::string& _file_buffer ); + void close_condition( std::string& _file_buffer ); + void close_switch( std::string& _file_buffer ); + void close_switch_case( std::string& _file_buffer ); + void close_switch_default( std::string& _file_buffer ); + bool is_any_recipe_open() const; + std::vector get_parameters( std::string& _file_buffer ) const; + void final_check() const; + + template + void add_child_to_recipe( sxe::SX_UNIQUE_PTR _child ) + { + if( opened_recipes_.empty() ) + { + add_child( sxe::move( _child ) ); + } + else + { + opened_recipes_.top()->add_child( sxe::move( _child ) ); + } + } + + + std::stack opened_recipes_; + std::vector keywords_; + std::string template_to_parse_; + const std::string& template_path_; + const std::string& template_file_; +}; + + +} + + +} + + +#endif diff --git a/genesis/include/text_step.hpp b/externals/genesis/source/genesis/include/text_step.hpp similarity index 96% rename from genesis/include/text_step.hpp rename to externals/genesis/source/genesis/include/text_step.hpp index fc7548d..566c90f 100644 --- a/genesis/include/text_step.hpp +++ b/externals/genesis/source/genesis/include/text_step.hpp @@ -1,54 +1,54 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef TEXT_STEP_56DA4C34_9848_4123_AB65_1C9839E009A2 -#define TEXT_STEP_56DA4C34_9848_4123_AB65_1C9839E009A2 - - -#include "recipe_step.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -//!\class test_step -//!\brief Class representing a text step of the recipe. -class text_step SX_FINAL - : public recipe_step -{ -public: - //!\brief Constructor - //!\param _text Content of the text block. - explicit text_step( const std::string& _text ); - virtual ~text_step() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( text_step ) - - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream Stream to which the generator writes. - virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; - - -private: - const std::string text_; -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef TEXT_STEP_56DA4C34_9848_4123_AB65_1C9839E009A2 +#define TEXT_STEP_56DA4C34_9848_4123_AB65_1C9839E009A2 + + +#include "recipe_step.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +//!\class test_step +//!\brief Class representing a text step of the recipe. +class text_step SX_FINAL + : public recipe_step +{ +public: + //!\brief Constructor + //!\param _text Content of the text block. + explicit text_step( const std::string& _text ); + virtual ~text_step() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( text_step ) + + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream Stream to which the generator writes. + virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; + + +private: + const std::string text_; +}; + + +} + + +} + + +#endif diff --git a/genesis/include/variable_step.hpp b/externals/genesis/source/genesis/include/variable_step.hpp similarity index 96% rename from genesis/include/variable_step.hpp rename to externals/genesis/source/genesis/include/variable_step.hpp index c8ae270..f0aebe6 100644 --- a/genesis/include/variable_step.hpp +++ b/externals/genesis/source/genesis/include/variable_step.hpp @@ -1,54 +1,54 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef VARIABLE_STEP_11B39100_54E6_40E4_85FC_0A642202937C -#define VARIABLE_STEP_11B39100_54E6_40E4_85FC_0A642202937C - - -#include "recipe_step.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -//!\class variable_step -//!\brief Class representing a variable step of the recipe. -class variable_step SX_FINAL - : public recipe_step -{ -public: - //!\brief Constructor - //!\param _variable_name Name of the variable represented by the variable_step. - explicit variable_step( const std::string& _variable_name ); - virtual ~variable_step() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY( variable_step ) - - //!\brief Create the output for a step. - //!\param _recipe_callback Generator callback - //!\param _ostream Stream to which the generator writes. - virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; - - -private: - const std::string variable_name_; -}; - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef VARIABLE_STEP_11B39100_54E6_40E4_85FC_0A642202937C +#define VARIABLE_STEP_11B39100_54E6_40E4_85FC_0A642202937C + + +#include "recipe_step.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +//!\class variable_step +//!\brief Class representing a variable step of the recipe. +class variable_step SX_FINAL + : public recipe_step +{ +public: + //!\brief Constructor + //!\param _variable_name Name of the variable represented by the variable_step. + explicit variable_step( const std::string& _variable_name ); + virtual ~variable_step() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY( variable_step ) + + //!\brief Create the output for a step. + //!\param _recipe_callback Generator callback + //!\param _ostream Stream to which the generator writes. + virtual void create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) SX_OVERRIDE; + + +private: + const std::string variable_name_; +}; + + +} + + +} + + +#endif diff --git a/genesis/include/version.hpp b/externals/genesis/source/genesis/include/version.hpp similarity index 96% rename from genesis/include/version.hpp rename to externals/genesis/source/genesis/include/version.hpp index aede3f0..e21a917 100644 --- a/genesis/include/version.hpp +++ b/externals/genesis/source/genesis/include/version.hpp @@ -1,48 +1,48 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef VERSION_11BB60D2_9C1A_4102_BBCC_0486F61F9C1C -#define VERSION_11BB60D2_9C1A_4102_BBCC_0486F61F9C1C - - -#include "essentials/compatibility/compatibility.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -namespace version -{ - - -void log_version(); - - -sxe::uint16_t get_major_version(); -sxe::uint16_t get_minor_version(); -sxe::uint16_t get_patch_version(); -sxe::uint16_t get_build_number(); - - -} - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef VERSION_11BB60D2_9C1A_4102_BBCC_0486F61F9C1C +#define VERSION_11BB60D2_9C1A_4102_BBCC_0486F61F9C1C + + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +namespace version +{ + + +void log_version(); + + +sxe::uint16_t get_major_version(); +sxe::uint16_t get_minor_version(); +sxe::uint16_t get_patch_version(); +sxe::uint16_t get_build_number(); + + +} + + +} + + +} + + +#endif diff --git a/genesis/source/condition_block.cpp b/externals/genesis/source/genesis/source/condition_block.cpp similarity index 96% rename from genesis/source/condition_block.cpp rename to externals/genesis/source/genesis/source/condition_block.cpp index 32e101a..66dc01e 100644 --- a/genesis/source/condition_block.cpp +++ b/externals/genesis/source/genesis/source/condition_block.cpp @@ -1,75 +1,75 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "condition_block.hpp" - -#include "essentials/exception.hpp" - -#include "recipe_callback.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -condition_block::condition_block( const std::string& _condition_name, const condition_modifier& _modifier ) : - recipe_block(), - condition_name_( _condition_name ), - modifier_( _modifier ) -{ - // Nothing to do... -} - - -condition_block::~condition_block() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void condition_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - _recipe_callback.condition_begin( condition_name_ ); - bool result = _recipe_callback.check_condition( condition_name_ ); - apply_modifier( result ); - if( result ) - { - create_children( _recipe_callback, _ostream ); - _recipe_callback.condition_end( condition_name_ ); - } -} - - -void condition_block::apply_modifier( bool& _result ) const -{ - switch( modifier_ ) - { - case sx::genesis::condition_modifier::NOT: - _result = !_result; - break; - - case sx::genesis::condition_modifier::NONE: - // Nothing to do... - break; - - default: - sxe::exception( "Incompatible value for condition modifier!" ); - break; - } -} - - -} - - +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "condition_block.hpp" + +#include "essentials/exception.hpp" + +#include "recipe_callback.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +condition_block::condition_block( const std::string& _condition_name, const condition_modifier& _modifier ) : + recipe_block(), + condition_name_( _condition_name ), + modifier_( _modifier ) +{ + // Nothing to do... +} + + +condition_block::~condition_block() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void condition_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + _recipe_callback.condition_begin( condition_name_ ); + bool result = _recipe_callback.check_condition( condition_name_ ); + apply_modifier( result ); + if( result ) + { + create_children( _recipe_callback, _ostream ); + _recipe_callback.condition_end( condition_name_ ); + } +} + + +void condition_block::apply_modifier( bool& _result ) const +{ + switch( modifier_ ) + { + case sx::genesis::condition_modifier::NOT: + _result = !_result; + break; + + case sx::genesis::condition_modifier::NONE: + // Nothing to do... + break; + + default: + sxe::exception( "Incompatible value for condition modifier!" ); + break; + } +} + + +} + + } \ No newline at end of file diff --git a/genesis/source/condition_modifier.cpp b/externals/genesis/source/genesis/source/condition_modifier.cpp similarity index 96% rename from genesis/source/condition_modifier.cpp rename to externals/genesis/source/genesis/source/condition_modifier.cpp index b6a8f5c..5aada78 100644 --- a/genesis/source/condition_modifier.cpp +++ b/externals/genesis/source/genesis/source/condition_modifier.cpp @@ -1,52 +1,52 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "condition_modifier.hpp" - -#include - -#include "essentials/conversion.hpp" - -#include "grammar.hpp" -#include "genesis_exception.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -condition_modifier get_condition_modifier_from_string( const std::string& _condition_modifier ) -{ - const std::string condition_modifier_caps = sxe::to_upper( _condition_modifier ); - - condition_modifier modifier( condition_modifier::NONE ); - if( condition_modifier_caps == condition_modifier_NOT ) - { - modifier = condition_modifier::NOT; - } - else if( condition_modifier_caps == condition_modifier_NONE ) - { - modifier = condition_modifier::NONE; - } - else - { - throw sx::genesis::genesis_exception( "Invalid condition modifier!" ); - } - return ( modifier ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "condition_modifier.hpp" + +#include + +#include "essentials/conversion.hpp" + +#include "grammar.hpp" +#include "genesis_exception.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +condition_modifier get_condition_modifier_from_string( const std::string& _condition_modifier ) +{ + const std::string condition_modifier_caps = sxe::to_upper( _condition_modifier ); + + condition_modifier modifier( condition_modifier::NONE ); + if( condition_modifier_caps == condition_modifier_NOT ) + { + modifier = condition_modifier::NOT; + } + else if( condition_modifier_caps == condition_modifier_NONE ) + { + modifier = condition_modifier::NONE; + } + else + { + throw sx::genesis::genesis_exception( "Invalid condition modifier!" ); + } + return ( modifier ); +} + + +} + + +} diff --git a/genesis/source/file_reader.cpp b/externals/genesis/source/genesis/source/file_reader.cpp similarity index 96% rename from genesis/source/file_reader.cpp rename to externals/genesis/source/genesis/source/file_reader.cpp index db25ecc..f5e63f1 100644 --- a/genesis/source/file_reader.cpp +++ b/externals/genesis/source/genesis/source/file_reader.cpp @@ -1,42 +1,42 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "file_reader.hpp" - -#include -#include - - -namespace sx -{ - -namespace genesis -{ - - -bool read( const std::string& _file_path, std::string& _content ) -{ - bool read = false; - std::ostringstream outputString; - std::ifstream inputFile( _file_path.c_str(), std::ios::in ); - if( inputFile ) - { - outputString << inputFile.rdbuf(); - inputFile.close(); - read = true; - } - _content = outputString.str(); - return ( read ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "file_reader.hpp" + +#include +#include + + +namespace sx +{ + +namespace genesis +{ + + +bool read( const std::string& _file_path, std::string& _content ) +{ + bool read = false; + std::ostringstream outputString; + std::ifstream inputFile( _file_path.c_str(), std::ios::in ); + if( inputFile ) + { + outputString << inputFile.rdbuf(); + inputFile.close(); + read = true; + } + _content = outputString.str(); + return ( read ); +} + + +} + + +} diff --git a/genesis/source/file_writer.cpp b/externals/genesis/source/genesis/source/file_writer.cpp similarity index 96% rename from genesis/source/file_writer.cpp rename to externals/genesis/source/genesis/source/file_writer.cpp index c7f282e..6118b56 100644 --- a/genesis/source/file_writer.cpp +++ b/externals/genesis/source/genesis/source/file_writer.cpp @@ -1,49 +1,49 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "file_writer.hpp" - -#include - -#include "genesis_exception.hpp" -#include "messages.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -void write( const std::string& _file_path, const std::ostream& _output_stream ) -{ -#ifdef SX_CPP03_BOOST - std::ofstream target_file( _file_path.c_str(), std::ios_base::out ); -#else - std::ofstream target_file( _file_path, std::ios_base::out ); -#endif - - if( target_file.is_open() ) - { - target_file << _output_stream.rdbuf(); - target_file.close(); - } - else - { - throw sx::genesis::genesis_exception( ERROR_WRITE_FILE, _file_path ); - } -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "file_writer.hpp" + +#include + +#include "genesis_exception.hpp" +#include "messages.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +void write( const std::string& _file_path, const std::ostream& _output_stream ) +{ +#ifdef SX_CPP03_BOOST + std::ofstream target_file( _file_path.c_str(), std::ios_base::out ); +#else + std::ofstream target_file( _file_path, std::ios_base::out ); +#endif + + if( target_file.is_open() ) + { + target_file << _output_stream.rdbuf(); + target_file.close(); + } + else + { + throw sx::genesis::genesis_exception( ERROR_WRITE_FILE, _file_path ); + } +} + + +} + + +} diff --git a/genesis/source/grammar.cpp b/externals/genesis/source/genesis/source/grammar.cpp similarity index 97% rename from genesis/source/grammar.cpp rename to externals/genesis/source/genesis/source/grammar.cpp index 7326e84..d03f575 100644 --- a/genesis/source/grammar.cpp +++ b/externals/genesis/source/genesis/source/grammar.cpp @@ -1,49 +1,49 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "grammar.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -const std::string condition_modifier_NOT = "NOT"; -const std::string condition_modifier_NONE = "NONE"; -const char DELIMITER_CHAR = '$'; -const char LINE_BREAK_CHAR = '@'; -const char OPEN_PARENTHESIS_CHAR = '('; -const char CLOSE_PARENTHESIS_CHAR = ')'; -const char COMMA_CHAR = ','; -const std::string COMMA_CLOSE_PARENTHESIS = ",)"; -const std::string VARIABLE_COMMAND = "$var"; -const std::string LOOP_START_COMMAND = "$loop"; -const std::string LOOP_END_COMMAND = "$pool"; -const std::string IF_START_COMMAND = "$if"; -const std::string IF_END_COMMAND = "$fi"; -const std::string SWITCH_START_COMMAND = "$switch"; -const std::string SWITCH_END_COMMAND = "$hctiws"; -const std::string SWITCH_CASE_START_COMMAND = "$case"; -const std::string SWITCH_CASE_END_COMMAND = "$esac"; -const std::string SWITCH_DEFAULT_START_COMMAND = "$default"; -const std::string SWITCH_DEFAULT_END_COMMAND = "$tluafed"; -const int SWITCH_DEFAULT_INDEX_VALUE = -1; -const std::string TEMPLATE_COMMAND = "$template"; -const char NEW_LINE_CHAR = '\n'; -const std::size_t SIZE_ONE = 1; - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "grammar.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +const std::string condition_modifier_NOT = "NOT"; +const std::string condition_modifier_NONE = "NONE"; +const char DELIMITER_CHAR = '$'; +const char LINE_BREAK_CHAR = '@'; +const char OPEN_PARENTHESIS_CHAR = '('; +const char CLOSE_PARENTHESIS_CHAR = ')'; +const char COMMA_CHAR = ','; +const std::string COMMA_CLOSE_PARENTHESIS = ",)"; +const std::string VARIABLE_COMMAND = "$var"; +const std::string LOOP_START_COMMAND = "$loop"; +const std::string LOOP_END_COMMAND = "$pool"; +const std::string IF_START_COMMAND = "$if"; +const std::string IF_END_COMMAND = "$fi"; +const std::string SWITCH_START_COMMAND = "$switch"; +const std::string SWITCH_END_COMMAND = "$hctiws"; +const std::string SWITCH_CASE_START_COMMAND = "$case"; +const std::string SWITCH_CASE_END_COMMAND = "$esac"; +const std::string SWITCH_DEFAULT_START_COMMAND = "$default"; +const std::string SWITCH_DEFAULT_END_COMMAND = "$tluafed"; +const int SWITCH_DEFAULT_INDEX_VALUE = -1; +const std::string TEMPLATE_COMMAND = "$template"; +const char NEW_LINE_CHAR = '\n'; +const std::size_t SIZE_ONE = 1; + + +} + + +} diff --git a/genesis/source/loop_block.cpp b/externals/genesis/source/genesis/source/loop_block.cpp similarity index 96% rename from genesis/source/loop_block.cpp rename to externals/genesis/source/genesis/source/loop_block.cpp index b295dc4..3034aad 100644 --- a/genesis/source/loop_block.cpp +++ b/externals/genesis/source/genesis/source/loop_block.cpp @@ -1,54 +1,54 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "loop_block.hpp" - -#include "recipe_callback.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -loop_block::loop_block( const std::string& _loop_name ) : - recipe_block(), - loop_name_( _loop_name ) -{ - // Nothing to do... -} - - -loop_block::~loop_block() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void loop_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - _recipe_callback.before_loop( loop_name_ ); - - while( _recipe_callback.check_loop_condition( loop_name_ ) ) - { - _recipe_callback.before_loop_iteration( loop_name_ ); - create_children( _recipe_callback, _ostream ); - _recipe_callback.after_loop_iteration( loop_name_ ); - } - _recipe_callback.after_loop( loop_name_ ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "loop_block.hpp" + +#include "recipe_callback.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +loop_block::loop_block( const std::string& _loop_name ) : + recipe_block(), + loop_name_( _loop_name ) +{ + // Nothing to do... +} + + +loop_block::~loop_block() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void loop_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + _recipe_callback.before_loop( loop_name_ ); + + while( _recipe_callback.check_loop_condition( loop_name_ ) ) + { + _recipe_callback.before_loop_iteration( loop_name_ ); + create_children( _recipe_callback, _ostream ); + _recipe_callback.after_loop_iteration( loop_name_ ); + } + _recipe_callback.after_loop( loop_name_ ); +} + + +} + + +} diff --git a/genesis/source/messages.cpp b/externals/genesis/source/genesis/source/messages.cpp similarity index 97% rename from genesis/source/messages.cpp rename to externals/genesis/source/genesis/source/messages.cpp index 1cd39b5..13b911d 100644 --- a/genesis/source/messages.cpp +++ b/externals/genesis/source/genesis/source/messages.cpp @@ -1,27 +1,27 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "messages.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -const std::string ERROR_WRITE_FILE = "File % cannot be opened for writing!"; - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "messages.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +const std::string ERROR_WRITE_FILE = "File % cannot be opened for writing!"; + + +} + + +} diff --git a/genesis/source/recipe.cpp b/externals/genesis/source/genesis/source/recipe.cpp similarity index 96% rename from genesis/source/recipe.cpp rename to externals/genesis/source/genesis/source/recipe.cpp index 1fc543c..1f9ac71 100644 --- a/genesis/source/recipe.cpp +++ b/externals/genesis/source/genesis/source/recipe.cpp @@ -1,61 +1,61 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "recipe.hpp" - -#include "file_writer.hpp" -#include "genesis_exception.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -recipe::recipe( const std::string& _template_name, recipe_callback& _recipe_callback, - const std::string& _templates_path ) : - template_block( _template_name, _templates_path ), - recipe_callback_( _recipe_callback ), - stream_() -{ - // Nothing to do... -} - - -recipe::~recipe() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void recipe::generate() -{ - create_impl( recipe_callback_ ); -} - - -void recipe::write_to_file( const std::string& _file_path ) const -{ - write( _file_path, stream_ ); -} - - -void recipe::create_impl( recipe_callback& _recipe_callback ) -{ - template_block::create( _recipe_callback, stream_ ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "recipe.hpp" + +#include "file_writer.hpp" +#include "genesis_exception.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +recipe::recipe( const std::string& _template_name, recipe_callback& _recipe_callback, + const std::string& _templates_path ) : + template_block( _template_name, _templates_path ), + recipe_callback_( _recipe_callback ), + stream_() +{ + // Nothing to do... +} + + +recipe::~recipe() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void recipe::generate() +{ + create_impl( recipe_callback_ ); +} + + +void recipe::write_to_file( const std::string& _file_path ) const +{ + write( _file_path, stream_ ); +} + + +void recipe::create_impl( recipe_callback& _recipe_callback ) +{ + template_block::create( _recipe_callback, stream_ ); +} + + +} + + +} diff --git a/genesis/source/recipe_block.cpp b/externals/genesis/source/genesis/source/recipe_block.cpp similarity index 96% rename from genesis/source/recipe_block.cpp rename to externals/genesis/source/genesis/source/recipe_block.cpp index 0948130..10260d8 100644 --- a/genesis/source/recipe_block.cpp +++ b/externals/genesis/source/genesis/source/recipe_block.cpp @@ -1,53 +1,53 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "recipe_block.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -recipe_block::recipe_block() : - recipe_step(), - child_recipes_() -{ - // Nothing to do... -} - - -recipe_block::~recipe_block() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void recipe_block::create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - SX_FOR( sxe::SX_UNIQUE_PTR& child, child_recipes_ ) - { - child->create( _recipe_callback, _ostream ); - } -} - - -void recipe_block::add_child( sxe::SX_UNIQUE_PTR _child ) -{ - child_recipes_.push_back( sxe::move( _child ) ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "recipe_block.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +recipe_block::recipe_block() : + recipe_step(), + child_recipes_() +{ + // Nothing to do... +} + + +recipe_block::~recipe_block() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void recipe_block::create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + SX_FOR( sxe::SX_UNIQUE_PTR& child, child_recipes_ ) + { + child->create( _recipe_callback, _ostream ); + } +} + + +void recipe_block::add_child( sxe::SX_UNIQUE_PTR _child ) +{ + child_recipes_.push_back( sxe::move( _child ) ); +} + + +} + + +} diff --git a/genesis/source/switch_block.cpp b/externals/genesis/source/genesis/source/switch_block.cpp similarity index 96% rename from genesis/source/switch_block.cpp rename to externals/genesis/source/genesis/source/switch_block.cpp index af124fe..e287605 100644 --- a/genesis/source/switch_block.cpp +++ b/externals/genesis/source/genesis/source/switch_block.cpp @@ -1,89 +1,89 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "switch_block.hpp" - -#include "recipe_callback.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -switch_block::switch_block( const std::string& _switch_name ) : - recipe_block(), - switch_name_( _switch_name ), - current_case_index_(), - switch_cases_(), - default_() -{ - // Nothing to do... -} - - -switch_block::~switch_block() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void switch_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - current_case_index_ = _recipe_callback.get_switch_case( switch_name_ ); - create_children( _recipe_callback, _ostream ); -} - - -void switch_block::create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - if( current_case_index_ >= 0 ) - { - std::vector< sxe::SX_UNIQUE_PTR >& children_steps = switch_cases_[current_case_index_]; - SX_FOR( sxe::SX_UNIQUE_PTR& child , children_steps ) - { - child->create( _recipe_callback, _ostream ); - } - } - else - { - SX_FOR( sxe::SX_UNIQUE_PTR& child , default_ ) - { - child->create( _recipe_callback, _ostream ); - } - } -} - - -void switch_block::add_child( sxe::SX_UNIQUE_PTR _child ) -{ - if( current_case_index_ >= 0 ) - { - switch_cases_[current_case_index_].push_back( sxe::move( _child ) ); - } - else - { - default_.push_back( sxe::move( _child ) ); - } -} - - -void switch_block::set_case_index( const int _index ) -{ - current_case_index_ = _index; -} - - -} - - +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "switch_block.hpp" + +#include "recipe_callback.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +switch_block::switch_block( const std::string& _switch_name ) : + recipe_block(), + switch_name_( _switch_name ), + current_case_index_(), + switch_cases_(), + default_() +{ + // Nothing to do... +} + + +switch_block::~switch_block() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void switch_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + current_case_index_ = _recipe_callback.get_switch_case( switch_name_ ); + create_children( _recipe_callback, _ostream ); +} + + +void switch_block::create_children( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + if( current_case_index_ >= 0 ) + { + std::vector< sxe::SX_UNIQUE_PTR >& children_steps = switch_cases_[current_case_index_]; + SX_FOR( sxe::SX_UNIQUE_PTR& child , children_steps ) + { + child->create( _recipe_callback, _ostream ); + } + } + else + { + SX_FOR( sxe::SX_UNIQUE_PTR& child , default_ ) + { + child->create( _recipe_callback, _ostream ); + } + } +} + + +void switch_block::add_child( sxe::SX_UNIQUE_PTR _child ) +{ + if( current_case_index_ >= 0 ) + { + switch_cases_[current_case_index_].push_back( sxe::move( _child ) ); + } + else + { + default_.push_back( sxe::move( _child ) ); + } +} + + +void switch_block::set_case_index( const int _index ) +{ + current_case_index_ = _index; +} + + +} + + } \ No newline at end of file diff --git a/genesis/source/template_block.cpp b/externals/genesis/source/genesis/source/template_block.cpp similarity index 96% rename from genesis/source/template_block.cpp rename to externals/genesis/source/genesis/source/template_block.cpp index 16a5faa..b784e94 100644 --- a/genesis/source/template_block.cpp +++ b/externals/genesis/source/genesis/source/template_block.cpp @@ -1,516 +1,516 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "template_block.hpp" - -#include -#include -#include - -#include "essentials/base.hpp" -#include "essentials/conversion.hpp" - -#include "genesis_exception.hpp" -#include "file_reader.hpp" -#include "text_step.hpp" -#include "variable_step.hpp" -#include "loop_block.hpp" -#include "switch_block.hpp" -#include "condition_block.hpp" -#include "grammar.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -template_block::template_block( const std::string& _template_name, const std::string& _template_path ) : - recipe_block(), - opened_recipes_(), - keywords_(), - template_to_parse_( read_template_file( _template_name, _template_path ) ), - template_path_( _template_path ), - template_file_( _template_name ) -{ - // Nothing to do... -} - - -template_block::~template_block() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void template_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - parse( template_to_parse_ ); - final_check(); - create_children( _recipe_callback, _ostream ); -} - - -void template_block::parse( std::string& _file_buffer ) -{ - while( !_file_buffer.empty() ) - { - get_text( _file_buffer ); - if( !_file_buffer.empty() ) - { - const std::string command = get_keyword( _file_buffer ); - if( command == VARIABLE_COMMAND ) - { - get_variable( _file_buffer ); - } - else if( command == TEMPLATE_COMMAND ) - { - get_template( _file_buffer ); - } - else if( command == LOOP_START_COMMAND ) - { - get_loop( _file_buffer ); - } - else if( command == IF_START_COMMAND ) - { - get_if( _file_buffer ); - } - else if( command == SWITCH_START_COMMAND ) - { - get_switch( _file_buffer ); - } - else if( command == SWITCH_CASE_START_COMMAND ) - { - get_switch_case( _file_buffer ); - } - else if( command == SWITCH_DEFAULT_START_COMMAND ) - { - get_switch_default( _file_buffer ); - } - else if( command == LOOP_END_COMMAND ) - { - close_loop( _file_buffer ); - } - else if( command == IF_END_COMMAND ) - { - close_condition( _file_buffer ); - } - else if( command == SWITCH_END_COMMAND ) - { - close_switch( _file_buffer ); - } - else if( command == SWITCH_CASE_END_COMMAND ) - { - close_switch_case( _file_buffer ); - } - else if( command == SWITCH_DEFAULT_END_COMMAND ) - { - close_switch_default( _file_buffer ); - } - else - { - throw sx::genesis::genesis_exception( "Unknown command! Check template file '%'!", template_file_ ); - } - } - } -} - - -void template_block::get_text( std::string &_file_buffer ) -{ - std::stringstream buffer; - bool more_text = true; - while( more_text ) - { - const std::size_t position = _file_buffer.find( DELIMITER_CHAR ); - if( position != std::string::npos ) - { - buffer << _file_buffer.substr( 0, position ); - _file_buffer.erase( 0, position ); - const bool is_delimiter_char = _file_buffer[0] == DELIMITER_CHAR; - SX_ASSERT( is_delimiter_char, "First char in the buffer is not the delimiter char!" ); - SX_UNUSED_VARIABLE( is_delimiter_char ); - if( _file_buffer.length() > 2 ) - { - if( _file_buffer[1] == DELIMITER_CHAR ) - { - buffer << DELIMITER_CHAR; - _file_buffer.erase( 0, 2 ); - } - else if( _file_buffer[1] == LINE_BREAK_CHAR ) - { - buffer << '\n'; - _file_buffer.erase( 0, 2 ); - } - else - { - more_text = false; - - const std::string text = buffer.str(); - buffer.str( std::string() ); - add_child_to_recipe( SX_MAKE_UNIQUE( text ) ); - } - } - else - { - throw sx::genesis::genesis_exception( "File '%' ends with a delimiter char!", template_file_ ); - } - } - else - { - more_text = false; - sxe::SX_UNIQUE_PTR new_text_step = SX_MAKE_UNIQUE( buffer.str() + _file_buffer ); - buffer.str( std::string() ); - if( is_any_recipe_open() ) - { - throw sx::genesis::genesis_exception( "A condition/loop not closed in file '%'!", template_file_ ); - } - else - { - add_child( sxe::move( new_text_step ) ); - _file_buffer.clear(); - } - } - } -} - - -std::string template_block::get_keyword( std::string& _file_buffer ) -{ - std::size_t position; - if( keywords_.empty() ) - { - position = _file_buffer.find( OPEN_PARENTHESIS_CHAR ); - } - else - { - if( _file_buffer.substr( 0, get_last_to_be_closed().length() ) == get_last_to_be_closed() ) - { - position = get_last_to_be_closed().length(); - } - else - { - position = _file_buffer.find( OPEN_PARENTHESIS_CHAR ); - } - } - - std::string keyword = ""; - if( position != std::string::npos ) - { - keyword = _file_buffer.substr( 0, position ); - } - else - { - throw sx::genesis::genesis_exception( "No command found!" ); - } - return ( keyword ); -} - - -void template_block::get_variable( std::string &_file_buffer ) -{ - _file_buffer.erase( 0, VARIABLE_COMMAND.length() + SIZE_ONE ); - const std::vector parameters = get_parameters( _file_buffer ); - if( parameters.size() != 1 ) - { - throw sx::genesis::genesis_exception( "Variable command does not have exactly 1 parameter in file '%'!", template_file_ ); - } - else - { - add_child_to_recipe( SX_MAKE_UNIQUE( parameters[0] ) ); - } -} - - -void template_block::get_loop( std::string &_file_buffer ) -{ - _file_buffer.erase( 0, LOOP_START_COMMAND.length() + SIZE_ONE ); - const std::vector parameters = get_parameters( _file_buffer ); - if( parameters.size() != 1 ) - { - throw sx::genesis::genesis_exception( "Loop command does not have exactly 1 parameter in file '%'!", template_file_ ); - } - else - { - sxe::SX_UNIQUE_PTR new_loop_block = SX_MAKE_UNIQUE( parameters[0] ); - loop_block* new_loop_block_ptr = new_loop_block.get(); - add_child_to_recipe( sxe::move( new_loop_block ) ); - opened_recipes_.push( new_loop_block_ptr ); - keywords_.push_back( LOOP_END_COMMAND ); - } -} - - -void template_block::get_if( std::string &_file_buffer ) -{ - keywords_.push_back( IF_END_COMMAND ); - _file_buffer.erase( 0, IF_START_COMMAND.length() + SIZE_ONE ); - const std::vector parameters = get_parameters( _file_buffer ); - if( parameters.size() != 1 && parameters.size() != 2 ) - { - throw sx::genesis::genesis_exception( "No sufficient parameters provided for 'if' command in file '%'!", template_file_ ); - } - else - { - sxe::SX_UNIQUE_PTR new_condition_block; - if( parameters.size() > 1 ) - { - new_condition_block = - SX_MAKE_UNIQUE( parameters[0], get_condition_modifier_from_string( parameters[1] ) ); - } - else - { - new_condition_block = - SX_MAKE_UNIQUE( parameters[0], condition_modifier::NONE ); - } - condition_block* new_condition_block_ptr = new_condition_block.get(); - add_child_to_recipe( sxe::move( new_condition_block ) ); - opened_recipes_.push( new_condition_block_ptr ); - } -} - - -void template_block::get_switch( std::string& _file_buffer ) -{ - _file_buffer.erase( 0, SWITCH_START_COMMAND.length() + SIZE_ONE ); - const std::vector parameters = get_parameters( _file_buffer ); - if( parameters.size() != 1 ) - { - throw sx::genesis::genesis_exception( "Switch command has not exactly 1 parameter in file '%'!", template_file_ ); - } - else - { - sxe::SX_UNIQUE_PTR new_switch_block = SX_MAKE_UNIQUE( parameters[0] ); - switch_block* new_switch_block_ptr = new_switch_block.get(); - add_child_to_recipe( sxe::move( new_switch_block ) ); - opened_recipes_.push( new_switch_block_ptr ); - keywords_.push_back( SWITCH_END_COMMAND ); - } -} - - -void template_block::get_switch_case( std::string& _file_buffer ) -{ - _file_buffer.erase( 0, SWITCH_CASE_START_COMMAND.length() + SIZE_ONE ); - const std::vector parameters = get_parameters( _file_buffer ); - if( parameters.size() != 1 ) - { - throw sx::genesis::genesis_exception( "Switch case command has not exactly 1 parameter in file '%'!", template_file_ ); - } - else - { - if( opened_recipes_.empty() ) - { - throw sx::genesis::genesis_exception( "There is no switch for the switch case in '%'!", template_file_ ); - } - else - { - switch_block* switch_ = dynamic_cast< switch_block* >( opened_recipes_.top() ); - if( switch_ ) - { - int index = 0; - sxe::string_to_int( parameters[0].c_str(), index ); - switch_->set_case_index( index ); - keywords_.push_back( SWITCH_CASE_END_COMMAND ); - } - else - { - throw sx::genesis::genesis_exception( "There is no switch for the switch case in '%'!", template_file_ ); - } - } - } -} - - -void template_block::get_switch_default( std::string& _file_buffer ) -{ - _file_buffer.erase( 0, SWITCH_DEFAULT_START_COMMAND.length() + SIZE_ONE ); - const std::vector parameters = get_parameters( _file_buffer ); - if( !parameters.empty()) - { - throw sx::genesis::genesis_exception( "Switch default command must have no parameters in file '%'!", template_file_ ); - } - else - { - if( opened_recipes_.empty() ) - { - throw sx::genesis::genesis_exception( "There is no switch for the default case in '%'!", template_file_ ); - } - else - { - switch_block* switch_ = dynamic_cast< switch_block* >( opened_recipes_.top() ); - if( switch_ ) - { - switch_->set_case_index( SWITCH_DEFAULT_INDEX_VALUE ); - keywords_.push_back( SWITCH_DEFAULT_END_COMMAND ); - } - else - { - throw sx::genesis::genesis_exception( "There is no switch for the switch default in '%'!", template_file_ ); - } - } - } -} - - -void template_block::get_template( std::string &_file_buffer ) -{ - _file_buffer.erase( 0, TEMPLATE_COMMAND.length() + SIZE_ONE ); - const std::vector parameters = get_parameters( _file_buffer ); - if( parameters.empty() ) - { - throw sx::genesis::genesis_exception( "No sufficient parameters provided for 'template' command in file '%'!", template_file_ ); - } - else - { - add_child_to_recipe( SX_MAKE_UNIQUE( parameters[0], template_path_ ) ); - } -} - - -const std::string template_block::get_last_to_be_closed() const -{ - const std::string last_element = keywords_.back(); - return( last_element ); -} - - -std::string template_block::read_template_file( const std::string& _template_name, const std::string& _templates_path ) -{ - std::string template_file_as_string; - read( _templates_path + "/" + _template_name, template_file_as_string ); - if( template_file_as_string.empty() ) - { - std::cout << "Template file '" << _template_name << "' is empty!" << std::endl; - } - return( template_file_as_string ); -} - - -void template_block::check_new_line_after_end_command( std::string &_file_buffer ) -{ - if( _file_buffer.length() > 2 ) - { - if( _file_buffer[0] == NEW_LINE_CHAR ) - { - _file_buffer.erase( 0, 1 ); - } - } -} - - -void template_block::close_loop( std::string& _file_buffer ) -{ - const std::size_t position = _file_buffer.find( LOOP_END_COMMAND ); - _file_buffer.erase( 0, position + LOOP_END_COMMAND.length() ); - check_new_line_after_end_command( _file_buffer ); - keywords_.pop_back(); - opened_recipes_.pop(); -} - - -void template_block::close_condition( std::string& _file_buffer ) -{ - const std::size_t position = _file_buffer.find( IF_END_COMMAND ); - _file_buffer.erase( 0, position + IF_END_COMMAND.length() ); - check_new_line_after_end_command( _file_buffer ); - keywords_.pop_back(); - opened_recipes_.pop(); -} - - -void template_block::close_switch( std::string& _file_buffer ) -{ - const std::size_t position = _file_buffer.find( SWITCH_END_COMMAND ); - _file_buffer.erase( 0, position + SWITCH_END_COMMAND.length() ); - check_new_line_after_end_command( _file_buffer ); - keywords_.pop_back(); - opened_recipes_.pop(); -} - - -void template_block::close_switch_case( std::string& _file_buffer ) -{ - const std::size_t position = _file_buffer.find( SWITCH_CASE_END_COMMAND ); - _file_buffer.erase( 0, position + SWITCH_CASE_END_COMMAND.length() ); - check_new_line_after_end_command( _file_buffer ); - keywords_.pop_back(); -} - - -void template_block::close_switch_default( std::string& _file_buffer ) -{ - const std::size_t position = _file_buffer.find( SWITCH_DEFAULT_END_COMMAND ); - _file_buffer.erase( 0, position + SWITCH_DEFAULT_END_COMMAND.length() ); - check_new_line_after_end_command( _file_buffer ); - keywords_.pop_back(); -} - - -bool template_block::is_any_recipe_open() const -{ - return( !opened_recipes_.empty() ); -} - - -std::vector template_block::get_parameters( std::string& _file_buffer ) const -{ - std::vector parameters; - std::size_t stop_position = _file_buffer.find( CLOSE_PARENTHESIS_CHAR ); - std::string string_parameters = _file_buffer.substr( 0, stop_position ); - _file_buffer.erase( 0, stop_position + SIZE_ONE ); - - string_parameters.erase( std::remove_if( string_parameters.begin(), string_parameters.end(), ::isspace ), string_parameters.end() ); - - std::string step; - std::istringstream stream( string_parameters ); - while( getline( stream, step, ',' ) ) - { - parameters.push_back( step ); - } - - return( parameters ); -} - - -void template_block::final_check() const -{ - SX_ASSERT( template_to_parse_.empty(), "The file buffer was not completely parsed!" ); - - if( !keywords_.empty() ) - { - std::string command = keywords_.back(); - if( command == LOOP_END_COMMAND ) - { - command = LOOP_START_COMMAND; - } - else if( command == IF_END_COMMAND ) - { - command = IF_START_COMMAND; - } - else - { - sx::genesis::genesis_exception( "Unknown command end: '%'!", command ); - } - - sx::genesis::genesis_exception( "Command '%' does not have a close command in file '%'!", template_file_ ); - } - - if( !opened_recipes_.empty() ) - { - sx::genesis::genesis_exception( "Internal error! Not all recipes were processed at the end of generation." ); - } -} - -} - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "template_block.hpp" + +#include +#include +#include + +#include "essentials/base.hpp" +#include "essentials/conversion.hpp" + +#include "genesis_exception.hpp" +#include "file_reader.hpp" +#include "text_step.hpp" +#include "variable_step.hpp" +#include "loop_block.hpp" +#include "switch_block.hpp" +#include "condition_block.hpp" +#include "grammar.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +template_block::template_block( const std::string& _template_name, const std::string& _template_path ) : + recipe_block(), + opened_recipes_(), + keywords_(), + template_to_parse_( read_template_file( _template_name, _template_path ) ), + template_path_( _template_path ), + template_file_( _template_name ) +{ + // Nothing to do... +} + + +template_block::~template_block() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void template_block::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + parse( template_to_parse_ ); + final_check(); + create_children( _recipe_callback, _ostream ); +} + + +void template_block::parse( std::string& _file_buffer ) +{ + while( !_file_buffer.empty() ) + { + get_text( _file_buffer ); + if( !_file_buffer.empty() ) + { + const std::string command = get_keyword( _file_buffer ); + if( command == VARIABLE_COMMAND ) + { + get_variable( _file_buffer ); + } + else if( command == TEMPLATE_COMMAND ) + { + get_template( _file_buffer ); + } + else if( command == LOOP_START_COMMAND ) + { + get_loop( _file_buffer ); + } + else if( command == IF_START_COMMAND ) + { + get_if( _file_buffer ); + } + else if( command == SWITCH_START_COMMAND ) + { + get_switch( _file_buffer ); + } + else if( command == SWITCH_CASE_START_COMMAND ) + { + get_switch_case( _file_buffer ); + } + else if( command == SWITCH_DEFAULT_START_COMMAND ) + { + get_switch_default( _file_buffer ); + } + else if( command == LOOP_END_COMMAND ) + { + close_loop( _file_buffer ); + } + else if( command == IF_END_COMMAND ) + { + close_condition( _file_buffer ); + } + else if( command == SWITCH_END_COMMAND ) + { + close_switch( _file_buffer ); + } + else if( command == SWITCH_CASE_END_COMMAND ) + { + close_switch_case( _file_buffer ); + } + else if( command == SWITCH_DEFAULT_END_COMMAND ) + { + close_switch_default( _file_buffer ); + } + else + { + throw sx::genesis::genesis_exception( "Unknown command! Check template file '%'!", template_file_ ); + } + } + } +} + + +void template_block::get_text( std::string &_file_buffer ) +{ + std::stringstream buffer; + bool more_text = true; + while( more_text ) + { + const std::size_t position = _file_buffer.find( DELIMITER_CHAR ); + if( position != std::string::npos ) + { + buffer << _file_buffer.substr( 0, position ); + _file_buffer.erase( 0, position ); + const bool is_delimiter_char = _file_buffer[0] == DELIMITER_CHAR; + SX_ASSERT( is_delimiter_char, "First char in the buffer is not the delimiter char!" ); + SX_UNUSED_VARIABLE( is_delimiter_char ); + if( _file_buffer.length() > 2 ) + { + if( _file_buffer[1] == DELIMITER_CHAR ) + { + buffer << DELIMITER_CHAR; + _file_buffer.erase( 0, 2 ); + } + else if( _file_buffer[1] == LINE_BREAK_CHAR ) + { + buffer << '\n'; + _file_buffer.erase( 0, 2 ); + } + else + { + more_text = false; + + const std::string text = buffer.str(); + buffer.str( std::string() ); + add_child_to_recipe( SX_MAKE_UNIQUE( text ) ); + } + } + else + { + throw sx::genesis::genesis_exception( "File '%' ends with a delimiter char!", template_file_ ); + } + } + else + { + more_text = false; + sxe::SX_UNIQUE_PTR new_text_step = SX_MAKE_UNIQUE( buffer.str() + _file_buffer ); + buffer.str( std::string() ); + if( is_any_recipe_open() ) + { + throw sx::genesis::genesis_exception( "A condition/loop not closed in file '%'!", template_file_ ); + } + else + { + add_child( sxe::move( new_text_step ) ); + _file_buffer.clear(); + } + } + } +} + + +std::string template_block::get_keyword( std::string& _file_buffer ) +{ + std::size_t position; + if( keywords_.empty() ) + { + position = _file_buffer.find( OPEN_PARENTHESIS_CHAR ); + } + else + { + if( _file_buffer.substr( 0, get_last_to_be_closed().length() ) == get_last_to_be_closed() ) + { + position = get_last_to_be_closed().length(); + } + else + { + position = _file_buffer.find( OPEN_PARENTHESIS_CHAR ); + } + } + + std::string keyword = ""; + if( position != std::string::npos ) + { + keyword = _file_buffer.substr( 0, position ); + } + else + { + throw sx::genesis::genesis_exception( "No command found!" ); + } + return ( keyword ); +} + + +void template_block::get_variable( std::string &_file_buffer ) +{ + _file_buffer.erase( 0, VARIABLE_COMMAND.length() + SIZE_ONE ); + const std::vector parameters = get_parameters( _file_buffer ); + if( parameters.size() != 1 ) + { + throw sx::genesis::genesis_exception( "Variable command does not have exactly 1 parameter in file '%'!", template_file_ ); + } + else + { + add_child_to_recipe( SX_MAKE_UNIQUE( parameters[0] ) ); + } +} + + +void template_block::get_loop( std::string &_file_buffer ) +{ + _file_buffer.erase( 0, LOOP_START_COMMAND.length() + SIZE_ONE ); + const std::vector parameters = get_parameters( _file_buffer ); + if( parameters.size() != 1 ) + { + throw sx::genesis::genesis_exception( "Loop command does not have exactly 1 parameter in file '%'!", template_file_ ); + } + else + { + sxe::SX_UNIQUE_PTR new_loop_block = SX_MAKE_UNIQUE( parameters[0] ); + loop_block* new_loop_block_ptr = new_loop_block.get(); + add_child_to_recipe( sxe::move( new_loop_block ) ); + opened_recipes_.push( new_loop_block_ptr ); + keywords_.push_back( LOOP_END_COMMAND ); + } +} + + +void template_block::get_if( std::string &_file_buffer ) +{ + keywords_.push_back( IF_END_COMMAND ); + _file_buffer.erase( 0, IF_START_COMMAND.length() + SIZE_ONE ); + const std::vector parameters = get_parameters( _file_buffer ); + if( parameters.size() != 1 && parameters.size() != 2 ) + { + throw sx::genesis::genesis_exception( "No sufficient parameters provided for 'if' command in file '%'!", template_file_ ); + } + else + { + sxe::SX_UNIQUE_PTR new_condition_block; + if( parameters.size() > 1 ) + { + new_condition_block = + SX_MAKE_UNIQUE( parameters[0], get_condition_modifier_from_string( parameters[1] ) ); + } + else + { + new_condition_block = + SX_MAKE_UNIQUE( parameters[0], condition_modifier::NONE ); + } + condition_block* new_condition_block_ptr = new_condition_block.get(); + add_child_to_recipe( sxe::move( new_condition_block ) ); + opened_recipes_.push( new_condition_block_ptr ); + } +} + + +void template_block::get_switch( std::string& _file_buffer ) +{ + _file_buffer.erase( 0, SWITCH_START_COMMAND.length() + SIZE_ONE ); + const std::vector parameters = get_parameters( _file_buffer ); + if( parameters.size() != 1 ) + { + throw sx::genesis::genesis_exception( "Switch command has not exactly 1 parameter in file '%'!", template_file_ ); + } + else + { + sxe::SX_UNIQUE_PTR new_switch_block = SX_MAKE_UNIQUE( parameters[0] ); + switch_block* new_switch_block_ptr = new_switch_block.get(); + add_child_to_recipe( sxe::move( new_switch_block ) ); + opened_recipes_.push( new_switch_block_ptr ); + keywords_.push_back( SWITCH_END_COMMAND ); + } +} + + +void template_block::get_switch_case( std::string& _file_buffer ) +{ + _file_buffer.erase( 0, SWITCH_CASE_START_COMMAND.length() + SIZE_ONE ); + const std::vector parameters = get_parameters( _file_buffer ); + if( parameters.size() != 1 ) + { + throw sx::genesis::genesis_exception( "Switch case command has not exactly 1 parameter in file '%'!", template_file_ ); + } + else + { + if( opened_recipes_.empty() ) + { + throw sx::genesis::genesis_exception( "There is no switch for the switch case in '%'!", template_file_ ); + } + else + { + switch_block* switch_ = dynamic_cast< switch_block* >( opened_recipes_.top() ); + if( switch_ ) + { + int index = 0; + sxe::string_to_int( parameters[0].c_str(), index ); + switch_->set_case_index( index ); + keywords_.push_back( SWITCH_CASE_END_COMMAND ); + } + else + { + throw sx::genesis::genesis_exception( "There is no switch for the switch case in '%'!", template_file_ ); + } + } + } +} + + +void template_block::get_switch_default( std::string& _file_buffer ) +{ + _file_buffer.erase( 0, SWITCH_DEFAULT_START_COMMAND.length() + SIZE_ONE ); + const std::vector parameters = get_parameters( _file_buffer ); + if( !parameters.empty()) + { + throw sx::genesis::genesis_exception( "Switch default command must have no parameters in file '%'!", template_file_ ); + } + else + { + if( opened_recipes_.empty() ) + { + throw sx::genesis::genesis_exception( "There is no switch for the default case in '%'!", template_file_ ); + } + else + { + switch_block* switch_ = dynamic_cast< switch_block* >( opened_recipes_.top() ); + if( switch_ ) + { + switch_->set_case_index( SWITCH_DEFAULT_INDEX_VALUE ); + keywords_.push_back( SWITCH_DEFAULT_END_COMMAND ); + } + else + { + throw sx::genesis::genesis_exception( "There is no switch for the switch default in '%'!", template_file_ ); + } + } + } +} + + +void template_block::get_template( std::string &_file_buffer ) +{ + _file_buffer.erase( 0, TEMPLATE_COMMAND.length() + SIZE_ONE ); + const std::vector parameters = get_parameters( _file_buffer ); + if( parameters.empty() ) + { + throw sx::genesis::genesis_exception( "No sufficient parameters provided for 'template' command in file '%'!", template_file_ ); + } + else + { + add_child_to_recipe( SX_MAKE_UNIQUE( parameters[0], template_path_ ) ); + } +} + + +const std::string template_block::get_last_to_be_closed() const +{ + const std::string last_element = keywords_.back(); + return( last_element ); +} + + +std::string template_block::read_template_file( const std::string& _template_name, const std::string& _templates_path ) +{ + std::string template_file_as_string; + read( _templates_path + "/" + _template_name, template_file_as_string ); + if( template_file_as_string.empty() ) + { + std::cout << "Template file '" << _template_name << "' is empty!" << std::endl; + } + return( template_file_as_string ); +} + + +void template_block::check_new_line_after_end_command( std::string &_file_buffer ) +{ + if( _file_buffer.length() > 2 ) + { + if( _file_buffer[0] == NEW_LINE_CHAR ) + { + _file_buffer.erase( 0, 1 ); + } + } +} + + +void template_block::close_loop( std::string& _file_buffer ) +{ + const std::size_t position = _file_buffer.find( LOOP_END_COMMAND ); + _file_buffer.erase( 0, position + LOOP_END_COMMAND.length() ); + check_new_line_after_end_command( _file_buffer ); + keywords_.pop_back(); + opened_recipes_.pop(); +} + + +void template_block::close_condition( std::string& _file_buffer ) +{ + const std::size_t position = _file_buffer.find( IF_END_COMMAND ); + _file_buffer.erase( 0, position + IF_END_COMMAND.length() ); + check_new_line_after_end_command( _file_buffer ); + keywords_.pop_back(); + opened_recipes_.pop(); +} + + +void template_block::close_switch( std::string& _file_buffer ) +{ + const std::size_t position = _file_buffer.find( SWITCH_END_COMMAND ); + _file_buffer.erase( 0, position + SWITCH_END_COMMAND.length() ); + check_new_line_after_end_command( _file_buffer ); + keywords_.pop_back(); + opened_recipes_.pop(); +} + + +void template_block::close_switch_case( std::string& _file_buffer ) +{ + const std::size_t position = _file_buffer.find( SWITCH_CASE_END_COMMAND ); + _file_buffer.erase( 0, position + SWITCH_CASE_END_COMMAND.length() ); + check_new_line_after_end_command( _file_buffer ); + keywords_.pop_back(); +} + + +void template_block::close_switch_default( std::string& _file_buffer ) +{ + const std::size_t position = _file_buffer.find( SWITCH_DEFAULT_END_COMMAND ); + _file_buffer.erase( 0, position + SWITCH_DEFAULT_END_COMMAND.length() ); + check_new_line_after_end_command( _file_buffer ); + keywords_.pop_back(); +} + + +bool template_block::is_any_recipe_open() const +{ + return( !opened_recipes_.empty() ); +} + + +std::vector template_block::get_parameters( std::string& _file_buffer ) const +{ + std::vector parameters; + std::size_t stop_position = _file_buffer.find( CLOSE_PARENTHESIS_CHAR ); + std::string string_parameters = _file_buffer.substr( 0, stop_position ); + _file_buffer.erase( 0, stop_position + SIZE_ONE ); + + string_parameters.erase( std::remove_if( string_parameters.begin(), string_parameters.end(), ::isspace ), string_parameters.end() ); + + std::string step; + std::istringstream stream( string_parameters ); + while( getline( stream, step, ',' ) ) + { + parameters.push_back( step ); + } + + return( parameters ); +} + + +void template_block::final_check() const +{ + SX_ASSERT( template_to_parse_.empty(), "The file buffer was not completely parsed!" ); + + if( !keywords_.empty() ) + { + std::string command = keywords_.back(); + if( command == LOOP_END_COMMAND ) + { + command = LOOP_START_COMMAND; + } + else if( command == IF_END_COMMAND ) + { + command = IF_START_COMMAND; + } + else + { + sx::genesis::genesis_exception( "Unknown command end: '%'!", command ); + } + + sx::genesis::genesis_exception( "Command '%' does not have a close command in file '%'!", template_file_ ); + } + + if( !opened_recipes_.empty() ) + { + sx::genesis::genesis_exception( "Internal error! Not all recipes were processed at the end of generation." ); + } +} + +} + +} diff --git a/genesis/source/text_step.cpp b/externals/genesis/source/genesis/source/text_step.cpp similarity index 95% rename from genesis/source/text_step.cpp rename to externals/genesis/source/genesis/source/text_step.cpp index f010ef7..433aea4 100644 --- a/genesis/source/text_step.cpp +++ b/externals/genesis/source/genesis/source/text_step.cpp @@ -1,49 +1,49 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "text_step.hpp" - -#include "essentials/base.hpp" - -#include "recipe_callback.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -text_step::text_step( const std::string& _text ) : - recipe_step(), - text_( _text ) -{ - // Nothing to do... -} - - -text_step::~text_step() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void text_step::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - SX_UNUSED_PARAMETER( _recipe_callback ); - _ostream << text_; -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "text_step.hpp" + +#include "essentials/base.hpp" + +#include "recipe_callback.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +text_step::text_step( const std::string& _text ) : + recipe_step(), + text_( _text ) +{ + // Nothing to do... +} + + +text_step::~text_step() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void text_step::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + SX_UNUSED_PARAMETER( _recipe_callback ); + _ostream << text_; +} + + +} + + +} diff --git a/genesis/source/variable_step.cpp b/externals/genesis/source/genesis/source/variable_step.cpp similarity index 96% rename from genesis/source/variable_step.cpp rename to externals/genesis/source/genesis/source/variable_step.cpp index 43acfce..23d75ff 100644 --- a/genesis/source/variable_step.cpp +++ b/externals/genesis/source/genesis/source/variable_step.cpp @@ -1,46 +1,46 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include "variable_step.hpp" - -#include "recipe_callback.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -variable_step::variable_step( const std::string& _variable_name ) : - recipe_step(), - variable_name_( _variable_name ) -{ - // Nothing to do... -} - - -variable_step::~variable_step() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void variable_step::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) -{ - _ostream << _recipe_callback.get_variable_content( variable_name_ ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "variable_step.hpp" + +#include "recipe_callback.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +variable_step::variable_step( const std::string& _variable_name ) : + recipe_step(), + variable_name_( _variable_name ) +{ + // Nothing to do... +} + + +variable_step::~variable_step() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void variable_step::create( recipe_callback& _recipe_callback, std::stringstream& _ostream ) +{ + _ostream << _recipe_callback.get_variable_content( variable_name_ ); +} + + +} + + +} diff --git a/genesis/source/version.cpp b/externals/genesis/source/genesis/source/version.cpp similarity index 92% rename from genesis/source/version.cpp rename to externals/genesis/source/genesis/source/version.cpp index 74d4df0..10b1c00 100644 --- a/genesis/source/version.cpp +++ b/externals/genesis/source/genesis/source/version.cpp @@ -1,81 +1,81 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex genesis library (http://genesis.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://genesis.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#include - -#include "essentials/sxprintf.hpp" - -#include "version.hpp" -#include "build_number.hpp" - - -namespace sx -{ - - -namespace genesis -{ - - -namespace version -{ - - -namespace -{ - - -const sxe::uint16_t VERSION_MAJOR( 0 ); -const sxe::uint16_t VERSION_MINOR( 3 ); -const sxe::uint16_t VERSION_PATCH( 1 ); - - -} - - -// cppcheck-suppress unusedFunction -void log_version() -{ - std::cout << sxe::sxprintf( "genesis library version %.%.%.%.", get_major_version(), - get_minor_version(), get_patch_version(), get_build_number() ) << std::endl; -} - - -sxe::uint16_t get_major_version() -{ - return( VERSION_MAJOR ); -} - - -sxe::uint16_t get_minor_version() -{ - return( VERSION_MINOR ); -} - - -sxe::uint16_t get_patch_version() -{ - return( VERSION_PATCH ); -} - - -sxe::uint16_t get_build_number() -{ - return( BUILD_NUMBER ); -} - - -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex genesis library (http://genesis.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://genesis.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include + +#include "essentials/sxprintf.hpp" + +#include "version.hpp" +#include "build_number.hpp" + + +namespace sx +{ + + +namespace genesis +{ + + +namespace version +{ + + +namespace +{ + + +const sxe::uint16_t VERSION_MAJOR( 0 ); +const sxe::uint16_t VERSION_MINOR( 3 ); +const sxe::uint16_t VERSION_PATCH( 2 ); + + +} + + +// cppcheck-suppress unusedFunction +void log_version() +{ + std::cout << sxe::sxprintf( "genesis library version %.%.%.%.", get_major_version(), + get_minor_version(), get_patch_version(), get_build_number() ) << std::endl; +} + + +sxe::uint16_t get_major_version() +{ + return( VERSION_MAJOR ); +} + + +sxe::uint16_t get_minor_version() +{ + return( VERSION_MINOR ); +} + + +sxe::uint16_t get_patch_version() +{ + return( VERSION_PATCH ); +} + + +sxe::uint16_t get_build_number() +{ + return( BUILD_NUMBER ); +} + + +} + + +} + + +} diff --git a/externals/hermes/CMakeLists.txt b/externals/hermes/CMakeLists.txt new file mode 100644 index 0000000..2c7e9ef --- /dev/null +++ b/externals/hermes/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8) + +project(hermes) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +add_subdirectory(source) \ No newline at end of file diff --git a/externals/hermes/source/CMakeHelpers/addBoost.cmake b/externals/hermes/source/CMakeHelpers/addBoost.cmake new file mode 100644 index 0000000..d833dc1 --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/addBoost.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(Y_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${Y_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${Y_BOOST_LIB_INCLUDE}) + set(SX_BOOST_LIB_PATH ${Y_BOOST_LIB_PATH}) + set(SX_BOOST_LIB_INCLUDE ${Y_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("Y_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") +elseif(SX_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${SX_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${SX_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("SX_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + +else() + message("SX_BOOST_LIB_INCLUDE is not set by user. Searching for boost libraries.") + set(Boost_USE_MULTITHREADED ON) + find_package(Boost COMPONENTS date_time filesystem system program_options chrono thread random unit_test_framework) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + message("Boost found.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + else() + message(STATUS "Boost libraries not found!") + endif() +endif() diff --git a/externals/hermes/source/CMakeHelpers/addSeadexOptions.cmake b/externals/hermes/source/CMakeHelpers/addSeadexOptions.cmake new file mode 100644 index 0000000..48bd9c6 --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/addSeadexOptions.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +# Seadex preprocessor definitions + + +option("SX_NO_LOGGING" "Use when you want to use no logging at all (no logging code is created).") +if( "${SX_NO_LOGGING}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_LOGGING\"") + message(STATUS "No logging used.") +else() + message(STATUS "Logger is used.") +endif() + + +option("SX_NO_STD_MAKE_UNIQUE" "When the standard make_unique is not available (e.g. no C++14 support), you have to define this preprocessor definition. A yasmine drop-in replacement template will be used instead then.") +if( "${SX_NO_STD_MAKE_UNIQUE}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_STD_MAKE_UNIQUE\"") + message(STATUS "SX_NO_STD_MAKE_UNIQUE is defined.") +endif() + + +option("SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG" "Sets to use a workaround for bug in GCC with expansion of template parameter pack that appears in a lambda-expression (bug reported for GCC 4.8.4)") +if( "${SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG}" ) + set(extra_flags "${extra_flags} -D \"SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG\"") + message(STATUS "SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG is defined.") +endif() \ No newline at end of file diff --git a/externals/hermes/source/CMakeHelpers/addSpecificFlags.cmake b/externals/hermes/source/CMakeHelpers/addSpecificFlags.cmake new file mode 100644 index 0000000..b568fbb --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/addSpecificFlags.cmake @@ -0,0 +1,112 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +add_compiler_flag("-Wall") + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +#gcc/clang compiler flags + if(NOT "SX_PEDANTIC" STREQUAL "OFF") + add_compiler_flag("-pedantic") + endif() + + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + add_compiler_flag("-g") + endif() + + if("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++03") + add_compiler_flag("-D \"SX_CPP03_BOOST\"") + add_compiler_flag("-D \"SX_NO_VARIADIC_MACRO\"") + elseif("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++14") + else() + add_compiler_flag("-std=c++11") + add_compiler_flag("-D \"SX_NO_STD_MAKE_UNIQUE\"") + endif() + +# platform + if( "${CMAKE_CXX_FLAGS}" STREQUAL "-m64" ) + add_compiler_flag("-m64") + message(STATUS "setting platform x64") + elseif("${CMAKE_CXX_FLAGS}" STREQUAL "-m32") + add_compiler_flag("-m32") + message(STATUS "setting platform x86") + endif() +endif() + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # Checks buffer security. + set(extra_flags "${extra_flags} /GS") + + #Sets output warning level. + set(extra_flags "${extra_flags} /W4") + + #Disable specific Warnings. + set(extra_flags "${extra_flags} /wd\"4127\" /wd\"4250\"") + + #Defines constants and macros. + set(extra_flags "${extra_flags} /D \"_CRT_SECURE_NO_WARNINGS\"") + + #Enables function-level linking. + set(extra_flags "${extra_flags} /Gy") + + #Specifies standard behaviour under /Ze. + set(extra_flags "${extra_flags} /Zc:wchar_t /Zc:inline") + + #Disable minimal rebuild. + set(extra_flags "${extra_flags} /Gm-") + + #Enables additional security features and warnings. + set(extra_flags "${extra_flags} /sdl") + + #Specifies floating-point behaviour. + set(extra_flags "${extra_flags} /fp:precise") + + #Multibyte character sets macro. + set(extra_flags "${extra_flags} /D \"_MBCS\"") + + #Enables you to provide internal compiler error (ICE) information directly to the Visual C++ team. + set(extra_flags "${extra_flags} /errorReport:prompt") + + #Treats warnings as errors. + if( "${MSVC_VERSION}" STRGREATER "1800" ) + set(extra_flags "${extra_flags} /WX") + #else( "${MSVC_VERSION}" STRLESS "1900" ) + else() + set(extra_flags "${extra_flags} /WX-") + endif() + + + #Generates intrinsic functions. + set(extra_flags "${extra_flags} /Oi") + + #Specifies the model of exception handling. + set(extra_flags "${extra_flags} /EHsc") + + #Creates an object file. + set(extra_flags "${extra_flags} /Fo") + + #Marks an executable as verified to be compatible with the Windows Data Execution Prevention feature. + #set(extra_flags "${extra_flags} /NXCOMPAT") + + + # for release + if( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" ) + #Creates fast code. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /PDB-") + + #Controls LINK optimizations. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /OPT:REF /OPT:ICF") + + # for debug + elseif( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) + #Creates a program database (PDB) file. + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /PDB") + endif() + +endif() \ No newline at end of file diff --git a/externals/hermes/source/CMakeHelpers/addYasmineOptions.cmake b/externals/hermes/source/CMakeHelpers/addYasmineOptions.cmake new file mode 100644 index 0000000..7964d92 --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/addYasmineOptions.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +include("${CMAKE_CURRENT_LIST_DIR}/addSeadexOptions.cmake") + +# yasmine's preprocessor definitions + + +set(Y_OPTIMIZE "SPEED" CACHE STRING "Sets the optimize type. Supported values: SPEED and SIZE. Default value is SPEED.") +if( "${Y_OPTIMIZE}" STREQUAL "SIZE" ) + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SIZE\"") + message(STATUS "Optimizing for size.") +else() + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SPEED\"") + message(STATUS "Optimizing for speed.") +endif() + + +option("Y_LEAN_AND_MEAN" "If you compile the library with Y_LEAN_AND_MEAN being defined or if you define the macro locally before including yasmine.hpp, all the state pseudostates and the asynchronous simple state (with the asynchronous behaviour) are excluded (i.e. those headers are not included). This can reduce compile time.") +if( "${Y_LEAN_AND_MEAN}" ) + set(extra_flags "${extra_flags} -D \"Y_LEAN_AND_MEAN\"") + message(STATUS "Y_LEAN_AND_MEAN is defined.") +endif() + +option("Y_PROFILER" "If Y_PROFILER is defined, the state machine will count the number of events that were processed. The user can query the counter by calling the 'get_number_of_processed_events' method.") +if( "${Y_PROFILER}" ) + set(extra_flags "${extra_flags} -D \"Y_PROFILER\"") + message(STATUS "Y_PROFILER is defined.") +endif() + diff --git a/externals/hermes/source/CMakeHelpers/functions.cmake b/externals/hermes/source/CMakeHelpers/functions.cmake new file mode 100644 index 0000000..3a76857 --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/functions.cmake @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +function(use_pthread varName) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(${varName} ${${varName}} pthread PARENT_SCOPE) + endif() +endfunction() + + +function(use_boost_libraries varName) + set(${varName} ${${varName}} ${Boost_LIBRARIES} PARENT_SCOPE) +endfunction() + + +function(add_library_for_linking varName libraryName) + set(${varName} ${${varName}} ${libraryName} PARENT_SCOPE) +endfunction() diff --git a/externals/hermes/source/CMakeHelpers/functionsAddCompilerFlags.cmake b/externals/hermes/source/CMakeHelpers/functionsAddCompilerFlags.cmake new file mode 100644 index 0000000..105747b --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/functionsAddCompilerFlags.cmake @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +include(CheckCXXCompilerFlag) + + +function(add_compiler_flag varFlag) + string(FIND "${CMAKE_CXX_FLAGS}" "${varFlag}" flag_already_set) + if(flag_already_set EQUAL -1) + check_cxx_compiler_flag("${varFlag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${varFlag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() diff --git a/externals/hermes/source/CMakeHelpers/functionsRapidJSON.cmake b/externals/hermes/source/CMakeHelpers/functionsRapidJSON.cmake new file mode 100644 index 0000000..c638987 --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/functionsRapidJSON.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +function(use_rapid_JSON) +if(SX_RAPIDJSON) + message("SX_RAPIDJSON is set by user.") +else() + message("SX_RAPIDJSON is not set by user. Setting default value.") + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + find_package(RapidJSON) + if(NOT ("${RAPIDJSON_INCLUDE_DIRS}" STREQUAL "")) + set(SX_RAPIDJSON ${RAPIDJSON_INCLUDE_DIRS}) + message(STATUS "Found rapidjson on: ${RAPIDJSON_INCLUDE_DIRS}") + else() + set(SX_RAPIDJSON /usr/include) + message(STATUS "Set default value for rapidjson") + endif() + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(SX_RAPIDJSON "C:\\Program Files") + endif() +endif() + +include_directories(${SX_RAPIDJSON}) + +message(STATUS "include rapidJSON from: ${SX_RAPIDJSON}") + +endfunction() diff --git a/externals/hermes/source/CMakeHelpers/setVariables.cmake b/externals/hermes/source/CMakeHelpers/setVariables.cmake new file mode 100644 index 0000000..a6f1454 --- /dev/null +++ b/externals/hermes/source/CMakeHelpers/setVariables.cmake @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +if(("${Y_STATIC}" STREQUAL "ON") OR ("${SX_STATIC}" STREQUAL "ON")) + set(LINK_TYPE "STATIC") +else() + set(LINK_TYPE "SHARED") +endif() diff --git a/externals/hermes/source/CMakeLists.txt b/externals/hermes/source/CMakeLists.txt new file mode 100644 index 0000000..2f86fb3 --- /dev/null +++ b/externals/hermes/source/CMakeLists.txt @@ -0,0 +1,13 @@ + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +include(./CMakeHelpers/setVariables.cmake) + +include(./CMakeHelpers/addBoost.cmake) +include(./CMakeHelpers/functions.cmake) +include(./CMakeHelpers/functionsAddCompilerFlags.cmake) + +add_subdirectory(externals) +add_subdirectory(hermes) diff --git a/externals/hermes/source/build/c++03.props b/externals/hermes/source/build/c++03.props new file mode 100644 index 0000000..789513c --- /dev/null +++ b/externals/hermes/source/build/c++03.props @@ -0,0 +1,31 @@ + + + + + ..\..\..\..\3rd party\boost\Content\boost_1_60_0 + ..\..\..\..\3rd party\boost\Content\boost_1_60_0\stage\VS2015\$(Platform)\lib + + + <_PropertySheetDisplayName>c++03 + + + + SX_NO_VARIADIC_MACRO;SX_CPP03_BOOST;BOOST_SP_USE_STD_ATOMIC;WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(BOOST_PATH);%(AdditionalIncludeDirectories) + + + + $(BOOST_LIB_PATH);$(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/hermes/source/build/debug_info.props b/externals/hermes/source/build/debug_info.props new file mode 100644 index 0000000..5dc702b --- /dev/null +++ b/externals/hermes/source/build/debug_info.props @@ -0,0 +1,18 @@ + + + + + + + + + NotSet + true + + + EditAndContinue + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + \ No newline at end of file diff --git a/externals/hermes/source/build/hermes.props b/externals/hermes/source/build/hermes.props new file mode 100644 index 0000000..83bbf52 --- /dev/null +++ b/externals/hermes/source/build/hermes.props @@ -0,0 +1,32 @@ + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + Level4 + 4127;4250 + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + None + false + true + ..\essentials\include;include;%(AdditionalIncludeDirectories) + /D "_STL_WARNING_LEVEL=3" %(AdditionalOptions) + + + + + + No + Default + $(SolutionDir)$(Platform)\$(Configuration)\ + + + false + + + + \ No newline at end of file diff --git a/externals/hermes/source/build/use_boost_externals.props b/externals/hermes/source/build/use_boost_externals.props new file mode 100644 index 0000000..cdd4e52 --- /dev/null +++ b/externals/hermes/source/build/use_boost_externals.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/hermes/source/build/use_essentials.props b/externals/hermes/source/build/use_essentials.props new file mode 100644 index 0000000..ff74c75 --- /dev/null +++ b/externals/hermes/source/build/use_essentials.props @@ -0,0 +1,21 @@ + + + + + + + ..\externals\essentials\source\essentials\include;%(AdditionalIncludeDirectories) + + + + + + Default + essentials.lib;%(AdditionalDependencies) + + + false + + + + \ No newline at end of file diff --git a/externals/hermes/source/changelog.txt b/externals/hermes/source/changelog.txt new file mode 100644 index 0000000..861e3a1 --- /dev/null +++ b/externals/hermes/source/changelog.txt @@ -0,0 +1,29 @@ +# Change log +All notable changes to this project are documented in this file. + +##[1.2.0] - 2017-12-18 + +## Changed +• use essentials as a library. +• CMake: use external CMakeHelpers files +• CMake: refactoring of build scripts + + +##[1.1.0] - 2017-09-20 + +### Added +• Support for Visual Studio 2017 builds + +### Changed +• removed uri delimiter from globals + + +##[1.0.1] - 2017-04-07 + +### Changed +• 3rd party component 'essentials' was moved inside 'externals' folder. + + +##[1.0.0] - 2017-04-03 + +• The very first released version of hermes diff --git a/externals/hermes/source/externals/CMakeLists.txt b/externals/hermes/source/externals/CMakeLists.txt new file mode 100644 index 0000000..e095099 --- /dev/null +++ b/externals/hermes/source/externals/CMakeLists.txt @@ -0,0 +1,11 @@ +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (NOT TARGET libessentials) + message(STATUS "essentuals was not build before. It is build now.") + add_subdirectory(essentials) + endif() +else() + if (NOT TARGET essentials) + message(STATUS "essentuals was not build before. It is build now.") + add_subdirectory(essentials) + endif() +endif() diff --git a/externals/hermes/source/externals/essentials/CMakeLists.txt b/externals/hermes/source/externals/essentials/CMakeLists.txt new file mode 100644 index 0000000..097f692 --- /dev/null +++ b/externals/hermes/source/externals/essentials/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8) + +project(essentials) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +add_subdirectory(source) diff --git a/externals/hermes/source/externals/essentials/license/essentials_Anhang_Appendix_20170406.pdf b/externals/hermes/source/externals/essentials/license/essentials_Anhang_Appendix_20170406.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e6c6650ddc6ebe2cbf7c4fc021faf553da3d4848 GIT binary patch literal 144257 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�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

AIpqZ$CYIQv2CiZPT%YVH<1HH*=s_NgW=Nrp9dZ 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�t=rVkPJ*aRqv;6Wc+*Cw75eBmNPj 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 Dz_u6d literal 0 HcmV?d00001 diff --git a/externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf b/externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1cdf2ed39b1a1de48fbab0e95ad7d56a86081872 GIT binary patch literal 137055 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 literal 0 HcmV?d00001 diff --git a/externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf b/externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_geschaeftliche_Nutzung_Fassung_20170406_en.pdf new file mode 100644 index 0000000000000000000000000000000000000000..037bf28eb1bef6af6f4213cd52bc75bac6f2eb5d GIT binary patch literal 158255 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ťm4pLrzv? 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%0AUTwL0A@Du!p%&qNi z@0oX>Uus9Yk(72B2OKtOEEGTuSu zEq5jfa6bKjKK#Um#OV!r=`J2yDZNVf>rLi*jW#_saT7_t#l_(bHW_F@c)wg z?))x%%`V1#RR4wTPJ7#fes}r5qXpR9?q|=x6bsjW@r#?E8wJ(f1d-4Dl&@9ZZwLs_ z$90TnOnB?4TyyGR*uOR4~z%rIlOKvHHT11bn()sYR98&eV0uKNYT`Fmw(_7 zXeIGJ3(t96*0A@_4L^@OzCvS~YHOk6Rg35?|CO^(nYA;uPszF3m8_r#c2mg7k*S=% z8`A|HeG%|j%I|jB!>CGdotOK%aPvufk;)1r_qEMFk)7z%?3aH8%qNvICFR9jY43`p z!;k6yiAjfoG_!un#WpmV7-F|;&LmDIGRyEZe57Vn-%iBGPp+J@=J>ed7!H9~!|fLt zsvkZ|1VQi|?lm!?>{WDenMgIgM(G?s@yV9aIqhi{HPg#tf}(C+-_c~DQlKeuN`>zb z&n1v*&*QMM<%Kaj=gLZ_*l_HfZF&%cO05|}vusZa%@QjN#FR0g%aL1hp6#>}^*IgD z!`wOJ)aV%4r&;3P3rkTy*Jk4pFyQ}KJbXThb3@OgHig%6{9XRSIsr*Zmh{8 zNs~RM0iw8Reh%pZsF%Lh1%P^>N*O%hlA*bmhqvHA!f-PQR z@P-EMG<$WvceayT=_8)ztU2j17L+^xC@a(nYdAb#HNHj-YW_t!jnW85BrG-Q#TNhl z%6t6uPHxhu+hqwzNSqb}M`<$Ta-=lz{i|OGX?m1>8P)QBC-6&U&VG|$jS1ZJQ;$jH z!pEG?elB$m)it6%0Y;V@0F0GpQi!(;{|~s86~G}G9)NSc2-Nj`{~vNuBO82=A+jp;<`ZT|ch=4givEy`JZ=4V12DA4`*ZW+ z%dT-%Vr2SxtxsMXU0=S8dZv(FD1Xq8>X-TANrS;8v0e1B<6UGb*~QOx^V~SXgQ@xn zV?hGw4lR>1rfy==+pLeZsut0w9UDEz**PUfruO#(lm-hQFIbFAsCyz@aGg*r#)YfK_fFKTzZPi59sy(`YE@ zMStAr+B@ln{k&+1;VAlUW*EKd%Lmu&@M^p2?9)sQiu}kA>|a7CzfOx|WPB9G{A5W6 zFZTgr+9rnEUDnDGH;?pjdM#0+uI?ITcC79zeEOL7?LeUpbQFN$KGtXN^)WT}wEhb% z{NtWcx9vA+QrJTS9dl19&v*?*hprUQN52RiNss5F(rg<*XG6QLpF{6H zY~~grh&a?QG|8Xu_*U)b8wJL?gU+x1OCA)@wYQa-4Bh%uTeITx1TOcR372gP!QB2F zprbt4Qh4h?p;`MkxzTTS0;^``LH^R5_?@LqxHZ5+(+cq?fE`IqdcFlOM=9=|_kb^yu~?b~QmMBd;Sc8-BEdXy9b&lfdB?7M=D3<5vCU!4zv&kBXl zy3wQ4*=tvC9`&$r;H&ckdR&t&3H^TQ-KbiXuk;4aEqfexXgD`NvdY1lG}Y|OUYp^k zmJV8KgR0k>8f(_p_wRH<7cH*AuUv^cpX9(W*oU&J&*d#hcw=)`d|aXD(1;7eJ#NlWikGp*5F~@5@wV zJcHuQk#`oK(+#oHkPCW5Yu_epMV7Jk&*7o>u@Ju=`{7(0W@mFl)FxwGXi3WH)Nvp| z?c^ajq{n{@Z%A_N@P5eOF~Nn3Mc)Cb7~#?9b?#?{9-7-nq%7D2EpXuT+DQQ3Q*Sd= zvtAK6_65Il$VC$Nv#{d3A8w||po|=o`uqc%2aMjiIsBVYAAQ3XbF z^0)v8%T$lE3Kl-^o{_w-Ne`Sl9D9-k~-me;AD~>pLS{PvWIYOD-eS`#fURypV^9 z>bdEcn%gfG$}vYB8mV^3!fXPw4?lEET;{t292^4TC#w0ix<*|BhexT(FC)_s#bpK2 z6BYV*F?;p4tW9_^<`MbOzI`c!Rku&b5yX z`ta&~vwDiEJfA@;n=Kpb)%okzokH#Yw^I#Y?+6e)4iKs{D|g8j5U%wa+qx=ZEyQWc z^(p9;5*K3uQhA3;hJ?rHhU7qCQ2=rWir^cmKtu)tQ_=m8^^7%qGx6j$f|A`|PuenH z)Dm9FU%a$*c;qbNO!KFYmxe4H0}L!So`pVsbB?xZG<`)nKsv>46oG4A=MOSCfLd19 zO)}My!xmDCA248lcXtRbvZsuS*xwdG@3(*>J2gyk-ZoGFiPu^!CxF(qkmG-?>%i44ZDZ;!>?n`7GIIVCT{;{k{4K^yOzwy3Hhq zD7QEC3^@rp}gc8Wi@je&Q;Ddsk$X=qYR4`y2*50 zrM^NGxoBZ0Vc~auQ|-?LU}W6hq=VR3r03E51?4OGap=#mN&qU}r!lF!00g9b*9G+5 z;MD0Q`vQJNhT@<+x+{z}+WXY_i_Lqkmsl_nZUO3ZaBa1dV=;m;Ie!`c+JT9Z*tcGv zqaGht!;c4=8J4%Rs-|`9!O+j|&v2IMCkD(?urpAbJ_Nk`QQ&XlCG1kjnL!{x{an;- zNryPnyG?2(#M;`q|B1-dNlVu?iNfsD%qQ3}!x^oVFJ|I6TIwlSdS;M6oogbNnZ%5q zdXU6Tf|@DTjEYN{eum6VN|PzWj1*gWSA9+;7060*-hi$Ab$#>+l+dwcGSLU0VdC=! z{d%0I%J>s#p<}AYo+;Sj*XIo)&I!1T;lrf0jYiJ6^b_VLh3o_bRm)4b6N9}R1O#;C zW*=hg3bNjsWYSahEftTJF*hGN^TybPWxY1Zq_B9vT{Y#=n8Z?HcgQUFT4kSDEwzDgVLhQ7~Z#hVwa*zqY<_2_+5<*AEiZo{LAs4x8^!#ZJ3vH;@XFOo7)EAhTPEF zED7T;AWc8|ONXa`E3c;A6tIJR6}a2$IyS%-1tV0PMG0YF7cb=m?Uo#kz_2@9oNwk~ zP=DYWQzz&mp0*&)U-okdpV0f2XhyD=)7JEtmV+&C@OIX6d~;(db@}!uw~K7-du{TW zFzq!ppb8YW16acqPf0yw+lAwzsrWvg27f1>=t2&tFR}GRVf3)~>tNiq9VdhJnQLK{J>Ow-xc%dy`*0&3`fSXXHlm@h<-rf@l85eb_Be;` z%Sb-p?y|j;E{W>J=faB)cR2z=XG53G)W_+|A7N| z_Fka-=hX0Xu=>Vz?v}($E%Hk3S z=CtDgb!ATnyyE{gLDBS*WB0-hlzSP_#KxUmU9L~};ajV|&oeb?6TIXQJnTBS~_Dbsnranr;(QnxfM%!4F@^|VhM=AD_P#VM>@{-SnDI`b;yk-18%bME`d zGO97&;tVQd^Myw&O`=t*@v99MO<~JdyiNLciUjkNO<>eDpOp~%04n`zcB?p!17Kf3Y z8`fxBMh{#QMc(i_K}sIeEEKw+dPX|9?t;R0MCHnAO?us za#8rjMwjz4)}~k#5#|@|J+dw|G3luk3iU}f((^m^vLyeb^yd(^M=SH&#Ib9YQPn(u zgtX^=rn0C*D&J3Pxlf!RiTfO+#P5f$ni+hKhkge~%ywgZP8&9IZ4j7m8Ai!I7l2 zB=?0vjqO#c(p_*$9t_~sO5j4C0N^ceV09kO`*><&gBuv~*IpvA&}^UmBwWbSP|O2c zd;PW3Rn>aX(2&icoI^5D2NA?1$}c)VX#jv94&_V6$In6(b#tU9IbolceLF(;cNjQG z9Eu)1Z6=0DrhPkN_jgdO1vk{MF5ENXTNZsgg7 z>Xz*9bh48Gs~$W_CWam%AqBRJmyAf%X<6Sq^X*`EOp?ms9XP@XVv7sa`O20>%=(m8RkYT%6&WMzPRF`7AXw8V6nw9nKGT%mI$22HSzbBjM z$FZU85@)+8%7`3FYaiF!M&DGCKsg-O8}%n6tP1J#eh{a~UPY~YD=;wT+?{#7UyrLUoAHI5>VYj^Vb(^IQYO*o8 z2-o+Q+0mv^$~IYiQOFuuOT^cG43|jifu#oVbAiLY3O${jQOkkbgT{@%>sI88N`0<0 z7Nm2lz0CHbfrU{Ib8P&&8|OGbM6e0@L86>^1aHO9`NboGJ=OHlBG$Qj|BB^%{MvQTYI-l$cGIc13uq^MOVOxHegg$O1Jz7Yl(&W zTz*aI`wF013U3W#g~1%wV|wIVuO9V*+XHXbVJ*MxpqHuutt{3A+uls2)v0QID0jeW`sVwgG-~ ze_LWMl?lxKPgjYV0$SJ@V-rwUz`mC9A4&h)YzYTQ_Ia43=NaNk4kaQL!Mz%3_brtjb?NHSGKKzMud^ zQueo9Qn0smQc|}0Qq+3~erjh~cnN>kT8TiUM~yPjTMvXyomifRez`dWW)sm4YpvTnn^!3$IBokWNY|D#IXU4WU(%PbrjM^5_H&E8~UsRGcF~RPWIFklugDZl~SaT98pq@WN}7P zGp;0*NsdTBSB<=I=2r^}rDc(j&zF`>oGryrVvV9@QJMTEJ)Y7~hT*bHSl-Xi6Hi zmgSNIgb-k|oJ8HUyBPt#+e;-w!(LtK>aDRr1+U}vl1vC*pY%|ht|<&RGiw8uq31)W z87F+%L()xn_Or0k48p#ujTG;WR*}Vbc%|8TJNPUoAGsJ5)w2zuUtl&2fIpWAnfeGoiCH znxzyQttE@=eep*Qk}V9%b&R<|wf%)!6l-VnvB@Q`u)AbS(8=bW;bUwvAx%g&`)>&*tr4Y`V%3H&p~2+jbo4c~!{fZMTnG*hj7TU)VjYqSY%`%&_ zJ_94}nKi@+{F}d86FOjlBdP;9j>Eek(8z{XA5ftD)w5W}Q$+WBdw zS*-h)I5i|gVtFo)dM%*4oVr+D9&3bZaB*={9~0kZO*dQ}zT}TdsTdBC*c;$Pdmox}i8iN1lf3S?gAt_iCr_C7%{9 zwAGJpaW*yQ_iMyRPTO8aLk{GdWwq|BuT~XOnbNrdUD{srf_&}3rrgb3zAm%Dy7jP6 zgq^r_h=u4vQWUD%G;a%(L91E=>bsomY&z=^n(aN2prJwnnk=|xNT zy|LGN=CJ#XbZHunc|BcsKq197mf?;3sH0QBA)u?_cyf}C50qm;$l|kNH^r92<5u5! zBebL;FtX_(aKg=3%dz zshJW*Tgg}{xNd3=|5ov8W7eQt@4Ed(O%Q$ITa;X{0q##0O51hv31YtIx#tQD;wSFm zD=Wvnh+=}S^;IA1&{CB%>j@9~iKr-pmUgj1Bchf85AL}s&Bt-+owC$kg&exO)fN|p z?gh^Grn=#xv(Vo3}wxwr*N=wkdWY?j_LzK z~)OFt)CI_|dvgG6y2iN+&FXbpDf8b&Az7Trn%cC*MAgg&$1CUV8X z#3858$y(G*uQn{=W@AGkI#hRpM%Kc<)cZz6GW3q}jc(M}og=G+ayYY}4?0b3?s)!) z!TSJj%jMO(8&T&ns9`7MG5HOzfoe+2(t<_`QHo7!wwCga%dL@2h68@KLXPP6sGHI6 zMXSK;CDh8n*QI%NA0$)E$p}7eKj?b=mHxs3>hve;)XmKp2zYY6E9unF-6_>(<@E+Nno1eQ+0n*rqekJO zo{M8}uM-1D|_xoag=wx@@GPDxP<9$NTQEM^)XXhrj4$XSUe`9c7+@ zj96^D28i%}ItVA4+8^@0m(>mG0j^DlR@oAPM!<5HK~Cw0OTvLh_g!KIc59C1ZNZoIxNY}eFfxZq{wRrO#p5oE z{l<$C(gVr8V0B*Udz@P=$ZUWOGQzRkTl3;Q0-~`+COV>PZClTFQnwuEd4w))@am61 z9pcFtA5t>=6YzJR!4%DV?_op%_pWR28h}wMR1g8!!pWQ%Rc-U-BE4>2ldT!e1jjrJ z&*zrIxH44Ko^Ryq$yb&SHmas{=B6~Gj9;t1DSC`xlgccNex+ExH^9K9x*6z#JKI~i9 zRLw)5n(C?PIp;LibtXTuQ3f|+1+(#M!8mW6%R3P3;VkIyM@C!1<9udPmnWx~OU~7JA!TRn4WMgs2k~8%;FwOyb{-QN?;IviE$b?ezmmAP5HS=x2KCjK2#AP!>ta zydTZKBeD#wTMOh-81k?RUV{2VO2JdnW<}S2!l}%p4*H6{u%vyBPlN$3Buf)Gc~Rwe z;}>rJ@D+0wFfDwX*=hcY$%_d)ZDL7NaoLO#->TPxGA~VyX$ga9cTEmnGHMqbxd$ew z&!y^&@q8}AGP#vyH8q%L%Q=;8Q3(5k7L1_rDb}$R8`&(LUYpD1qUHFs)&dw;*Mo;I zU}7yFwF*5Pxify*-o-D85_T1d94CEP26>;ZLn4L6Z_@Hq;z_=ClRHw8+n-;+wM+S=GJ*UIF zJ}1OO5gNEYHVHfn#OeikoH)CaOW#3L1!Q*O7M56-`$%GV+t-V{w?F(0AK<6^4mX24I)RGY0a(0o!+oc*(&mR$$pM9imA>mG6!>pUC+KC9XZdflk~qNNe5koh*+Z zIq(s1^T&72E!vbmPkNQzdfc@AX&mzB&WnIsh-1OkNFd=CNE-8L6w9hXTLzUD?bkjU z{~XAhIIQ-N!fnhwbHReex(v_ey3t@LTEi!BH?{hMkWAlH*H_?#EuMf)U3N6CjQl>E zfOsDR<`*Lh-bTED*Gl}K;_>-a(BlEH{S5n|djlF(%6N8$;#q6fT;#4lU|H=$z=bJe z9s=_D)SnE*s3Qj*8VM$@jZ8yLbw+4IaX=X~BrQ2nNNR>#s>F`m22W|lqs1eIMHQP{ zQv2KwHnw^DY7&l$7wW5yg|!Rau2ak3P$Ga3A3(K=pJ&l-1f&gPxmutU^4eoIyQ;&3 zN*DrS+HPgo90M^1#F(%n20GK9v(JP0GmN?mGy`8_1awSsw`(qZ{3ovWGYEKUNb>{c z3ynjy%LeaGGehcyULN0iUe;{jC5A%Ly<^_gdG??TL7|7N>a%Jyc;hDfpQLb?xLO)^d7zww z(A}64Nl?Pft0_u2ugNEpa2Kli$$~GAVm+!#Apa9QYp4)D`X<%--(Z$E2_?C z;0|Kinf_xSv%Egy3&LvFvFePuu%&tH2{079zk3sQt^9*?2}uYsp)7iKog4gApYr?8 zOug{8{(V?G(`Oci#Uxb6axEmW*)tDT)9A-nTANrj`L3nfUBVK243+cYgG6*^b86OS z-EzD$4u2OKC_r#qfdGq9rj%U~tc2Z?Hj4`P%(7Xxzk&BpQZ5#u+J`E_h~sPA4!SuF z;&F zDF4KL4Q~$dU=dN>2F6ke0M(V;WX}B&fsy{qw*dX!8UD^#c0T z9o(+M0Hye}Pw?Rn0;bU73z*BHP>B-(xLt-C`JR&LlO%y#3yi%&8O6Wk+K{MB z9hq^~QzVbomO!-&{2qCV>VL?mpPcXHKk;qyW85i0rC-%t_R(o!baYs_vKi9}Fe%S) ze$EA8!!SoHpk6ciYLzKjtvq4MovQ5j+)vvbB$7p$DOGz*uKvV#_ofEWFT~@o6gt05 zb+@aw==}xe;)bNKyo&tO-z7S-(dtn|f!X0yHl!7#FA^I;?I!;!t59tKe+5Sk7rlS3 zMjh3f70dj`BA+6PfIu!$0!=!DLyg*R#62~M>TfE#UJ~D)KPW?6iGz2hgmi(@f72TQ zC7;~iJKw$sbLiC*#D{-t&o*PPOi&nBS?@hzG@GIJeCSDOX%dM&L_beDlWD?oe7)N7 z1U4P>vC&sMjqtdL4Oa$>t4+T;hGaAIZEw{I!aOndcob;7N$C2U7!nV%co>7-3_xA9 z=p@dVcA&VBzftq$;dIhQxn>q3;`D<=^ijS-UbHLaniDu@K8FtZ4_yO$f@MMo=$Kdv;xeGu6Pw&S zz6XmhAN6|6<#Jsf?n+JF8hj<48vm)@OI}QcB^}yBm1ydlnK$TB*DV&~&0XYQ#>47P zQIHGa&G{6Qeg+Nf4_)}l#mO){X4Q3!gaSYs!ze{m{MgjJI7DsQPkR-@4>CeszGYHA zN9>*Pjr1JGB!kKO4sWZAtprArT#BE6X|NH_I|$W-=ek9Rt_Fs(p?AY|r*s=yz+!@Y zb{m$zzA5MbGWKyGW_7;YOFqt<60#!w>Fs$+nm0Af_(K_x4-a9M^iI>Z>9d{-zBfHG zGfFcs`$W6Bu?45NfdvF1>1>n)N$8CT8HoabaK<)o@Zt2w%Z za(LYTiQ~Pe`Q)CFI4*(3gEN%yc=qIZC{r=m;;{7~Q@hc2^Z}9^5`na7$yiJmuh+0Q zGPp{mIH-MmiE!A{b-ZY)IZ9ZMCFwZJNhTc7bbFl8|<#3W5gnukuFJM0T!XjL1n%~fv29kI3@Bw zO-0=)xBIq_-nK%CE)JZIZKT0GvR^m-o;nTN6}=*-Iw|W8dxM}xDs@gyaIs2B-X6-z z%ub{kPNt1;Z^Jm{T2hEWkbt*yyJJmDdji*@Eg zQ46G&pzwZ^KgXp&K|P2NVIYN4zpNepxyV17G(_S28_4+rv7QWA;pT6`u+RK>S zh8_$o18+y-&ajkr()?*ba#oLzG|?{auZ?xX!emytfk$;ZmW-!?R7$W6AcJ;1e=*LD zb!@oe3wVfxTAzUCJniq=b!WhNohhIWKYo|ndqH{ma(Zleb3qdY7BX{y!VDqa*_I{9 zG}$-n$5!CI^*dlSdg3mfZzoX^pM~?Jn^rk2yM$?sUwPG`*IZ(_+>3gI6;&APjPNqc zDxDnovn<}FrS$Vd3MpIH_M_V^*@C+lA>?vfG5bDR_Pi?;^E07M2pfv1SKSTs?)042 zxuVrBeRM;y==FRau*H)j{C8{Hi2*Qav@Fgs4#R$BAfOSm=Mecqr6oDOL)k|Zq{R=E zs}!VH!Xuw+?4zCwC<&CPADcr(iPKLZblhAS-o<~nII@rU*{qim%_tJ_PAV>Xf6V!W z^{YvdJ#;1N^)%C-tbcFVo^f>k{v41wz1|weIQD&mAp?`cLQsAQ z{2-Hs1DQZ5+-$MW%KU12y{^ePbk{6G8*bU9E(`ocEZjfl;X}prX0%U*7=T40Aqm@| zCit>VsfrG}DD4E*r_X%DI=P^As$5bj6hK>Svkkk^&Vp8MaTg-_QtL1xuq$D0B0iR! z*WSIrkm%~1S4l3^bAnDbL7pgqem%{3>QlqHCK`r)cBPguaG=!Poa;+Aarz5yGsbD0 zvPDR@WwTT%tya4-?TbIrRb|V+ZUP+Oh-{x$=Bm*pMasox|BLUPa&4(`DI(omIZ@51 zEH99J8Mze^Z7WK$BC~p0fc{1I@7k>xakW7MouKERBfx?Mi@Db3%{d}2UYlsXR{2DI z%2`NNdN-#djZ*APZWpBLr=elB-o%ev8d)mkdPUpRBZ1*`cXst?j(beiPBhcptJ&5? zsKJ%`_6AR$k3RhIC4Rd_|HF17rsB$v7QaTN;}=vPfn5*|+RWb6#nsu&$nJlI4#w7S z&>YNMgp7p$E9B*65Vx{*HFIVVw>5G#6E!n&Fg0V4HM6&HwIpO_X65IHgZ@9;J#+LD z2d#%0VZ-nIq4BmvoEG&&4F9KE$)0u#l(Q`v3w?ufmdHV10|rmlFy!ku|DDe7q7Lr^ z>@zOphH3D8f{EV9EQWFaSZW20(_v{hZEKdCn$EGG4(cp^v>*%OxjRzk5Dq?p9@bO! zGYzk)911=^UH{WR?g7W51T4*3$B}cg00YIrTznp!$4%Zfzb%C^AU=VPI7i0dH@tE1 z069*Kowd-Kx)MFhqEelxGvHGmuK1fdXGfv6V@~Z`ar>Xo>EqjN;q@e~*Cf1jBJLo{ z?i#Adv?{*~uk8R+XrqT?=ruGFw(Kh2YWZU{s2Yv;tdBpj9B3=lk*9#Vp9$f6<*P zqNBGcnQys+K`vp{M8)w6y!u@Xl0oA8e*^gYGv^$BVlZysay{OBZn@6#o|FlJ{_}Jd zqR!M(dUanZS`sYNg-mRyuPJe5E`hEFdaWH)k1|`TvdG(Th8cPD0s5PsI#WZZ{bcVC zoVYE*IX=9?vZFO+tzH6@_`TlOS!ZhP_m9H{9TZ>+`X}O)A#ba#aJvU%jNK&r=t-kx z3+I%Th!1;f$%o#m+tn$@ePj>Fc0Kp^e6e$CixBR2uN60tlK&%8&3KuQ_I{IFr{^>r1C&6_}Q3r{Add7%0V z;t3UZ!nbDbT?$-79&mXyZDc=|j84_VV}F>0;RIy4u!v4bqyL!V;ZuE~Tle4czVJ>6 zlljoj`IyoQuFtL)hyK+rU#JuD+K> z0s$1)7|jp4A>Z4$ngsS!?Is_0jWb%l@B5vG_3_{uvTImWD2PYJaoBv@KekoW1ki(=IAVTu1n;&j$Q~N%LQi z*Qt2!55@scX|Ts>%ca}}b9JH0cW@I*r-0NL=m`dsB5yQ<7<%==t08O;mhQ`&_8-vW zyBnhh;~>Mw3S-(YjV{%>;etRDJ`tY%;SX&4gBGVcU+l?mq=_Ds%t!J3Z1><)KX5uU zFYRx{>nrqYKj_;tzb+l>kqg@CpI8G5k#a*?;q4By2RKQjxQC+`~R7nK-Rf1=e@!ULts!qnSckH z>_`vH)0ZOsa1XQ#_-Shf4kN}-@y$lZ=RAH=_cFai~(ib2xwf!M5(*x)2Y$VxEU zqIl=WM3KRiqI~B_aM0L;k(MASzUW0n*bA`eqA|hh4aB2@vAz(-MCeXn0HRSLUgMr% z5~C7dY-B=UCM0AeJ41;UnscCtFAm9IQc(&{q!c1>CU9jW6{LVbB}Ql`)>v`b5LSSz zBT*M(e+2Bf;B=@gfQb=e0nP+zY>4xN2eaG|-IU0CAS45BBT|1n=@*&{`c# zmr4`T1fPvG$!+hp*4d%(Oe1LDLatWiR*&Z9+@=Zs*%;hvcO;Qhiqc=i%KptpiwY_{UtupW~U z`|{v-!QDuA>i75^kPrGD3O``CD);{D!5w0Qko&*@$OEDeg?mKa*!PCugn{D71nPH8 zUh)9ggkcB7fZ~0Wd(y)c=pS@{ngFo=kaEQQ;Mz!?!Gv=SM;zOf{|dsn&~?~N$T##oDVSh* zEHWTiV8UUL!tu{TVsONP3P1tv3zk0xVcF~WBK(j!Bms?kn0H}+l)g{~q+i$o zp|6;OSLfA=%0gZdK!!<{c2Qc4|ceor;-l%uTcl16nUhs0nU+6s|f5<%&|Acq$ zFCYQJAGn`zPwZL3yrAYs8%OkT#0bJbOhrWqETsDR`8hrFeN3@K#u&!0X52#5@PJ+( z4+@|$nAk;8Yv5;yVyaEs#!*0gWDG%OVnvITyc8ZAH{DJe@IF2d{S@eK&h~>B23&%Y zGIwW9Pf?TgM z#Cp=={!ViE-yV>g3x@eRTcMo~JnJF*TWg<|Ucj!oft5kNDcA56bHg5@#DSl3B)b=c z_Nd_&ek|FL-PVoXI{F4ffcs$o$7B1WZx7!7^-TS)js*E4@NF2?qOk3lZQwGiZJli)Dx=q$(eSR#tW1?D7ni1O6J{1=728wG6s2-B z&n%-i7pl@(<+JTodmpRn-Yu;~-Q-Lqw&K1P(%l2g@#zK=r>Gr;teevRE_ZE{ZW%4m z{)v-vs#02pXBiH5k^@>NPFzhCzq&F7{Emwr>VIbbR&@mSEe=zd=Y5rPKu=kEo9Gr( z+Z!+b_Vlx@aE?s1Y%jKQv>ff5-@LEtg!nSTGNx{|Gm*2%*Don2nznRx23MGoZ`t=+ zmmFPRX6r?^D@mSp-K?+7JU%zK`ZjM4nfd|#wIN0#A|lt|wi(ws+uJ*Q8&>(-JKKEi z3b$EjEjT$lTUAwEThiG#{u%0b6qLzv$4OzPt~1~>@#mn9%Da)JtL4LoH*D0 z9j;Rh@%!Gp%hn+GZWtN*AW7S+2NkllW&}G%m8Yz`hS-L8vU8#9W3D+;sj+@l9Q?IoW$PRdvLCI3sg>1KLLmhUEwfWf9^ z6oq55W3b!EO!WNv@dTBnsc6i?u199|*Cko*#Y$Te?$Uv}QnmG|6nD?wkQ66X512uo z{#iCmBj!-5Wl9Q@u=Xb)tV$lN^8T$1Hq#qiEf%R&(=;(;>kcaVq)Z!Zfm_cbizBQg zZ7nI~#_o@6D8i@Rh_hP(^KKQDIBY-2U`ajXUu>158-dhuHG-k)_;G7JLs#F@+^Yt^ zE+dpz1t>?3oVnyaWHEKKwxPjX<-RKW#293$_m>s6c6SC%T(Q+8_G@ zb;C()K+QO>*jRb2$O`07iZ90|tmSZ&@vSdiI5@j=uFHSB&8ETAx_;igZoI5p;-tpe zp5L||2~ap&`s?{2YN1VFMv<_+cb|rBjV9PS=Dk&o)I~eK#hWT~@NQk++fF&Mi@QdY zKh6D4Y&gF7GshG@8fg8r;W|Q`ovDbVxX<0%yK?8i2Y_UAw!r(wVQ&<~2GVRyt3R?X zCsIpNq%B5vIW)_!=8`(B`5k$7-vYLpYA=r0C@ODAFGz}g8afhUFGnK!=7psP!ZU^0 zsKh&~$;IYFGn0jrgXnwWN(9-Z!nu>DKhdzGM4=gV8e-fM;| z{1t>cYZKPJ`-~F+c|xy}=R^@si%EPvu@02NO|^{p4jZn_Abbv>nLzH-sjB-WRGi~t z@3;|jyuR@xXYcdI&Qjr~GcA4z!@dzFUndo|KEHSyulTnO^P=ZKvM9)!IB&$|N!_?U$NQil~h zu#H!AA^vetWn%?x_4vZEU6L2sE32!E%ZMER=}hzEuU+6NJD*kpF-pK(F{$?m+KVT0YBd$aYTVOV_bpS z@qPpx%2#O+whys6v~wVP#KKG4Gl3)f&3x^CV^{QN=2~QfqN$Vrqk8v->V(Vhv2gbW zf`Y$4*>!8>Gv~(X1=KIU`_z12ZZ)i z`vSX_NTPqbEmm4)WfS+?*mzIjnjt9|qu)Pi(;!j5fH7f!cbJ!YW`{Zb(jrN=Icbiu z{GQ$gKi@w7bZHuW*IfP>@6~wMe)h~Dp62A}aO(ZN!A?dIcb(GJvS z$!<>4%?Gz_=No>jE*E~wW$te22G3Ky{Va3O=AVZ^?M`R4g3bC;YlQT--nVLhv!TVy z>}+n2e>u(sndI%x$EdtlxpeXDNh^0W{2z%0#U(2c>MGfn)lUBf zt)`q_(Z+Pjp2uS8Z*TFdTr&DYj`X(A8OiS*!l~hjR$f)C97*7g$MREC8!HLZXWUi$ zkDPs&%w}BwBENroGw0AR?jv0Q(FNKZMEH9fPl7k5e^cxqE+38sB=g9Y`~Ib0LI-%~ zF0Urr&k;tyjtJr!w6%f?u0SSbPfH9;*nX%a6$tYlu;nwDX8chLdmmOQ%Abtl2?|Vm z7$j^1p6}?ieqcvqE>=*ZlQ>NFJ0Or!!WGwE*5rd|zEIlUfwUAjgz&w`$Qf}+-z%6V zZv+0!;8Wzr8?3Z?;f-Il(+==I;9CicqAj`nntwD3O!g8UNMtTFwL$4LCntlgsJySP znE3r+cYequ>qlO8Ur>&|lesHEH<^sDA~eQtp2fBoOdNYH#rFt8L1U|X6b|SNQ{jWq zKk6~Hri;tZL!Qysr7?z5pCVK~=~O;%(Bc13(C5fvRSIw}evHdAa&B#aKmH3+394OZ zW@?~U{6?YqflRi}NbUzD85ao5qgp0f6@ab|Y&OF^rU!9El(1YKGdUCIorZWe^?GJ; z3|N=s4=nA)o_PvP4(d@7;f;^*?2~suR8lZS|A5W45qS0f$C41wIq>tnQuU>a1WF3i zLo(bYQ^wbH@BewYf{w+xV&smc`U9qudyC8{I6~pt=$MR50TO|0*n1}3h>IN-sV!70 zkv~0V)2gjK)ynKmZdGVr1e;bu_*Yld?xIaDRdu#P3{2JhHosji+(tyMwk zj3iqBcR6(m=(PM13+YxUVU90y_{3-XWAI>IAl^go%p14a65l%uIM)yj1r(rB!5T<+#AH5B9tl^@rF9DVzenksa|YKyLydUw&CHbCR`M82@8m^O&J_`Z|K%1cg_@cIeVZMRL-+|467*Grt(2kmmY5{pHzQVmr?Xx7 z$$Fr!#ut=MQ0jDmrgSvP^{_~Pytq^`zL|Xh*o~oI#JWKY%~j)FiJK^RW{JX&@FF99$HGGi*oi0N3C7E~)pO#JK|ow> z)R)!1oP8Uy4wo{tgdm}Mvhb(~cxocIGgW8wwje7&l#8P-d;&rT47J0rBfK@FuNAZd zX=n!j@hiTMI4fWsMQNz-vnCzk2`8+c2sx)gMtYLSD`{gBstl@eBdWB7xJgvUtSXvL zYFV3ld0A=D>N$-21M)QnD5(JH`BCe&TQHKpHN~oa7x-M5iW=rRqgGap=&#zKAJr$S z4s@J`nD{G_m5&K8H7{~<8I%6PmuEzzU#aD)7AxZiVrxxz2Nzc9@W}D-2~Js}M68Ug zEUr8GF+5M#1lR7hDk_=UB$DJ@n(WgW zd3kIjIrkdd%;s=^EKOuhh1EoRXBI8IbKY)~&j=4Ye%FWP7>2sKFY94GhnXJF(GgEi zK(uo*Ll3C8XRQXtuC!{#JXR{75fpM5cNhonqZFi27R-{ed@-XIYO5})hP>`Mr5z*U7PWEIj}3H6$s;z4TyN zDwF7$W6{E-R_w$m)R1Q`M-^cq zA=8{XS?ZN^aTQ7x3XQE?PQn{h^RnA$8IsGPA4xWH7BYr2-66;k?^H5?ebfFr_6m0+ zGb1?r)0jtx$E@qX5cM4HQ#Q@#ShKeT<0YBcIvJf~!jfF{Q@oeIi8)JIhfHasqDs*v zucT_|zXF7#248LLQWL$=@)+x(K01PAt5}^jW8S)XC$mVgkxcpcB_DCXV~PzLrZO(7 zk~bvKV~VLW7AHo?e@w`tE(?ozP79tam zyqm^<*;F-^Fnxv#iQUd|{nOC=tzCIecP2(4pyH#mP!be#ErA%r<@(V`z_V4>y0^ zS1~e-1*re5Bobv!$Y-Wyt6M6^lzL~&in((em1~{!2UyM+=fn*o^Qy;9>E}vlG)#FX z<#0`U3qssFLW&nI_eV+fL-PbM$|XzHlK^z!pCCHGE4yqHj?)&Lr_NX=kFewN?OS-q z)y@w8pk=+T5AY|ao|wSfwL@fG$*DAeRL-}J#KyMxu6RokoO3Jru1p%WKPnnisAH=2 z^*T=hs(v?(Q!wnNu@ldx=I(0j^1D4IvRO8}C1oC2>qfNxEge11S866}^J{u*y518g z;3+W_oCvY?vIS1l|kv z3kCLTZ&gF5f_UVT83jhdXlN+I#khYM>p85 z@-^sC`f?H_l4XRV!&!+9DB_y?IU}3MMHqI*z@K21)4WltOuLO|SPo*2qGnn}JhqXj zLl%=yl;l)%XXfdBRC70z1e44sCyg>wi~xj=$h$AjD9$+f7A1hmGiPk*-M6P9Wjg-( zKTgH~O9n5>eG&w`qsck?Vx91;%vs(zZWq2hDQ@5Gt3OY4RDkvt@i=Pv6J_kM3L3`>ROO+DCtMyS-3A5-7$ro&#M|l)AD(h>hDoJ-)9-RNa zz@SKjK8hP{r=Zl^PC_Y1E5Sw}C^8u4QJ)&h0PIR_40F* zF5E2k_`81!p>)?23#%6zozGIOUXH(4_b}w^9!UwN>o9XqE-Ui7=JTv$R+PPL3Ubeu znq2asy$}+hLK49`8x$V@Q#R2vjIhk6=p-q#)^WB+Enk#vlyjkT*5P8Hjg_jAib{;B zk~?}|ifItj58Hh*z|P9Ia2P5V|K6`~NeCl}D275|mczw%J1XSy&;6CyF)DS2)QjE~ zZx@N{b#J=8oH+`aEj4zYKL_)QHXhaeqk{jqz-KvW(!&aRWK8{Hp6%?Cj5S3oKPnda zhlTNwVkc${#GyZ63=dmZ@8|nKy9A$pxyRvcwqG^#&FR9$D(jYC zcMq1;R)(mF>C|34GM%tQA(CGdLHIX=H~!3oMX+odZ=7{e;Y3M}>VkI{a%(s-s&bom6e{GHzc(WF$tGE$A~y8*PgDJS#JYf zLHV`9R^dN7U!|#PrA3z6YUJp1YmsOS8(P?KWGw93T;z&J0eWz$ora754Op6FhWIQuZ!7qQ zvQ3dJF9*f>Ya^lNC+%EfOZSL)J3*&?x2_sTKXpY!4_0$7fI;yWRim8ZpM=mAYy$BF zp9{nBbheS>k97o$C^)Pu7E5h$^fR~ePM4h0S#FD%r&(2|+1q1fl-QbF5ID*vq3-cx z_Kob^lq)&87jue;ZTOyV&JheKXlq${`4-~dV$=mQXCHkq`#L}55e1Yd#5}3R> zw5RWu&&Sz#nMnp27CltG79-1#YqF!-N~t4!gO1ezNbRW7M+@oL!5V-&mCi`Q{?hwb zs&Bf-e|ErBb%#tZzACW{?&7{UTDe6W}Xrn88Nk z_Z7@T5=ltVEV6M}@tkBekw;p?9XuI&nC!4b&57k5?)D?2;k6)fh#xMeE2%iFZLuo_ zn&3+fYMAU$mcbu!|Mf&c3|=helC)dEMZZtp8z(kU-gJFJNzpOpU~|0QZ}~Pdi`xX2 zmy@iTOA^{jfXU)2rqFs6KH`&zwWRRS0Ng@oz?sCrZ91=SdYG!G2qzK3?+@O_R0fH=0wLRjtq%<1=Sfv# z(OhX%n0M>EM_yA13K59#5KA**f^6ojutiQY@R+iV8Vkr^B(^Y4AS3wA)<4hr{Fi3C zMb6H?8Hvl&F&{!vPyj}xL3n?%V(O8_KUL~Bs;+eM4x>iP*!FY^p3Q`jHh>eP)Tvd; zX@LdF>rKq+Bvw0Y`Qp_`TqI*S2*dn>7O-zJ`FUaHV<9BzO<~Ki!hL8ubt|y+L=ssv z>oD*kYa(IGC;$$&2}nyC)3kEeBh2IDIt8U!_j%7d1O!Ad!b;%b2oOs?JjL1me4scA z@idp`)qIwYL0Ob&E4d@NW7al71`RIfmXH9h^dQQ50F<7 z-&v%hiHxM&aaa*? zL5|k|$!*Y6U>Fx^L>xfETkSh7au{N$iBo9Ij5B!a&kl+lpl&XBh+_sJeyutipw#xr zBq$|9ukn}Rt4h>T$N*)9(^Rj~Q1OA*k0=0Yc;^We966ezA=S!ZUX?m-y?Vcjs@m)0 zwh*P{w-A!XLY3b7>qRAK_jutJ=ahhAzkBEge%`2^1Tb7t%p2pspo?&ZWK>K8OX<5New=251sN5(Tg_ilR z1vee$YJqA>JApXcUl&|gwNtbbKG{-LpvTH;J#!7)LV|VHT3bhmlc^^fe+t=O3QtYI z=tpHdzasksMR5U=PPs-RJ8MUo-_dwGIPmtAh0!`|L);a?)7Pig|7rTRh-X%+ViQ9l zu+#PMd{`mYc)_&r(0t0ClzR3lsXVnULtphiRq8@rrjFNpw5u>hJ#{)`!XA7ff^aE< zN;*K1Og5)#)D_!y=}80a4-5SRP55cFF(!9GSD;j)uF5;c|FL9b;oNPEo@p8u`i{Ev z2X(_ed-t?Ws?8jS0L5Hyx?y?r%cg|=A!ivrT)>j5g~2vIL_=Ot_`_ulW^=xP_SLrg zCYhxkay97{;g8k&7XYVPeYJnR*XM1t9p^7?VSYdMI#)Fics*e|Rl{9wEroQmcy1>< zU;Q;qD$_A>0E06VGX6&CYp^9^<@j`@T-25*u_sme12P%{by4sMcW->;uuzS62AVaC zlBUp54dHMNAvBF-1{&!!G-;oz=HQ<&G}ENlJ5WnGFfW2;_ds%>K8U7@vRF z965Pr2Y~|fmjvDz!rhkuy~@G85FSIEriNBUY@r@%dSP%~H_|8Pf5!sS-X|40#4kyq z&u}hluVI=SxLJ68E|Lms@U^~4 zTV$Ld&EF#U+eppO`A`T&YLetii=lst&_^o3n7AjAPU5Nv!<3ea(Ia7q&m>wUS`(Hj zyvQh=xLb1u5mRbQp*C{N!?H-Rl9wSQ3gKsbOvih8X8)01B!VilZY7%_-A9jN3S&R% zX_~};<&NgS>-=L$Mm`uytNc`@N*fKs!p3OhbV6@+f47mGKh*rsCxSgpyOGnH4o7+? z3;A&6L%PuS;)Sq!Tj=DzBksM(S4%<%5CNM6oRP;!Q{ri4XbR5NIr>|2BeP#zb^CqC zb$09VI-Ms)p2C+I8cHijn3#pgdPhHP)fybl zn%W*gDc>#NyW6O>gF`y)k8W^m1bw?wqB z5wvF*?Z|DM5C=VOp6SNZGC#{O{+l$Lhb_Kp z^u*Ppk}m3Hk59Qq-p}lMHw``c^+0-cVHt`pPJyfApu#N*N^||-fOEqQ&WEng^WN)G zIRNWZf$7ky&#MoHatvma*8}yL$1aq(iSVm1I9F+vH|xV*Qe@Z+WH$!X2$w`AhV;xj z{__%Fqs2a=x;%Ar9_Ag{CB!ol`l$Q z*%T7rkl+h-r|cx`4bS(E7`cbf-a&7hX(SS2cTh0YHx>`zLq$1f6fC$Q%Ylx}EtiV_ z{Rei>B?DxT1vS7e{j*?cZCiZD>Bly05Nqsz*#rKs>OGD3T3?bgrkD3zKhg#k`C-** z=c+*<2v_hC90=(EPzdnKMxKHP!s$TQg;)e*bw$y3qK?0cw3s(lDMpbr2fKO$!L`gU zU`C5b$X2QN%n*Z?QCnoK)YB%eO)HTjZUChW50a=s#u@26q@E{v4dGX62GS2@nx{&x zp+1_7N*4nn<3=`(PEkgUNO;Q(=AH#}n?#hshI1{K=s|d4qC%RBboo%tXB9z&L-9KV z)Y>3UqT5)D;L#v0G6+|RN?M>Y#+6GSXCi-;AbWip&>$KLM%;)xbrpl1CyAo)w5vy7@dn2yG8D$w`<3 zhUd#Z^Q5($IXUt*9zb?<3!*owYths()Z5q1VP8ADPlT$>=S>mLw@qmp0bQ!*WmGP$ z_)$923XnDgj6G|8;XecJ%PSw;^0A-<%z^Jk(18*z@Uel{&NiNaE+W=W3T1bn3uRR< zS2fAq(q$8JJJWZDP>svAcI6?{+>_MvpNC&zoK>XRw9QF>g_n3=!JtEW=@WuNB`|QU z;Ah7l)6jAfy=Ie3VdlPHXSa}t8`qQbTrhwR&iZlfrD6T<(?xN|CE|gk#_!~CH~Ix0 zc9YG{3>sXi#<}k)BWVThg3%tx2ytYkzkCiQ5Ak$6;yA8gf5fku;OSw5y>~_5j$_q5 zY({anc>ghXqgEV}Mu3q?J!n))Cfy`Cf^kcv&CZ%48OL$)Y3Xv6yZGVGl|tv?G=8RZ ziQnY5wk0r0-cyBW=4XSyWJU5RV*~+5amX1krxlEnwhK3h4Z-S3VRs3`=^2IBF^Xuc zqumcmEOVy9G|P`2jm`ACr5qa-t=K*gEIncKai7&r$B|DEK%}EFuu}Kt$i}8z9-AZt zO%0AJAUDbC-Pp-N0)4uH*|8abUN5F!@&{tKmjCm5sK8TVh_<|;3A^YjqCX;!2l59z z04>Zy)XW=v+6wydaL{wQF+pXq5u4^mzpX|_c;ZkiV!ZI)v>x)@T z<@3~~8K|}Z@aE)m>ZtY~^P*}bG*v}LHT0XhN+VFhAyH;m!JZMb>4~<{Z-wLwmPk@J zA#H4{an~ZdIQTC~?yXOL%iA=Gh{1?%|O3vb>4nyBl z?ZdvkpOt$!!_Szc)r0ldHcz+!GGU$2q|g>{-8Ae@DQ$QH5!8pa^Km)CZE?N+=VhVi zlpKvy&h4Q7t!boo6`j%tA6d9dB_#qbKmS>>aGf-#X}= z{61P=|CaLW|D2*a7;Hoy!WZ%CaK+lWMyHO!L*OkM66X*}l6t5&8S9W&B#A&(!leAA z3MnK*6cM}ENJRIA&MNYnQabNU)=@ho6%RB8N#QHEDsAj58Z@5O1kFw~*?Z;X&&F+< z6okE>N)qn0_OGdX20D8jV_Z}Y(q{3(IJg|BRHfGNuaY~lvUg6BPnq*^%`h7H`75oR zCA8o5>w&g(PJ6tLa-$Az+FA?lCH@&`H?_PBKEdOGweD?00L!1E3bBEg*+Op(A2i^LyQ5QHhwI(OZS4I09=^jiZczM*BGbCnI?tplc_pW4 zZ}2rNJYx3sb`}%~Gh6XsO~yJ~b3}Qr!%kiMqK$ft&KT2f*!zU=q6%!cBC~U3(jxt+ z=c~rpuEsTFoM>#t8OxOvjAl6n@*E^Zsn4ee1Qd!Rf<9n<$oeCYO4#2I#c_Z_06qO? zU8!2KX1&wj0~M)+2G{^QUe?(e%rQQrzK_}mz`LBGX}Q5z*1U5II1$Y};hYHY8hI81 zSfat7ap2lNXcJpY10y_3jQk|Ucr~hFm zfM8GF)*ER#kUF+{z>`?;C(c2J@t*GV_i0P^MQFb~$(c zVmetQ0ioY8ZvxK-CP;DIAbljEHeHQyi$!qsXqX~nkvRvv#KYy0$D3nJGr6M7IJ71W zRx1qjf;L$lUx;4hNL2f*W#Oe``@y2riKyIC9(^3Zee@t`VYIOtpRKRcd+nR(rC{Y`w0De^K(92`-(Zp?-myh@ z8Qw9VbNZQI^$+uUv2+-=*oZQHhO+x_dl`+WDjdgoQWd#grf&CE*j zPg2QTD{G7)$}>*hW|_B8l_s1W&pI3)W4P`_WRSxBQ(vQx?|zh%A!{N!jql=VA*$^3 z*vSEek;YiFw_HB$=Xo65$_&V1rg({kt@o2*1N>>vQOBW0kR7vxWe>_|L=VFV^MM}* z&r`lz-E=23V~46(gsZnJ8d>;LcqT>S@NBKPWchpEdfPc3#S9;%RL4HEC-$GbMNKi!j;SVcmg@1475vEYqyvgu0=Y9q zM-=96==2vt6Hnyy1Y?s6^P}HyE?!4f@hr#PoR9c1T+(vNI^ByeFfQb#iL z)B-Mffc)doUh~|Qx3L89PAy0XQ(M~(K)x==OuO0P(|R5ZXDtu2*GX0vi2c(Ni`e6v>h*$gd^{#xi_G7yopinn4gDdKxZA*}{%@hoGfH z7bH|UCGA9BjYQVSWzaHX;NTU)?ct?EqYH<0IaN$2ML=5_zs^##jtT+&hb{&whKtQC zw~c9k2409Mb+i$^l(bF9$UlbB>We|NG1fFi>Zpvm_w3xG@`x(H{kubcq#_cbTFyI% z^H;&Bz}M%Wy$~F`4Xc3jNjofUJzu$T>EJ^_syhQnD~YVHlDASfK5y{;#c1469V7Bn zNT5PO@rb7@NmN#L^r9ZbA|JSQ-NPM9LY>BC56)?JQCAqXbdt(c)J~&8y#Z_8KMe~q z+O@-2+Y&#l_lp{Zihq`YWWR(u6C2OfM%^=0-LvQ-b(Y0?|45&JZDKlNupii=Hm~U% z@v<``u&&a@Ijz_HD#G><6&2<6&@q*JzMwwm3|@exOk*uf8O4k|QBgN?7L*}qU$VFR zPFXgvHM$k_`^g`@OhJQTK0wEsUMIXebuBt80xP7;SiHS<`wFZSWnEz;p% zvys*adr@8RDCTVObPCbLd%Ax#e5q$#*;kg{dzQ<)#FP%kgv zxWvSDk4sZrkkZwk?=7;_R)e*<4-vphXl+~Z;m-Ha{7|_6t)%*MTEX8)>{+|42rC|o z*GiVm4H%fo&~Fs_@fr8yxxPi0HAn;leXXd+ObqMg#kkSS^)n&(%B{GOO`y7opGO_n z1Y*ds3s=k{CugTOrXrs5hIdqx#Ed>(i8Ob{%w?$0vIppj**y0k?#y-fw{U^0+k27G zb9(u|Kq5hf-uiO)fV^ZPVJpY*_$laCe&PgE*f01!WEB$>0`ANrFUIS-1C@ zu)5Odh(yqON(;*stY#t7Q7&N}Gobm)eGG)QuK>~N#+ytw#ySIoa}xPJn?~0Y42#{lFGvT*ZXNf~JB}#+1Zotq4GiR5+(An%z)_Lw z`f6X9GOj#6EY;{jS-cB1tU(b0h*FI5Cn*RIdFy~_`P&}!qqckon5o+@R$*(bLn35w zp&NC7N51A_WJ_{B-sQ~ptP}|M9O`rgkPd#(r>8}=EhI5W#%CKjq4XZ`61)C7i3t!) z_K&5`qay0gSZo-6>|&e0+*PYb*1XRG{vuq&R@e-Fhj5d9{(F8WD)_t6;E&EmL{AFU z;Qo(Ds!-5~ygA-$cVmN|rC?yPjh6|{(~#Z(Y6YR#)Q{sa>>?yM4`uHqtB>N;W~}b3 z_^v62ZXs&n!qv^fj}H+4Vi|2(!OV4Fm<7-#2*L-LIago*nuL7uxgjA4DrUhIs-pNv zFjB{0e?c7*d!G+VhO?S7&WxwHLKA1IUqplm*nh7|jGS_Nx&jg5^B`d#?tFq%Q_J#) zi>G0`^e)Zz^oZ4;*9YMz_2^VIG}>D5bRBs5G3EE)UI=6Cu%XVPgYSO)-B62wI@x|P z8?0%;OjI3b)J!j`^;P@RhJg#ws%ox7vZ0kTqpApj2*$Ck6~4riF`^D~S#TayX{v3* zm<)j+7zIF*fg%*N1eeJY=RghXprXsL4I#+03>5*$=pO!%+(C6&#QvB(h1~mVD zOIQ%$pAcjK6C|hi=}s4lDo7qNO$0}}f;8qzB{GkDayO7vl9Yi655EOUW*}svg88%@+RMvObThR9p~1uuk#pxS>k zmg3~+ieO`9zQ*5P9bOC;{t|RIWF99x7a7*;}#)92cIFNu7)?Vh~Ou54(=#+QdT8lG)FI%EEz}_xh*wKS1CX z1K(9y$RsI7Iw2GjwOtajTdMbaV=F|t7^5h4R?xU46b#?W4J0D>zN2%o^=7n=(#6|H z@+In=HF)3;eEJ{gM{N93aGXOfAb_t&L@}aAluBVGO3orSb~cX&-4?qcZX&&!!%O9g zE3Eo_ORpb^zd*jyWu}n9~7idCB*uEaHBhpeh5cDb{2W+FS0`~iszJD z$RH{(_PskdP{RwwLc}^Gg2cJEA7I39e9pB;K6^%0{E+^p&PU*0bSt?-?>un?xdv6P zimk-1>J~Ba!p>!y%}dlBq(clzRG%Xq8)Zp?tVX+*Qr<5mu+Y8gM=ei$j z&d&Dp!SDT6&FKd+tNa{;=__UOTVJ<6d??5Z5G#K{9*g8?&7%5iR(U6i89Z?U>+L*B_#z}y$}LZr#7tiz z3N#C=Uv2o1ra1DCH+j5s^P(AYVvM?GvnOH+XM!``$q*q>+T}=zjoaQp?^b{ zU@B)mM?Z}c>ASwZhUMPzpq2qQM-OE;9mhMcaJx)zBbu07w_2Pcf4u);Zm24~jE$3z zl_c_M8vN`C&=C!pG6f;z&=Fn2fm^KkmRgv*XoFA~B zS-RVOI)TG|Bl$F7U-qCh@`!obSTvEyCAwHpoSg~3{g&eurDZC>BRVA&G zQu5381I-C-;DLp{_y}1*QH5Qy!1pi0w_#M0Yq5`6@^5cYP~?WWzY}-A(gIe>hiwi! zZY=RI&pw|A>dDB=TPvnAc%Ptmee9}K}J;k#3+f3=_Jk*Lq{F(qczBb;cG zHnt#4OmB$uH+eXid#&|`vG;}T=}Mz<$NPaD`2diJ!SsyEf|eQHdl%!qy=2eUhK>P8 zfc^CSBBf=0(b2IBy*Fc>8B}{JX@AyGr!8ChRBzddPFNufM#4!#xhjLYsPyw9ZXsnp z7uaTt4Xa_fKk35Y=8$olg5o3(e?O0WFHf{85c@Al*#vUBr9_d>VbPK=_c|jWx;-w* znJ63{namTu!FyJaHzAh!%Pm+8fjxm=<%Cnw(AA!rCYp{rs-4ziT_u4HBWDZ>wi0=y zk^%4YGW7EkvJWlXreT+-(nh9MUDc)rz%UTADdcmocMaWSV9~_Lpxf{GfhXpw%X#76 z@6n-+0=l3EE!1BKH3K08-tg&{!z!0WX5n3KhADaYixz&``JM~Zjbf_HkkBzRp5qtp z_jY5M-%4x>G+MTfuH1_CNmX*Wl*+U&!sy4w zot(!2jXq~LT?u2AfuRl(Cyk!MwmYg+f+Pls%~3lCfPV?+OKZc;9(o-oOVxHrZGzAT zU%tUTkWF~HRHj%E6(s#FAasln34kG)DmOAqpb0IOc;TT&LBc2s;LFYUbYTyzo@p5g z;f!C3YPvA^WfXrzMnlIEB^yW2u?nU-*Js0gDTZ=sj~vq=2Sl=3Y{*p_eu#VvV80hS zU_c<<@qHoN>qIl=mpzK^2o0P1=TbjL@P*sF_Ci1Cxawc2ci4AlzwnCYDsvVVf@2#& zrNwPe(wbC*ng>#zk_lF!fTmBTCYhKtej!tX##$iOqiCI^m8@y`%ef$Jj%qkb&IayG zh$aZ%BHFPhx9d)Z{_0RL6Akg9UIj0F!CxJLk_LSGL312NOgFQY8p?Y}~( z?qBSP`Dg}AR=l-JR?{OZ)CUwDDOIB6oyq4b!)kg#yn7Z>M}EJ#d$!S%wy>)0Kc=>e z3jU2~QP(>|0BNo``N(W<5nm>OZ4h1;cy$a+W{5H%&9~%QeW2m(b*L#6Mti#lb|~^A zm^tnZzu#&S?xo|;K$yp>Gzxl2#x1)n>Kix`Z*1uK7jcYub=BF#uaG`}D+(nb3i2Cr zn+w6V(bs`fDG<9-f_V(J+An&H5se)x55NKeArkRZp&ksdl%c?GHAmb4oN1~^8)&SPBqB0?<#Go|b0hREP`ESCI z$T2rv)v`roGn-Z~c^{36aH&AV;IH+B@+paINq#|6CD|672Y;xK$vHK5moLXA-X8cJ z2eyhHo6$K#9sO;v#W|4yCg$tYj;H$yYOw`0JL9MXjC0zH`e)SV^^XYFe`50r%;sYP z9IzmarZu#toR0<$AtR!ZT-8;Mby3#fs)i45a6r~qKq4&+ShA|PZse--ffdT`5oh^) z`SoPQ*L10TYkXEO>Ya`x>$=B}H#Bw0H@VL%C|)Ie>~gt2GX*h|hWEs7dKsIIrxD3K zPELabm0I#n<;N|%8jUx-B=!5ZU4u6n%bZRpDoT>J{qmlu0_7v`ZS|h$EhhOQ7jtjP zFDCfrxs`&mI;2_=<2%hYMslRFOMK>4rOYk${mlw4$*}6JN>Z61czoYWkAZ=+0xn^5fZ#+k@vxRCMhjt-1S^gRG;9LJpkD>j)4$z%am7Gdd{k1}4 zb|YyaHZux)OLKB*Ob_Hu|Hk3Z&hPSZ$SkI6 zCNy246cd#}JErn+OC3l_eW|+_C1_fTY;Y7oF{d(L@iWuk-X0$Xd(*Jy`p)@ ziA}*Wz`Q`kYQbXdhsUjrC!2Opn$G&QrLN}yKlH;ix9j&-Pc<2_G&gZYN3;Lv3=x@w zpYa!dhySHKwR!=6z560VI52*Q!*CojKpH_OOp*K-7^sk8L~7$&DJ4DdnsF#hTG#nj zm=r>&$MOu5g_ER3CIGx~RZzLq(h*n2f}*pnq^bQp=*4-ovA}V?T0JdRZ&HCU*DXeYF_F^dvbi`?lXfdq0T3a#&G` z^9lZbBlX@T2c_qLxy{1UqK0BtU`F{m_gv#h<67fHK)}BIPa%P{@;|x&;}WnnF2-NS z`qh0GgWIYiufuc<4vqj|v(2-mtwQC9ywd~6+gfUd+LOC zI__&E6$ToeKEK_@)cC$nf7T|wuBS4sr!P{sI1hGTz0EJT`WreiHuDS8#u4cuE=f%uh8xS4&?E(y9f_sIE_$q1au6~#_Zws zodIM$hqz%`nC+Drbry{ff-$Ij=hXRzn`USAJo8tqPRfMQKb?^|FImQB%>g0MYy!G% zXFFIe1!f&yt#%im_a;7-DSC{T>ByT=kVXjnF7pG!sfG2`R*g=?>G|F5i5XfvR<+s7 zob47;H-qO~ooe(t7)jYy5<0uE6omp%fyTEAwgoxuT3^6o88CG%u;{>&i0hn^hmmMA z)FA$ao>=SbEON?Zk{2d#-!xH}d*kJDH!Arp92Kj}Joook4P zgx%(vOQZycv=%qN-x*r-pBR+{HZ&B~dMd46W-akNR%hwYp-kQeu+m{GDRk2icu=Nq z>RUWAD@IleiWghZ#c4$PdA1I{^P|eahuLgn7s>zrQSbeg&%omb=bK<>z}A5w5I(ki z>G23msEvy*5|-k4IeyC~at-nqGff0CLyu?vM!?PIQO~tC?}+T z$&r^w()^A8@--BWv6fnWbD2hciHAphtcI~@y$1VOlw+MWV>@IXkrayM92`Jt`X<-* zEY$bmpt_g4&D?PG3AEGipQdsQ*(vY*GJAJt*U~C)3Hh!-Pk(Ek`$3Sb(}sHC1)bYY zeY*`y4UJc(nqKGQ-wtV~x4)`+tqtwAI^V{v*eeek$lBE8CKW_pYHsgQ!;RzKASZd7 zL9a|OPxeIH)Rh&WhAhDr*PLPTpOBJHba|90h#5WY88lu$0j;^69@`5y z(^jbiS@LrJum4ur8V8a<-gZ2e3v4~YdMAtDsotRM9CqojtCxq`$0ty|v&7RZ&{OeA z5#+Z$T<7!_w{Bja=m~9`u)Qttds|SnbIN%S9m&)yN;)Q^2_mO!n-yBTY{Xc-aIJn{ zg#c=I-q&CS`B&1D3PbI?R%DQL*Z!V89Qm572Zdx!~w#KugpnPCTQj8I`=VPlZ=VR_cj zV8VieCQi^W1DImqIEpF*#4y#QJ|FycE^f#v>2}|3uWr4&-6HoYtK}8S&$iEM%jGi` ziMh(n4&;UM=9sV7h$|BWLs)=B$j7w1zZm+v&&ygpbFM7Wc5s%QF87L5H|K;q+$Pfn zrZdkubgG7>j-}34vW85*x{=4yJf~+021N_4V(1~R>uSF8q^i(l zGVqE~4fAO8NfZ$koug~~8*`&Z8s2(t=IvM_FIBb2+9Zu%`eEgCOf3h2z;&W%> z_X@aw;tegtHzgz3=Cy6a!is+3e$I_;e3WSLBjn${!5M|aRK?}4%Ng_RtC&l^ZDC$o z>>Du|u6Ayp;r>(u@U4DF1Rf32nJk9;_f%XqeTuvoIT4-h!L|B}`bIblz<|ZQ#n%Ds z=)xoYjS)ZZ{!dNn>eMO0+H1UsK6l{W1CbM=im~+qR%i?6?FwK?mwJ;#Wh9zzjpRh> za4#Foiawc*>D8{1j#0>LO`vkCy{9v@J9j2lf^N`p)^B9N_ElMDDxbmm#xvvbvl1l< zX|IChaw;UPdw^}=g&6Y^^+0k<1;TF~8oScFFO#zZ=Cu`*0jt8}73RHy^AJR!G`QD= zigxCd(tSRzbMOm?l6PC+Fc`JyiLa-eb~7$(!$&NCudvvXS1#Aq>CJsiPT=QUe`1!a z1(L3rxL(vX@}cVOI81QGuoZ{>&rX9ln|#?)&ai=WnL(=VBQR|^loQ~0;Jo;OVbTaY zs>M0i^T}-^Ak&F3$0HHpI=h%l=?lgOZrEcRv!H_YMDS;=Ti5D8*f-a2M6+MXt*qZO zJeB&_fXvrQ-YdHIO0x7vJA!;Qr#j)Y$YgUGbek6gu|hGFv)dWA?+?oztI}1?@m|r( zG*1c8p@Lb%dC)&bzWKui?ywAp`BJ+hjNe$RJ#}|)4z-6AGfvf>I&^Vxc8_RXd(&Kz zId6ownE>%6#fwkl>$pk|&)YGGbU->2Ev?|gFD3|gPY6trBsp%=-?uzIK5YG@moH}9 z;h57Vt2B=_{4Q87<*b)pFbep=B6LA<_hI-d}74 zPZtYZ4nL~x-u=4>9)4PG37yqHng4#reT)z9Hd?-U@3{3R{PTqzr}ns-8~o(pRmTJI zk_cK_;ok9^^~~VgCdKQvlYemjYx|1w(G}b?uhn6b`Dr+S9v&4Gli)+C$;xdi*-4#1TtndaJqCWX|o%hCKT36l2 z-r1dAs;sv3`MfT526`Sc+)}!>R2#Yr<(>d9kC~Qy(Wk+Ar*KvKpc<5yChP{&3oSOG zg4qlsjtlhG_u4c?b!ukXhaCf*l7`_%!@r+c8FWb7!=XkquiB0-3zY8JzsY`%uJcl9 zDcV9kzYBD`$E4jybT%V>z1VqMPrKQ8*h*XZ^7PcNVQo%(m1iGu`7uS#6Gsv+u%5T} zTUT%XUY)hV3=HYth6XB08Z}g@rwPAQmnTXH6k$=4%SGX=;`9z$KlY@oaOlO)n*X)^ zDLU_n-+9xu{gLw!e$3qKFj(nR#&#frJm9>yXWU)3$yCu zf?X37T9!JqtLB$*qH3dax76{foxRrm5R50y{!bV@PvV_u!*P6sEjD#l9^LQut-ApXpWeUO?B0|^U)R9E9O}{hRK>hbBtO-H zP|ZEJTRs2iDafZDtlFK2BND}rUCgRS0WtQN$xLX_>?_;p2cx(CUw5K;M&Z5psCFtv zX0x2kV0}WeV$mXIAK1LN5**o8{gKik;-hg*;T9Kiv#qh0!Z<)+KZ_c-N(EJ4lM5(ogxaTs=w_0_8ZXf8R~p zleOw2om{2HN@t)IFZ=bZ<@#os0QV=zkd8Iff8&Yk_1EWxc&EaPcUX#pN}^pQX~5J#|L= zUPOOFe_XiqJuwh24K9|hEN)zTjm#*zzcy^2FJ@g^W;;v1lV4l9+uZLedGyns?}cjR z<$Rnki_PA8{2BB<^#Feyr?;|e1wKDIFeV(O@OOD!ZZ~1wTFGuJW7O1WVt-I>GnbBh zsvmNHhCW@p7C&pgYc^6SeUzTFGwgWm)BtbEZbz!oC`E-WqzkKs7lBf73F}8be9qh} zE31jy=RQA0;}rv!YSOnfS#||y3%C02yW-Jk6sziZ>upBap}b=$>1>CPH>G;thgQ$g ze4?K_UKU;$=O>;nQMWFWY;F4C$?FUQu(|<&G>wLJ&>araAqUT1G%~sr?E6<9^qsIf4H~QPmI%Oy6kHcJd{r4`L zo6`l)%+jx#uHzSujJM|_pVG})Dwchp@LSuuot7J5z3VRSR;NGtLd<{tPG{orzBJ8o z3cdW<|8CXZJK|tVZZyusCz*e(eyg|b0`2>1Z(sU?YIp2%ownaBjka9!>Qwi7s&>;R zU-?>nqu5p5^D1^pf3rSuWZRUJHa<83gKQeKF1mBO)I;dKQ{=ik8b9rL>1Fq zlj02qq})hghhO{-9Xo%%b0~7s%&F=~_8k)78WaGmxu*4MO>UNBoYke;2~y1Q`v~xa z&#a^iz#5*L$`8xp97WH~2#|u|TWXkSKd75VNuWFWmog(b-;CBcKe+Gp-XzVve`4$;pCA~Z>SdG%O>0KAZ9M66|tz}vXl>si@ z*g~H!(Je^dmLMo1Z2C@9ah9C)A7HFqCMz8)ayM5z7}07#hH`tW$Aumh;_i*p`iC-t z-VS=ZTdigY&K)uOjs6qGWBk~(8qL)U9icAn(e5qhQf~eEeEwz=C{tg0t)IL961(Sq zYdRhq-Q{ngi=}YDQ*YDk+5}DbfJ#_kAy}!FIy^qMGO&Q)kHSjF@jQuxRP2-BV%27M ziM5!V&$o_>489J%IsWr5^2KnWd~tf2y0yo>ES_GKqwc3#TaHnm3Glk6_##_v1+|-d z=fSaY9egv*(FzQ>75PVKXCB^~sKP5xPUD13L9pnZlhUddasv7-A!pQzd)_4OpZcv*ftYn@5zwmI$7kn1f2@GOpA6Jd~F^Ha0T+g`EG zTj!&s?8~nA_eU%=B_N1-CkiW7@i+?%B&!82C`CL$08PqJfy=Z)ZaqU)R!mF))u!&H zs1~x~2gm}nwuAT#?&Qt9<+FJ{uG<&UiZz;a@L2*W9OWr_O)gF}Qx47OpWmJ8AMG$3 zg767JImGvgiCgwGey=jF53MP`3Nz@?fX$a72!)m4%u|2;=7RjPN0LhD@ESmVsy(5Uyf@D090 z-z=`yF5auwPM!2gVX!MQBlNjmEnYU?&U9hw^zfvf+TJd6#}^FLGuMh0I!Y*Wf+JQr z73t(3#ijYyv2X6MS4;Uxsy{xo`SRfx@+scN!J9~x^wD#kIQJ3qBWO(RJRRms_igT2yjWrC%=P?!DWmayD4Er)m7R`MP71awhTgA3?ODamcg-ub9TZIR8{ zXoKgqNg0iAEkH6+pBQRPwpESFsW#uQ4rwHGzvH(jAezF+ZIC{mow1UWTl=GjR!R;xCn3F%&yDP+RQ~P|4YR$oh{F6WPN_1cP(2rgbFxu)yS@cFAT_9 zEq<$nbR{C%g;+S2PYHZ{h+zX(BiiN%$A6}qeh3U1NhX?y?>&oLtZ>w)B3bBz5h+G9 z0n7blGI(xdO66@e^j~j?`p!?KI2T_oyn=v0^-4@U95uc1J%RG}(^r;zn=8*@SbXlR z;S4^240$y>G3KKpqiio#73dTtP%eL5iPeYAy^J(33DZ1CZQ>(k#X1dSOQJ+$$v__; zhx=Y3BqW}D;eB8u1?cWax%Yih>`PZp;m(&zGyGb89(T2$TW$@F866*^(H}iEPe-xe zqfMhf52kF27~tV>NHmm-w$@rtwmKq-$l;={n5tEm(0YrP_@QNm2o;4%><{}R#_xBP z<|a5JQ-cE{A=idEIbs~uskQTZQhQLaVI7Iql2s zR#2-z=Bk9^9;SOoJZ8o>9u3E|LRk`^rZD&6Rw+I~aA+Rf+^jiU@?kzMSeS4iXu{ex zOzJXh!MF&2lg=$8xn_t>ggZS`EN;xtBK$NXR5UmH?R={MoOfrVZ-4F^-(vQPMq1}T zjXcy2A04?U&%}FG=)HZr+R@bOjF&C8@<6J^4#R;<-JEKH{cMGyn;Kl{1%__=FvIA# zi#ShPQMl}4pVb~5*g|Xhit*K62~KgAEYk2t@26X8t#j|MFDR+BE@Jcs=dB_%BGb=W zTTD0t+&HU=tgH4u+aA|+u}eCm&$S1haZBR(!P&KH zQb?`lV|^KtnQh^Gf|QIH4*oKTRo(db~CfZQ+yU!|W!>I>NV?~mvI#%1 zZM?ieFO5RE5}3d{?xvJQDSpjiE?KV~=R1C#`<^d($&|-B*Y`3TGnCF85Od9pMKL7O zkKOKzT}W)8y;aUxjas&Bf^^pVAO!r=GHj)%8=xOldo_N2#24YM;KOitdGS;Ys@(b4 zlK!E6i5618cU;M5;yW1 z?m?p%g$tvJ+1wfI7VpKMeXV<1dZxYfxY|LSJ?I=d9ra5fB>N@l&bMz~yQVk0O@S-< zOD-$zP3a(=)Mufs=rqwXf&LZ#map!0U-Y@;7iUXXOUVm; zW&IC7D#ndKCb(-0zy1<&ifJ1x>(KL6px@`5P3SWt zkzdfnX2g`x;*&`=f?G&*t0XVL!+7b6MJRK^;%Wg|Q1jA3W$VyvRO}I)LPL^eyXhX4 zrARoUTj;N@rq{n^kk6)&HF$;qqTG0HE~Z#vo%zSGVKj*1OrU46$XlZIP)%6F9buem zL(ngwh!h*@gmS_>ihIEe>BKdCy7hV2AV!5@;Vqm(s#$r|a^^(vtO{B5Mg{p4o;s0f zZ`a`q+(YNYyNcZS-LJnH2uNxKr`?Gv-HD3bnL-l7&z}0{l&VIeXwqCrJ0f>!!T?Ns5L@&~VU-9@f z8y;i)zwX`Ra|jQ@iDyvnjmPMKlLQ7lp(nilA^%mIR#731@+p&&QU)xT2eB2!fzvpF zvMD8OhiV4#-+8$f0%2)Y#F9;kq#KgLpHDofOL7V36p|AB|GR{IO&ah$7&aQ2rX`JB z{S1k*iX;yf42bv3hC|H2Bcvqo&w^k_^jRh$uZA1aeWt}bXJ${c&|o$S4CAZ2#HAIR zHW1o0XsUy9AlJgD{lJdsxj<6Z7m3%O6@&7^1m>p7CNf(1lu&dkD&taG!X5&jOLb`@l44Ds*G~cHf z68X(7QY6WrZeGe@bissjtD{a{CC-m9dILwPQ4d?bujky&$&5$oBG2%q%8 zS>w%E(U18;*)vK4#RhFai#n*a3UQ}F*nJXapN=L-z7nxZ131y~f>aS)1OLbFOVE`WArHqyK(WS<1NmEX<5x3b! zv`0PKOcMpch@M+Xw+4n@tX>;&p*{kYU=f?drvwslHQM_-h!f;mXY2As+pE)y<@|FE^jF0n9ove6JPtMF=N4VMU>jLWLqQbtBU2Csyb!Y zxukmy(Z}!B^tb@-?!_FY==rtT)D4F!Ia5 z;TAgHmgK{+X}v`>`-N^{zu=pLcw4u~FTbe=eEI|Z+N){o)qbIO9Tf);#SS|sS64|z zi?w=cskW@Bt&FsiwzrINA&K3ogo?z^Q%|#;ilmjb)mY6|?ntDaj7u|Ev*b%jIipBF-C^z>9N^qa~nqPd+<8Tq?5gsW;_)|Z<9MY_Zan5zwUck zT(nkuut_|*`mSg&%V`Gw*sb*hU78dJ8;9yyg|~jh@8_(qf%B4tf3B?wU)IQ$kvk4v z%G%xFzz9c$sSR5o3xbmTp3_trx}1%al_sTmT$4f;w&BoM==n55$0ozaCM8*0n(yoF zDijQEruVwPj+2woC`3i4bNF}~`ijFP%qc3YZ5`&H5~>cm+7*{XEl^K_h}A&s;)hKe zgxN9FmDhD{#vRv5+P<;O=?SJM?li;NDPcXh9&Ob_Up4P`)HsBl|o0 zhe8^?Q=&aZt5DNIykx6#&8szrG{?rpE8;{8Na3z$hs+=zN*Z~Sk|Qd0yiW>VXotAU z-s9RPkerS4#d^xb%bDj*;U{3hd|2Yd0ZNkij<@pj&JMcp89L34_nQ7z7ex9`1Rl9O zi8uK{=GieRrV%@M#l>>)vKmgJM%n0*DPeYyqK(17%UsjT_=FUUke_CU&D!_2g?a;L zEee{M`BvtC)E& zcwHxiW-WVN5^MJWE|)Q`OZfB?m~M2gKalD%&RjJSqSnYuGss&ev$~ z2{a+o;zU#EL`o7*GfYV5xIBsyvuL<-7`*6(!R=!%4vG_6A9xS6@3O1t`=O4vchc={ z?)dv&Nv={+%qmz#PeNH?8=8C3MPlF7aBNb2F8OVdDPZ#tKMaJg>>`$)!S#TYju5f!+@01P_wRAhg(>F@?4^C{_pyL zLv4XgQ}NHRm&Z*8+ujyH%S-3RF8lfBt{AT2gp~*(oR;V$RVqQE)f}=~(HK#frc& zh@O!kS|VZGxZSj#CQlhP^SUGj9Kq=YAO-45+vaFw)DsHWfu8eLo=SL+)!mM9kywe@jA`(CexM(7qb&v zkSNmU6KhSy7Ii^W@?Nn!tQJ}%H}O{lswlJwR$@~jXt5Me_aYq$^ir|-8ce&MQte@s zcZ=f^#SJrVn{>~$OO|DLobCEBw}QJrZTl!W*4!wo{ecJ(p+NoytO()|f|VNhYHv=hPKwl7}F?^y9L$-^35)UKfuD8tqI|djX@xdek z6$@fbOa^H7SsPGY&<>tT8Nk(T^9Mg8b((L8xRsiztr0EaXSmKa`Q6y;_9tAMR3S`Q zP{@9oZ;1YPT`%V8^2PH`6Y_$cvd4TK;a^AWhWAzjy6dvn3GclcaLawC3)yqo_n#sL zPTw$ueLb+sYQP1zf-YpmWfGUU89k%?SSkENxpEFFa|Nh4PM>0SgO0r_WcqSIBllRf zoCmDQW`I58p!KJYMX|0s<)e94-erkUfeCb zLI+e5JxFn+;5l)rH%35$Xr57g90Q=nHvRFPhR>(itoG?BIj1urD3Qp}^F~Tu_dK13 z&!PCV`bnl3c@6q%fKT;pE1KQs3NEi2xJgq;9`wuthz~BW6!=L)C>HHMp-CedBkrdF z0Ab$nm%OrJ^1HiX)EBKWzt!E<8c{y|?0n7Z;5;lq6(l0htrMVxg6Db9o0@Y%4z*bp zYO@9M{9G69x#jg24`o*29GaSMx!A13kXADa#IrdJAfSx$=7YS3(1@Yq$ctNIsOhLc}i4?$47jYH>kn>O} zMfA8BVbkEIgg%`DJo^5`?RtCj!_x|WKzs8;(}LxIe8cd<@dh@S-M{1BaTqY&@z(vi zrW-w#?vpCg7wcA)=mn{Q&;wr~^rL(DfjxKW^W1~mlijm1Ai0CD!*a)11F;5g0Z#6d z%Y#{iQvvk~@aY5I!@PsOqf&tU0&V-X1gh>|*~hlWeMe&t`Udxg*9N@>Qq@P$m)mFK zo+aV%SLhTY`31Jlo~CL8X0my}vYJlJ1(bFcX0mbMp{kCT=3i>nFpyDIM@~~U4l}Kt z??JMx9{1t$Zf9?lo)G^mlwEA^@qgY(LH3RRdU05s{o#&-JOYgc zV)0KG1Xh4T1s*>8QOpCQ1iyLdlF#4n1(u#K8H8OG8sQ1T@I`w+3f~>1+4l;YKK|iB|K?Y&`^Z(~lfC%{nB|9SS#@Hz)l zH3<14g?p8<5$0;Cr-05<6=3~^^Pnija$`Zr1gY#_c|TAuzToVqi))ExAJ5q(h6!iH z&W`AXs^qn1gfNm;nL6V|ePhzCL>9e&(_|T+FvvY+oaSL`?1l53NGo==0*GeKq99(%}b)>U%+*IZvBbyFr_+4FHSQ{G0M^W|J#Z4qC3)q zZC@3>Y5tdo+e3D(eH1wK6&CH88iah1 zkqSaO`0c?vsu$Y~NChPu4`|)E0&8XVMxDxJ%txK_WcEg!(qzm>oZ@8mhMmG>%!i%) zGDuv&VSfb!)PI4c^)YpVdMJ=jHa5Llre8nJdlDG6%l5cE=^tmpd!fy>yiF`d5K=Pb z<%FD7-z!l|*?5(PX&GBcE0$6s%l?snFKpipFn|y}NAR1nx2je>mGpQ&iLJ6bA8{sR zo2LDKL1YHJZl-?3{J=IcQkjUAtg7JjC9AHFN9=n2?WBV)+v}?%`xCok*3}dLRYqOB zHP+f-uQt|N?>R(V8}#qhShcpAOb;FC%79OU>Uq@)eHbUQi4GWVJl#l`Nj3oOBl#o7BRkH}(^sfS ziG{qQ$s54Ov=G}(u6PBaR%}^v_NE+dMPzDmvg0!sC#bZjQ&HF4w)b_NA*sb!raFd2 z>n5#@JP4>o?((6Ut8vGL977FLUid9$q9?UYWvjaP*#VPvj@B_93o`@3`8}y3FN@iZq2m zpB%;MiR=PKJ{y95kZngXwvbr2gHAXA>n7{v7VF|x?luXxc-PXPO}gh-Ju_++5Xz-w z3NLdgFA8~dzzB)qZ|nb?&O6p*(lGlZhecS*Jgav4rkV_9{S^`4`QN_5cYBKT zcSv6ew-$l8_wS%j5#k1{AKw#1b_2l0Nf>c_|B@i{nXn>%r!s!eSOWET>VG3%gTGiH zvzhKAdWxa4GtU>H|0~%2_TqbaoFDuf`MsGr9KZ27w*LgyUzz?H^yOZr*BpgE{ya56 z9+98#{`%L9|9_B;nP7PWe((G1e~{yV3Ay`s`1IaWshR@uJ1BB*%=}L7()&IFdy=8_@vYsz@ASk$N#NtU+i&;8{+}ev%^Zp> zBh^Kr))rH0wn2hN(qcsjrg||E4N57_^7SLt7s)TeQYcC|L}buZ`~_|?aRCXW1*E?% zy5Ah*x7(a?VFUzSS6~e%!!x8ED>+dHwMgE<*O~wTzk=B#ul0nmb0elgbM$wAv8FmnmBnS8l zo^c%;y(dCl3kQ6Er@8Ss_FAHS&t&0?L7)}qk$H=}mp%BBNU2@Tu5@PuZK(z&g}X0#xcKtN$-T{9 z07k~?#-(^hdVkB8zhT8#O(5#2(|<7EYRY-vgY|>#v(CdzA2NQ_xqUz|2@X({Bnr@v z92rrMqso>RIZOKGFt!P6TwI)CWS@;0WyD~2O*r#ciL)x7qaEVq=&^3uv2v)Oi>^r{ zWzJG(5Vbokjyyt(+FqLbrpFR={rdYYe%LRO`{XZNy^U<~i=xhY3X0{<@$RB7jatS< zdAGwt5Zi>|l$de;v<@+12(=;iPJgz;LObs|u1V}~eE@*=?iVkJ`E8G4V>c}6j0~&9 z`BP(ON;xQSag}_-RS`s>CWJzd@rU`HG3TR$!iPWQZb=O0xWEV#A`;DENsNE=GAx9_ zHB1bp`L8bCyM7l*1Ttf@LBsOq+r{yJ59t3T^nZ-*uTB5X2g`xJStPuo5|R!BR3@^e z?w1X0F8y=df6edrymB1=9CQY*O4JrDuK5Nh?2slWs27M4RcD_O_@~q?g{vOAMGe#; ziz@F2CURDx45`NXkB-`Y)LlW8yGv@EFl7ZX)x5#!TghGj8YMu<5y zx5>j-Ok&e%9pc4oYyTxS2rEn4mXZGUk11qpw1?@5*yYTX_}0BF*DGElTq=BiM0(gq z+$X6=wh>+huso6+3i$|YD=<7_6;4r{vx0BpG*u^N7OMxkj4Q^^-jrkvG*!l*3@d(( z$*(oPykUIdyzw+OYZ#tdz$&M4ox2$jXY{|jQEfRyMHSI+cvO9{%vOIAK0FFXTv)&? zFAtw<81TPl+q?49>N6VT6VVxbNhWcgvqiR{yR&<$FO1sjig372>|5-3%Inf2Q&{+1 zULIL~t@yO84)$m#!0yZk%;g`nKt`#~RmWL$|o% zwjAeSo$*RKTa)t@7mi-h=0Zu_uO%Ogt2or6%d8^njxY%hXuRg0RHx=0y87__)erAJ z=T!5}doIwxTZ+!=?B3XTE=+K%NXY8?R#ZW&sS}hR`OYN{6>`H6fGd6)j8ezVtri2} zkE1^V-fOljs{5d|KazNp0S`K(V;0lpBd*c6d3l}?_4A(Va#Rmn+}hPM@&(dCBPA0y znZK@7pht@f3iuv>8>h15-E_gWE#Htcahw%J=|0()xNTl^K~c!x6< z!R^}zS_h>O#a8*Mk9EtIkLu$ZoSrYZ&(&94C$C=-I(Ncnnp4u{i@p zHVqYc1XX{LxnBxwod1n7X{f+qp!>x!Ao!0gAco*=a*|)`2sK;;1Fl%r%x4*Y!K#rMVxbX zuaV2Z-u=1U3ZRQ&K@8BMVA6RB0(I^r^!ySoHJDhwh$&JobqU=3B5v8o;IeKaiO5`L z`w}?Z3=EdCo8y68VfzxK**TgrDf+ZSqNjlp zTwH1>Rrzw~Ki>B}litG7P1HqE6)~YAC_9evF=+|%j!k?$eXCvA31@iE(De56^@}d=SyoJf{@%EBqGqlAa)j573 zVLH5ahB&^Et#tZcEr>D+D-Lj(lA72ARqzhi5|zW%TE91AK^4q@HngArw%^Gp;oq_q zf{7U682Qs&+zYW#R;W-ays5iF64ZYMQw23h)4#z?^~z7k1h359Kf+;@AM{ zbEkp^nJ+!zh_8s45s7U=>WQXs@s8-r=_7%RJ8T9jN_$ZSAUtdxS!QPQax7$(1-h;8_(M_km-r5Qp=R*>1|e3W$$HG$Cu;=SNre?+QCJW23r`Ust#a}Cz(TM zgx?;7bT9^MsqtO;DQIg=$iW`-`SWlj{I>LDM-e`5ztKJ{o5k%%>$CL zgE*yc9E5_>N3wxzz}Og!z$KoJA>+QN~0_NbBRo7Qj=itII9& zsvL^{NZ?%aZT-glMIE;pMxYtytrSc>kf53R`Rzz`1M^ix2bBdYs_fhc{k6LHP4&JD z=1qO$jrv(X@U8qWkwEo64+c?1@uh^RIv?n%VNZcPXc?_ z3ygTVi(~V=d3Z!Os!LivWSRAMH-)XX+)$-!FAG$sy41d=aZ75(o7Sat&0Ps}!0grC zcgbB2w8d=I9d^lG3Y5eo)(vqYn*Lv8GLRqhQD@&VcjAANR-Ju^+_6A8v`#mYJvZ72hY=eNH1d{{K^BU$8fe*e$+)_p$@RSLCLqKYfj=mhr690 zTHBmV^P5MjC;w?h;CW(P?S0%3-Emv9z<;|mr1$iv$Wml7ear>Q+B)V!aHkrU7Se;c zREkMvoNW?I%6*#B(PKfR6OX=lhB_ccp#ugl#6QJysu?b~76`+mMT*z)O zjcR*=9Z!Celvsi@C)g9dQaw1-qv_1~n)qXkF&hIjJh}hVMi?@ewtGoZ{0=>@gz8`@m%!o!PfERFaE z0l`^Gxt3S^RL#t~UHwKRJ7-v5ETRNI?t}gIzmZPh#~NN_*$p;j_iBrM_WHebrh29z zn+U_t#y=sAfmq>v8n}aABHjXPA8i@tx0ZUE8+$Z9Z!JO^Tk=$J~BIZi7)UpFu@p9?_$logC&?@3gx z`{RVHKKi1aqU8n5wmQc<)+G^(9CBmhb*V4-DvZYBZnr0u*M)(3szN4vUn1&anCx&V zmTvJlJj)lc0VCc(u3(-4MU+~o;D1BSD!Tgn&lbOYdHdPJ_9Bo4G<9k{qO!=`A2NMGyPb~BcC4cl z8eGw4jjv!Cp-1P!P6XzguX*3aWCJx@Z<6fk1lKr~WTX7l#1bTq2$Q#t+x1VS*RA(R2WJn<$nR?5VZt=Sm?jQh+O>eKb|2f36f%= z{}tF`%gB}HM5R<=3PsBjBok3em59;FloXlgN%K^t0;EC}5w4}Q1G zqDE{8@=UKl;<#ZojMRo^-oP>Ce?mIYorT_RaA&;v*-0m>cZcdffESresyuYsGOr#d zx!B$v=D$D~fIP&^?=Pq#OS1~y)yiwZ_#GHlQb}%URi_Gdg4ld!v4m-%eu0%3#3^px zb?jFDW1(h2reW{i`TG#U?avYfZ3MA@Vqn3l@pr8Ff^R${!7IxsE85c-q>xX5AW+Y2F(2NaKF_=2X zS%+h;_P0o5Zw6tEX@0yJp_@??&f)?bqzC;Rz;5F-#vJOf_?PiNBW$^hn=)#&K|kq+ zdMt1=2H!y^(!U&NpH`#rLyZL=IB3lEkh&rhkhR@OV870?qStehSQ3tY1!zDPB9Eb>NCINc2RY&T`s# z&T^I&^X$fYmRl|D3w`DTX5Za%#oI1xW_-UWHCAVb)nYy zb#+0TjW3nve=L5lIIvrpT7=gzW4k)V!?!nMyx6b7&Xgn@VT$@6lsO;tGorA=Cw8*x zL!axo_+&iuPl`yRGt8pV&g z8ZN^s9W6q?6*I=U&5Y23>ztM^2X%F|Vqlv!7F!%zr{yhammVEnUYf$8z-0F`R(Dok z&-6&t^3%?b`Co60PW!Dy3|F0cZP*#^$#s@AHTuCU+CVcJko7=nC1)MFdE@2}wT#8E ze~H;!Z^TZ=N)pE{_%ox6t%-HcH0DQYgLZgZO;H!x!C=}z1DdU7xwkjpffdj^d}YSe zI{fQ`APs``+?(+)izRf)1;kX>0kP}$pofAlH_o#Q#kxlum8w}4a2Mp2amoEbEq%RcrxgZq&{wEOV$qcy1a%Fw%^ZQC) z`3?3h3!Uu6#z-eCl7CouvFMTjqDdMZ6U^Gu zu&m9dgCI^*G#YbiOYGVWnNRQE=?U9YN%;kTd9b7V32(y5KptTid#_#wKJ7H0ThKC1 za|iPk8oFlMV=qFjxUvHBkQlzi$`9mnKK8mHv)i9P@Y5HKSv;-HqQ{SGQu)~GlFhse z4U^8z#5n6lOg(pU@$ehLS;7F_Jvf{pr>?p{qUx?sx)Jn3`Xb4BW0N}oxYm!R=ARYC zc}GJeE}n3nJ0ZKOd(N!RJ<+-(E3gPsG+p^Y_-gZ=7>*J=c%+p4}82TcQHyYT9QRt2fvUFuj`)(k<5>hq^mh4 znJ=4{gSaZwB36_pwG0)di!C8TX%NjzlAJ{eeHX`mUNf(rh|nk4`rYDshh2TzDp6ON!^wX{6C>F8T9tF!p49wQ zOx}jO+Bm0}Xa%UNYeRVX5>^JEr0lpauQCfmb;9yorS?VLl-q!zEe;=6ZQ6KAlPCJw z*aLw8ox(P|?=4l&Hr#{$%m?LUWFO6mnj79*&8hgZ_5IkcfVfrE=P{l*FWm`Ee>VHE zAcEWBl}1Qcxy+oq*naTmI(nTcFGriD8eT=3sk!*#T&?9)jKw{H4qZ8d+89cYrKV3_ z3Sn5NcSQnOh_&A^`JZrGt2Cbtpa^mC`*+x^Zl+E$C_w2c({O5w00%3jjwim7J{`!6xymV7H z0HZPfwW@?)`A5~Z3V14cPfgie28Ex@R(L#T+Oxq9y}-SGJkQhDEzIi|@hDpoi6$V$ zy4`H5N$?rR;e`3@9`on^Z!!#>Z_u4~n8m1-b=Pmp`)K*dH*L)^#;R{k8ZW^eW1Rka zl|iUesAhaSkLP5azLI|{~_rq8K?JSM_QGr-JBN62z=2i zx9A7J2aivDqu$at6i%P}QH{RmXrWJpeX!rNIMv&BWgCrpG^2jJP`<`_`kJ{l&U{~? zpw7gatDk3k#~Bj8QuiOPn2YvdI`$c>f>mtH)Xm1YsU zXTrUc%v?PZ`~14|1Ja!yXW-6)Wo?4xz-iC_d?OMF5dO)mK)znxNExxV>WE_ z`E;uBN>5t>=Vt0orijNW1`7!%W)TS|;bK@7zhx8_FW!PspKH4;TA1SM=ciMi&yn*i znc3U4GcAYRa}I~p1kSq_pFq6)Ce9+NO|Js*EEZ>Cm~rGE zIL;reeVxbdIjK|Ze9hkSIm;gRx>ZGSJ)C;lWD{|ze`RMA5m8{d_dsi^tbW;;99JTmv`P#o3E{eGv_vu=^#rExTsofr8@?K2-!O5GYTqQ7+I6~%@qHY=j&{7L0S zpUOjw?&SBK4UY8~FHw}i!vT;uJtyUW;uto}DSly>$VvWSwOlj&^=@MV`(=ttliEq3 z=nI_pz~fqVY_fQAbLa`hrWDb@=hO#cQjAg>?d!Y8lCudO8C-gYe&F*pYH=9L{#@!a zE-?sMA0s&Is()eDbv3Mfpk@>20^Y21eS43TDJnZY^+}IG4tafN4~|Lkt>H!1h`Bl| zud7eSyK9lsL9vumKOr1y0B}*FK~0aA_^k7T>rN9GT7n{Af+&E@palEO!*WpGZ?y@} zq*k%Jx4dbd7yI)3{>m|;6Icjy?e_p?N`|b5rHh4SYY&_SGKBRH5z`fo#K483SV)Sj z&_9j6ZX$3=BB0EeX8k~Q9W~x&+N5`{;FVjUlaHea#lA#y52H*pA7<&7ac_K%YgXSK z^J3E0BdbQa8~Nf8M;XsCmOk)uiQyjZCWtXYtVmxxOl1_+E&)Pw+@a-?{*in)_B8NO zlYVSK#GxvK24fUz$A8n1OP?MsoK&DUE=h+tX}Hj#MT0s!aU#qoNgzQ0Wj!7l8(Ds2 zZ`*Mbs#a}2tau03A<<2|lT;t2(W#IoE3tamqeh8+R2(_BE2ayH%^@=)bkC&D8l!=k zerwbH!Rq1jh2L?^S-9#Y*n_W|>Q_qdi?nA+TQs}jafiB+WbJK?8m+Ii0vL89^4rBm z@E>49-{7!wziysPc25!!1EXN^D86EI z(>b*Q5HiuZr7I9K32^AvV0Dp3F)uR6xTHn3LDLz9n+se=j`QK`+x5HkVYeCjd(Yxd z+txo8DN(qz;i=fMxWol6e3`oMYtJJU2O%y$Z3*WKBCvECdWl3a4r0S@rw$4m*R(Hw zk07fZ*06jpPQjGLT($%EUWapACx5;q(Qpf5i|iriqV^(8$E4k?orr+xFtWiR6qzmW z@(YO>>&V&X@j;J=gegn6OYHn{Kz!o`&z9?@X8zcI98Ki-pqZwrmqQGZ52f%W&M+1t z)B^70o4+uz#8;$42Jp^i!3;nJW8QW|jLJH%%fR~c{%aE@DO{#A_`@#=QQD6?V392u zrXi|wh&4-(90G%2+&N&6*@_`rdn#o_LN89ioZ`GfnNBDT6FjpTXG(V&UsmID@*e2~ z_6`pByrxDb0G2uH;ng9C4=sY$8++xg_@fj)*65g_0#}YTRgv^l4O0sy0*mrG)QCx7 z{ic^l?jczDM+G$7hL?=MLS7ww`l>jIVUqrZ9V9MM9lGc^31|?=A*ERyA-QjWV;iWV zXuJa*=b^Bmv_9Q1+q7eG$;u?BuCg9$KFTuSrmLu1PE&TYJ$Gpd>}U_FI|k=ci$Y&d zT#s8v;TQ%wWTa3Ija_VtyJxn`t&ma-LmS1l3#}2t>_lFQ1M8{=$&W0LF?1tW%gSqr zbtBQoEF98Oi0zV_!b=@mGvw&plG~+M#1mZ*(G5#!3yIs+*QCWts2dM1`P~W7bIX=b zr=6EqTW#AU7Hn8bmUopg`AG@#=vC&HJ1&tQLKsUoXqm!sY^m5bjW3xj`-gV6W|ccBXXn z?;B76vN{IF4_Iu{X1Eeb+?oQZoS!)Qf0pizr%|gP+2pT@-!y))(=J}+dvSUA-0@Pm z_Lb2_{DAM0q~m02S$>wC^tw?$RFjv@sbmddZW;CFmbL@W`!3??6k4~eN&VpDeXW}6 zCXN+d?wixeaSxtAo*$EV9y}s;=0_*E9l8o-S#Ke0^fSvl9#08tONG1j*twP+-g`?{c2I{lYZabF zpdZ*}O+$w#BOW}$b`qd8=hKpmDG$%sHNC1P^`n!fpIOO{s})aXpwSjZJG-f63lGoY zHIT|Gh-zl}`x^bMwzM71?ftEaar8-zr#0f*5IfZRjq>_!>v|LE+S-EJ>2*hC@UbJ0 zJ;5>(KYo3(TJKzEWAKqp)*61}kjpuLlgRb0WCx#7^a+y(kBnXPnlX=#UG&nP%f9{! zezn?9uId%RA}VAS(bN^r(O&Jv-ub1tK;l&=R8%Xkh=ki3?BZS;~1LY(XE{W zp?(fiZ4mb2?PQKO;SpL3{gY=`Vnn{B5AHKQ{L)>W&6~nx*5~?abMLt>wtMg8E58>! zUV4B&{8E)QPYxxZ?|n;Xp{E&Zp8fkAHvdLqfB>km#T?>fXYpn4mGQm*0i(DM+CR#vO<=W#I&wDYln$xER2mPgn8@J--t0 zc`3?8@T3*>MA%fJH77WPoX>C@p)l6}guz%*!3==!Uo1a@yN zO;OaYh-rrZ=BPc)8>cKAuVdYx6atuXe51Q>>_t|vIEE^LJS)h|UcB243?^49 z!y5{`DA}Qo_VigH#hVA51aS`7oiG!93mc!$$K9Yi!5I3+-fN5g@fEzfPkyubg8Ug} z%};;GZtLz`?wRQo?rd=V*BQ7x=_fxV;*_FN@g-#5)RxE{L42|AtgeKNu(IK5QsPks&5H`X@t5l zP{UAYU`h}V{z1M5y!n4jnkWzhC;@1a2nC4D;F`YHg84!&geg43pSNMdz{UK{{8j{K zgs2FOkq}AU_yHelAt3x`g>VSnC+(5$|Cs(zBgE($!!iu94TFQ|0QKNoHqHR!9?ghd;P{2mJc- zZh48EgKx%-AHP5YR{V;9(rJU00Gy^Giv_U)oj%$I%N@&qV z4QnLN3@d+B5l}sCa20?CF(0}$kkxOfA1&sE+%Q@B~;j`v<^eKR8{wcum-uL5lZg_+urO48?HV0~Y=piP&S zqlNph;DSiUh5W45@(u)%jq{@SQ6D2ZbE@GYd|5t0jtF+yf_cI)1z;1yDMH2*4I-IK zcE>{6+bsqLM8Sdz$dLXCD*tj6iLRynj)q9HShI@e@JqcX-tx zZ-3VCkm4uFj%OJDz3xQVF_C_JhY7($6fU7a%*(dt<%wOByNKNlMkA{A)rY7r-zH#Z z>dBhvakWF}KALGk$$oS*fZEolW2HK#W3}KVm>3F*u`t0Q2U}Q!czRBJy`OLM!bjG9vU?Jnq(K~}-$xeea_Vi&d#j@f=8I%DK;m(RY8s^y6X?{Im;jAdX_Jq?CT}& zNelvP+dnJmoJSBK_jbd=JyLZdy`br*OcFUUBKHO`_K5n5H1;+mB#4EubyEg*6Eq00Gp4!grM!H3;f$X%fS3hYS*0ZGX#{)L=!B z6+}x5X`f_e1q;mMWc@6btHBCIMrc|PM4sD1i4Rmnfe}KEN%SjbGp-@rkHw;eeXRUM z6I9lMl7{VqmB!@)p9V4iVI0Ntk8v1J@Npc^kK>S@kT$HhAJgdO5yufE9sekMk)Iqi z(EnZ?gF-4N%-@aX?}g-*y#r@G*so&`G&lzeTExYm_?7%3%aaH({u+;vBM+}NuGkQS) z%PAZc69NGg)kaX8kW};5X$%T}GgLtU<|zc#hX0eG)cwZS7?js$fdbJ#@c*DKZGD%2gw#h<7X0}yFM8?Spr9_M$9h~rM zQ%4dSALO4P*^f#@7MFXP0#=aPB7wPOv8;Mca!hBt<)j`OXHC zg{3OG)di(0dew!bwl`ZeaF8tV3;LNIunYQOa$ewqSVeHg0-m_>Xa0Dv3RV9t-6zfk zC#LCJ^+Oj@ zz=(uXdJ-B4Y4;C5OoN-%(9Y&xDsWK?j+cJADMV?eZl-eE;XbCjH=}Dl&|j8{QCaAu zNbKg4Gpx?h@`BH>m1jpW{seV-y>9aBje;OZD(2SEUZ)iy|0T&q`U73bH^Rz zxhH1vC+2q)dSd?a#GL1yD)dx~bTZak&k#P@Nh|fl9PeUMLfVZ9u1O8PK=NKRi;*va zSo@pd%6I5()yHDYMYuhuzQYaYkBd@QM?klmJjaC-hKrG=J(~6G@09Aj@|qrWMeXsM zGbgBxFwxGpHfAls7Zg z9B3Ely;S^`IrrPA#7gI@Y_MjSNsc6nr{`jOro4}Sj+CJU>ftQETI2S|NMB-+!q4xF z>q?0HAdoRw2u*CA;3&c{hYY2asacT!Dp;Q>wZu1)THUk~Eh}|va zfGhW$wx1XvZxxDFAkN}x1GCTMBSIq?&$j~m2g}`gxD=>G$bOnxht(Qr*UD1Wm3{{Z z)%egVX|lZ~(ZuKUgP(=h!~`cdF=z)*zc!Zi0>eV1qkfe|-Z-i`-d@$aFtIeUGS+Csu9fwn*;Bqf~H$p&A$OVdJzaY&*WRv)+t- zw(H6RiNYdQ}Z9q$LH zCf_*d@l?2C)l#owoN&jTC2W#=GH4$a7>lT2IIlRKGP$jFZ9P!!gcZ7mgpr`%$%|nQQjmTH9>??VX94fC9%3fXv3XRv zWfpuw&lM+hh8_jsWZ$;tOx}*g7^Z`O;=#4$VP)H1k><3L@1_ znLG{sZ*&vOK$jmy4X%`(F^oTdmfNup!o^0j7p_Vl zsNca9+4xeWaTpz>aXfC^GrFUkLU>}aUE8UJy*8^_gIUftxmVmc;y(=z_o><)LVoswQs4HJOYu-I5 z9B0Oz2Uc7OZFvyLo^>QIq472pw5Cg^QylLoT8d=B>ZhkL>@~VH8|%4muv+%pSkK45 z-)lvSo^+Tj8ptQjP?E(lrPY2QtDg|}TI{YXosjM9ZcE3Xd$3UN(EU)mpLl?-PK~EH z5{y^3Ai6r)akQzP>b(aEQdoB` zFMsjLCg&H!k=vFkd~q?L(Ea(-w$4Bn_^C!;Gw)FOZP4;LF6gPhng9!)Vy^#{HEng0 zq%a}DV6(>lnZ`(g^cicLw~Gx!NSsod2z-knJq`oq1%K9|*#KVL6#c7XQH2h*m1$AM zHvVe_Q@j%lzC|7XfivUFWijuH8g3)qdzE0`hiNL$o$w({n{^(;(`|mkBt!6>mvNNU z5@3R3ta7YKbljkTj?r6DIs z+{%=8p;8g-i8V*ohw)1q2J7=vP%AF^*0IzA2w$Luy?WIhu}uxsp5(rHvBV)P9zI-L zepAo7DbV?J&FJ2dE81mm?p5ixSEO2(vhpl4pynfr&H5-B-l?oHb>9bZ zdoS8}LRs~5(fp!OACpP*gd&xw+`|?Z=W)f+T|9rW;D$-FE)-r7c1woqbr zkuFM~MR}HmV@xqt9@n&pCTq1K_v^sHK}oU1lMcgv(;6!%gHd=wmB#I`?n|}H%KHkp zBiyGNNeJ=)N!L7&7x7o<%uuK@vn6^uIk?3kDzlRkhR+KmsCVwE7srPTC;aB>fUI!d z#xL$QGMt813QS~slOi_~Pc-Shw`B4r_1st}_uGf(?_L$O91Z*^FYK58g1O=L^NX(o@R(*Ab%? zuEIk%yA>gdD$HbR7Jd9GYYLhA14y+ey3%{e)muD%pMB^*2>%o-J|EMdL?M;bATmh%%CH&QfaP zeYF&CjaRi8T}LO^Rj~z{#m602vN?HN{rO2guW_{bwi)(Roj|g$1g;CpE@EGXypm^& z*SwTk%oYcW0;%uskqwv<(?*< zhri*c-bIQwK#)H6RSpyEEQ2F^DP+lHu|nP8@>pKF2wewO$t1si3&VgPl{mje0;g?( zhr3?zG!?Fa2!~6`f?i&kbxSB!4KPjlQV{A}6PlXnTPjx2A{6ok5a8>cVwzGKh|TkZ zb@tir*Uv=M*Wq+vqCWdG|N!fu?K{wqBmB%_vrMqf_Q1uYh+#}5;1 zwD((W!3?2^0?xg%!VrQK*q)EOp8(iKc7~rs=-VeNzuvE@t4`#!2WW_{O19~0oxNtU z^RKeTRRrNHs8|Lryi=c8lX2i((uiW{qLvQE0br*2{ zdl@C)wdz{6DiMd4Tje^4+1gF9pBStcUF9%+Fx_(W`e*B%sv`%73UZ-tFj^;SQ-@by zNdvZ0((Cg03)M=?tuv=FxEyZ*i6cE)dHGGDL1k$nx^G@&Z|w`Q%jCh1PwHr2Tts)z zblyHx;w9UkNcQ|3|1lH`_gwS7n0&G$4DqJkHTz?sn6<3JM5>v+Nu;q|cU7fGnDdG^ z0v;|;{Nw279-fAJmK&9C!|bmw_dBkd+@}%WyvJAtwpMz-B+Mr9-4DW;>sBgS+TAIz zs|ZX-RADMz6r?ov2W?ZE<|@fAZ^nv@2Xip^sK25J7^NNUQTreVwziuU2?*nPz?v>( zEH7P}%z~ZFB`VqC2akOuZClTr@c5}2f;vUWped&UZs4X3`vCsSH6Tcp@N zX{PijwQacYkdOY{>v`#pc;3nmK0M<$LDl&@rHE&vHO*gqtt8_tc`(^lJ3$%7kRf$} zo$HeX71u)Ngcj2!E;JwK6F!HdJj-E+_n=OAVov=%H{lx=W8I^gWXepqwbb`}0(mvQ)$wCM_wGkaAN4OJ?=YlsEr$ZH15GY*LEBeQ%LN<6E{Uz zHEqUpRR2S^27fI6D3E$WOSjK-F-kpIsvv+tPM=4_%4NW;NgzvH-p*ouUwwSmuB5ra zO2xelFc9gioMuMJoFz`q&vc7NWIWrT-T&k;{?lKGLmoR0x-H*xV(3;&o+jzck?Z|p zx)&nF3az_@VoE~K9Fx_WKr;m`&_-+2r72by#aXPPptYf~nx7wwO;u~oIL`J9^<8Jg zjZo78hkmD%R>!aT_Cxo@KD$NL%1<7(vsSsA=|=ffh>kXJqq5{2`1MalUJXI@m1R}K zbuxB~38ioIj?u9R2s1ivooAm?J8A`*_rmO6!WzP@qRX%9{n4Ee zbtb18X6fs3?7nhUQdjGIsdG}_4o8|x#cQ=q_e*xNgwj=YZMx!X5a`wmKemvAXKgKd zAmo=E9U?2;<(pS*3;qSQ&PA{8Xzf9qz`UedOxd%z384tXtg$W#IV}7BA!(18lvg7yA1Vj1UOhGGA3NJ?msd-#n1D%(?dk!I znQWYll8Kzz+#YMIYaS`Fwte4uy&$NOciqcfO>9;P9-@8myQ%VOkj~KpU zhD1NDX|ckK37Cfr3^ibA#|PZL>z#LVVf6d1!_6i5BzG#>)izS@_ zwi4kPx*y>!jN5%dp5Q}9wl1-|>-1g5ZTlsi`GRT|FZ!rlwPMIW4QXhxZDF8q3=%<9hSY zcrEP^G*6&tLY-?l`gs0U8%z;j+8q$_Xng6V9B zJiB^SYR4uZS)gpv-Mz3lXobrvVS^4=XigU$RuUVZ9S~7+=358P`&C~wvK}>MDc+FW=cr#sma^+{QFK*5 zxJfNj{~jBu`nhSDhoUqk)0T>AF)po)=~r5H>(dtJ_>ZRa_4j|&?(0oH@DgcW46uaX zP{Ew)S1$m>DR`@}?(3ghGCMCGKRnO8Y`P5YcgeG-Ei zn&O0FD(E3F1VJ=XuPBHyshM7}bJ3Oo;vFqiSGNsI+U307{mAdr2iE^MHY{V);J%;6oLIH_!G^u(vkq(!$L=hQkjsVQJJUVBy;n~EB>J!4 zl~wI}JA7DS zTVB)R=HxXU3a&Pvk*(VX*DUsI^J}wTX5QYp;pZ zRA0}X;mPFxH8d?RHKe+7WV+>p`$fH)?rt?@owZ@>P8YvA7W(V$%jdK^zQIGC0nY`umxqmrr=l@9^bLEEi31>g| zINrs%<9m~fu74PJBiHh4+18kOpFAvhx$v9kLWUpq>YHxqGvFYfkn+{k%}cuNyF2~b ztz*mD+}U(%@8+tI2glF2eA|6=oX2N(-aQ$U7My5Z`ObPvm!6jf2Hx@{%_dcjzQ?*8 zZ{BoFL};h`lgfVCk`U;$^6OnUcf@(+Bvl{!{K~FtpWd6ASTVC=-^3gK$H&Ij`FuBS zr^wDP4=f@CUclcGn>t?n@lv!L^+X9c$kTCt9+u# z9};1eubA;LQsmF5u)lipT~J~A?>zoE3l(7|VPWzikF;7$x~|DH5EIwAd@dhcGclsc z@|YfG;#@ab7&Ylk=CtT0VWvhUWp#y>*PlldCS4wHoYQJCYA!7Dr)GIpLQR}J`fe3Q zfc7*&sfp;sL>V)2E3rSf>QvT3KFqQVd7SZJM7JMLt+KZAXGUI&X0d-ao^!&DR?%fO zWfQz^dfoKrW+s0$vr(|wXjb`e{eORISbNIHk5a{^|UW zBltgS;6Jx1l@+nyy1u?X!`_}^^9c>HMfwblo?(->0QDIuZ)X!T$=lc`BrYydzA&3Y zd|ru-jFZ>6{<(jcuOQ4{>*wE31e%2iU|K)M{QUj=`}tYTG@zgE*XO^^AqxnMj!Cp7 z_yop;C))gN6XGV?e1dJUZzM*UG-fvU>Eq)3_??&Z0YCRv&awvXMK!;@%Cebj^y;N0 z+jqLPPHXi_>I*}nJNIh5=J{TqEIr!){Js|dESq_K<$+sAW`1avhoVS|$+`=xGfxL|o} zR@c__ZbV-CBIm$n1>dI(Ij-#T@_k1F6qdwtYSASQi5NsITB%3V)wh?>_WDmyYNv&VK15!8eQ zHHyht7M1pSNxQHKo-tV>DrwNQHyH;l$nDWe* ztGnMU>{B)WT4~#R;mNg!o~z0jYiZGFjovKKtNq-ARqxcf&v`lC-Ra7d>_eueg^S%& z)=gpaBi!d#xM%0}&;BYZI6pM|@D59}q6xl(4rN#xcdcmkLFOs*vl}P46(1U9X<2zW zCb;lzOWWn)&Ks`G3O?L$#lj}>u00FAb6SloPdIj{^@@y9Ic{HQjn0kl`9t}nV?}@Y zTmH11Hd#}8FT3pYx59xruD7m4UP=jz_lzy-kkj(5^4LqMH+~wOX?x-N*?Tq5EUW0Z z^jx{KZ`zGc-M4KFs&VgF)H2D^^KbL9~Cu8a@|&8+n+MBrd^+W&!m=d<&*cP zzE#t)tfF&Jo*&9IBV{V~*^SfVr)gAiy zc9Y}^ulr%|{=Rx?g+^TWL%f*>>0T0(EM>lzp zWq(qi{*&i(_38C5KU^*Ir$-z4A7yjhUVpf@pzf2lMtXhz_aC43QMSb=nx@!K>$;~t z|AVZ;fMBEa^kKWSyUXKC9#!K>=|@89ODPL{NE*v(%i2EdlzB4OsQi1apJaP{whe(b zYm90LH-P$L?+fUbNgF~fdVNrjC zy7Xl33u9}2LhO;t!er!;kAK>!K9a{TWjhWzSvAhy+_K(#je`15to51XZZ9b0eC{{4 zp~ds+u6AwSeOq3@w{?AgPkAx4!SEej&ie6TK`y8BFTCLO*3~UrXBD6En{Ya?!|8zD zr-SY+y!eb~L}!*?_=4Az1>3vr_HW4oXw3ZMI~uN9*YLtR@6qAicNLy3b-K9L<-*zy z)AOd6cI-7isCr(rQjgx-yH7uStt!2DN#mIjK8b;C6AQ{p8+}{S;a)`F>P2OiXL_G( z(&&n*HZQL#>t*vZ4@$h=DIeTEZLXz#(D)Wk75$s$X_j^`YfTSpZu0N8tuwcoFr|HA zd1!V~jio`?%l;qCTN3X)s33a9oKu=>Ww={${wRy*lK5uD1;c{#*awT6#6P>CB4W(E z?(vO#7T9vy(p7mc#(OMVw);xv{DOor*7ff-eV8-e|MLN#vX6(AL<|ooNRAH6^@QD@ zqy$@}i?dmB!Q{6`U&LY(oKtQxe)Q-|lVBKMrr0NG8sSPBk-ZPce4I$`pFWmZWDiA2 zvnc1|W}}nv^s$_p)qIp&lzd#q;drdBOR%3lpG8yaC%agV`DC<|IUK7I3v-M^(=AF} zG>ax2+l3IJImSkal{&UF(S__|JzZxaJBAYTr{a)l7B$VP)Q?!q$~7VuqSTpKICrcw zB}DdqpDtIvB3AW&k?p74L$a%_rpZ32Uk5@^Py=Wy(_FilFviG^bumWhN*aj63gVD61M0DA9CG?X$)_1(e}{54vl@qHR^!mj zY8;yMS3RE^hi1$jDCMegXl4+H2I9~_92$s2194~|4h_U1ZB*(k`#x$Kh(mg=82jT#pYru02c&-^UPmZwx&o$YXQuBd0jQKR> zd>{@A;sBn@$q4m)z;g|Ft^vB!4S23` za6N$Mnw*nV+5mX2$-caj4|uKt&o$t=20Yh*=Nj1hJlBkwT*rGC zc&-_9tx7&{UjffG9mD}Vm!lF;2Dl!;b2)lZj|HA=fteWL4fDP ztX>ZSJSV_&0z4>oIz6J1)dW*=b`2U*8_M?fae5wPJrhG zcus)l1b9w>=LC38fae5wPJrhGcus)la$-ttKj1k5o)h3X0iGN4L&`M*o)h4?oaj=I z1)dY&IRTy%;5h-F69Mik;JNYPqY@kNoB+>_&rQ{1!Sw*+a{@ePJ!nXcus-m6nIX7=M;EOf#(!>PJ!nXcus-m z6pYU)@SFnA<;=I*roeLwJg2~OO4RoU1)fvjIR&0m;5h}JQ{XuTo>SmC1)fvjIR&0m zFg~Zia|%4Cz;g;br@(V#O^fng0G?CeIR&0m;5h}JQ{XuTp4->pIP?iA@SFnADe#;E z&nfWS_`FPM7vMPso>SmC1)fvjxv{WEDHnK7f#(!>PJ!nXcus-m6nIX7=M;?3De#;E z&nfVng7G;8o>SmC1)fvjIR&0mFg~Zia|%4CV0=!2=M;EOf#(!>PJ!nXcus-m_BCma z?<3$j1)fvjIR&0m;JIAeq}f#)1}&VlC~ zc+P?69C*%w=Nx#>f#)1}&VlC~c+P?6_B{*^eLZ81q2up54m{_;bGdH;9IKAcIq=+A zW2ly^{@#^~7S(*fa}GS`z;k0QqEasKoCD7}@SFqBIq;kV&pGg%1J60|oCD7}@SFqB zIq;kV&pGg%1J60|oCDA0t*5p<@SFqBjWw0ZbpxJr;5i4LbKp4#o^#+i2cC1_IR~C| z;5i4LbKp4#o^#+i2cC1_IR~C|;JLA*N@;uGIR~C|;5i4LbKp4#o^#+i2cC1_IR~C| z;5i4LbKp4#o^#+i2c8@IzLYivo^#+i2cC1_IR~C|;5i4L3*fnZtCoWw0(dU>)+wW2WH3*fl`o(tf)0Gqejfad~u zE`a9(crJkF0(dTf=K^>xfad~uE`a9(crJkF0(dTf=K^>xfamf$s@D>DE`a9(crJkF z0(dTf=K^>x|3I2rKj66lo(tf)0G$!;7UGqK2ZSA1@K$|&js*Y0M7;RTmaAQo24D=3_KUW zb7SYb@_Q0^t^?0?Fh19T=Q{9Q2cGM|a~*iDgYmfz#^*ZlTnC=(z;hjVt^?0?;JFSw z*Ma9c@LUI;>%emzc&-D_b>O)U#^*ZlTnC=(z;n41&EX!Bvq;j_r}wML86H{Zr_-!* znUUN}Z+t!3-)JTB;HT5%;&GYkm?k#?I_%HWAHXfC*q{WQmNx%L`QT zum=H!4V?|G?aY7*hGrlq0L$}jC7_I&Mw&#pLvo-O?0ixSAm&c)Ff}~Y@MHPiZKITy8skp0dT!o2a2%*nEy~H z#s*;KeEHvVa}9YTOOWx4grv>$_%SmBo`3(irQm31tPFD220ljsr~-0#{-cS|9|z$- z4w5hK0A)cY7KTE0?%L0yOaOK+c1Bhfz&kc(MlKdz!1Hj~IzPMP1b7`Aptz%*i~X~~ z*WkTg0F{9%j)t~Q_AhQ5djN%%fg&JR3uBOyxX`n96+NmJJ03?)xL!`>68WsoQ(e&!9o!3sBBcew49>DwtEnv0tKH+^_c5Io>73c1*aGMuQ zG&p>mo+8&2M6Y0X5wZSt&%_eX!RbG}y@^o|^C&1?6R5n4RC)}rI^m)S*EA!yT!+Bjy z1&#ox7tBhX#`Y}$oS`Ea2H>Df~B&CZB$pSKc{42Ni~Et_G!jGvl`gC0W_qJnAfn=RR!JQ3ZeX+DDq zA!;6&p3FQzFuE_hX0h+&q{B9QLM0mej9Qavfq-ZX$`*Lq7O@T$q}G z8w6F7HGahq%{+<+vJ2JNY-g60%@KN`ePP39jSjqA#ytYQ`S(pU##?mhYn6z%n{WB6 zdn60I4i!E9e%!?u8`)DvttFSz{y?r zMRZ0!&qwmnJ*t_mnK&_40nF7E`^_6_{W1iH!LEp=xtMv{3iBHJhmcQ{?nmO8M~?`I zu(uQe)$qRgT6F^=#{T2rZr8?ReQ~L;jQy zGu(ykGi}feAo@%OF_ON>tCwG`n9@BCPidPpZ)ea(v6HIH4cMXRlXr(s2SLSlv+r%O zs2yw^AG%6lCOvC5g>K5j33MwnePoqDtaI!YBmNR!%FT{s6Uka<7=$hR7}fO#w0) zxKK-NB{HKnQ5F_X4cqT{yL$MZA|hzP2~qw{kevhG)l422!yfk;apJow-|&WQpvoam)!@DJs><`yFjTjth-;(pBe(G^+s$hB#s`@eLz` zb*#tP)a~;@Oy0;hQ$jq4s2)*VLWW@++P@y=5X80hd!SPgB-rA1leaKdY&{tfzUlDjeN|^+m z>ip$qBV&out8L7{IsJ>A~6Re;Fc9H8a}L~g6)(R^iB_(ZN_xSmvuqTQ@G1?#|=X(b}xR|7Obgq z5fZD2ror!8?G@$zo;x92auz1)qo^p3aCnvcHE>scgW$)vO}TYpbqV{=y8vkDmbSWN z6dVK71h4Njac05!$OhN7p&=&zlN!Kwn zy-9)m^dqi@3%-{wN2-Cua*$tzR$8^!7ZcBpw5;LHRwWphfAXUSkno)H zw=-Z#Ow`2xVEr|7^dhgVl8uM)=sg_JAme~72P+q z+>KVsN3w3T0Q)(;6@A~_H?}|*m`yDL%l>g(S_h6L8DYot4Uws1&Fx;B9I($4H2?)> z?>r}P{kg=aK)1!#0BMih(;)lOO~~$%Z#vt+0IRS))vA(0sgUjA%E9yy zo1Z}b0R7`fv~ucMB+-f3H(G*L!P{`!8Ab@dD;x=&Rn?YB@RL^$#!MHf@RM_islATP zFslY(s@IG2;U|23S%*B}Kb#_)dIuxgt|7_3&ywFdv4mg#cATvcmDB*V>cMqHj9A3( z9x@M@b5wmIew)k@i^(p>Q}89XB)G!I(S6fa772YjRN$4bnWR-I146?FTItaJ;Uj%|Zx^ij7foCv2}*jVlDXzSSzHMQQCVBTM^ax4;-?0cXLt6wV46WlUvt z{IqDf!i?hP^dn3d53!3iO~(q$K99T1x9YL&z6u|yLBy!~d<2en^6mj!xa zd~46jpizy-byPvg%1H`FR_AvI;O7K#F2{NM8gWpn;bVfu1KVgF8wdfWaLqso+&ji++ zAgK!@-s1Rl=QvZgVvoSVlkWOL{)~(dBD~FDm^WkLcf~H?mrt<_qXi*f8iywwA${K@ zZkctYfys}+o^cjq@X4!uy!J`^AO2^u3`yoPk z=lZ-ErW*}un5ZdN;ks6v&;a-lYYESI4Ldde_XXF@gYyo-#muLo^{fy0DN!z@4#_R- zqP0WwWj~zjoNfG`s*Z6C1MC!CS@uFU@D{}N-UgYL$d&js*{^#jat>aBoEV`!y9S%P zqjQ;K8?WXcw;^|O?RZZ!V;cx|EOvMq8oo%owQvjxU@-a$LnEZ2KEiFh?|p>tyb5f@ zo-4~P_svQTVr7vYpS9q+s%8CowWwMvwr}*ypb2?$s=2A0%sJ75y{uG=4X&|B{1A~m z*e7?e8aV7oG_@q}bu2&dy9(fTLKmSUdO0L{FBt#vl*TxKRJ}Yj!eGpjjk&0xWO3|k zPU2j=o1=Z(a9sdFNq}5xs#T}~({B6SM;S$0LiL9Ja4az~ptlrMYN4#V+x|OyUs?k@ zl!8Sbfny?AG2}sQbs`=dMPYq`Fzxx${r8va=_h={7qmx=Cq%rSt(mIOp>fz8ev?;f z21FF^vYC8ERz&K?W-59DvL_^or2H1cv@+r=2LwGrr%;`1g(L??V!3d zS`inXHHYS4!C_$#Ksg&@QS8uS9dY5teV8&O2|eo0NBSXT?JJ{TVpkY@B$l)LjP7(z8)%5M~IhDYzXlPG6^XIh^g{iyUmh**$Y|&AT#Q-K#EXt>_e_?Zdi_kpSS_{4J zEY>D;$m@wl;da@D%`#&i#Q)S>H6wcRtJC2CM@xJ3cjUGFVL@|+m3A1H347*D5aEwF z>sAg%8?eQL<=ScC`2>$f@!|R@Rkkc&8oycr;d3X>sh8cg4azvRL!0y9XavpHY zCM}K`zzsLTUzd#ci5;Vs^Hy_@r%L*ASC!cc;|rSEZFd}-4Ekk_gAIi^=d5ksS=pM{ zj9wmESHaG^a4*0ci*WT~#))QryRtS%zc2GJRPj=*=@0+0s>Qv#!sk!0wKBkQ4z1b8 zm^M?DY7xxOVK9(W%4|LuY6&xAD?bG(O2=RuM`cDV#Qa29k4DHo*)g%D?E*9R`OR-g z0b4A?S2E^L#QrBQ^Fn+4iT7V=g#X}0fI_lBIXg!iLu;V1A%OX>B*65hsz{14&OrhCJfGo_+pGhqacA%iE*=xT5>>Tf&xiR-YE?8LDIbW@+|Dz=n z6HwzHQY`FD&-4t)M(tVTwT;j#8N|TO&IEWd@XR+o|9RH^%m%%T&@)E^VtMxZl{)*Y z*DoyA-@N`;ffW|~dthJqt-lHVSAk{ucY*yMjw$mioA*Bw)K}u|ukO8y{->_~Uq|(Y z&HCRGP^P~Il<6JoUjzC~kNvBFGW{)}9DfFsorU#Z1oR)Y;y)SGS2po)9{+=J{Er9k zm3RE(L3o}f%)mb`HY;R}``X?O-6tZx3QUEy$+u7LL*}lx?cROC;JwLwxmIGvYHt`aXKR;32GmbMft?@;1hiNdi;L%WZd~(hLS}4e&AXLaj zf}wzW!H$y9v|s7qs3lhela$gZD{~lBKhHH-C@=5leVih5g(#c~+|MJgB;=WxUJZ+0 zlzdz5cFZ?s#-VX#eKfG{LYbbKz2CdOc6-&$`a3iAu}%&kkdkp15;9ZgxJnDRII>zh zYhAmkCfF0WaH!kriEN7nWv!z6+w*eK;pP5RAF2%SgUvd4uT>id(p(jSb1$j3TTIT3 zd~S@Ns>wso!0@c$Okk$_Emg`BpWICMGKJ5YXZm=^i#EC9i;D*5mmW~l(2;%DXAqw0 z)+(y3d^|)#F8r|6i;RHn?-Xu$Tf2dY^d<7)HsPC3#5wLp~Xkg52w6Ty5 zPam0dxHuEU_0!3ya;gs_;rReXAGo5VJ3`}R+}z|fJ-C2yxeUU>jO6;qj;)`f9?-g= zLmK0YIFjyCF{=Fw4aXMn9RgL2Fo5dWj$KESks$EJrmT0*|d9xKab}%K6Ekr zYgvix{j=S9;O1%TZ4CKJcDVTXfz>tV*+XK@D-7#53lU;BXZ_R0p`Sh(014n>+&|p@ zY`gPZ)Yj3`a{pHIj;v$?EQ3zJx27v9xqn3s>%0Cm*jWq&@!kFX#n0<-7(YqykYHV} ztDc^xFQ1hS{PZWYDoZO}P*Iy3G@y&i@QW*7KdUS0wZ+ z7;oVi1THfeTNkO}8%U;k@g3#8MZA8nGKt@Py4?=5`}0j4x48yl8tG|bNPxVhOCYnK z1k+>r0v)N6E&#^BM&I!yFG$*t7^6SW%5T1SH)xL!XRxLOd<=2>)6S{h+i@`B4|Q>M zgj*rf81(sA{(fldH4s+vylDkz`MJgJS@>N3N632{Mr1ebQ#G7&bS))Cs`r>+%9giV z&3m7YDXMQ2hwgBdV)1Fz704^KAa{57mhf?C za#+V8KeK{up88^N`4N76yrAe^XcSQr#fgytX9<6c+;j1;ET23*)cR=vQ=5GW#;-J~ zmOqN1ADK9E{;|Ra(ero#Cp<7DfYid}Em&5_glZ0_$~N;#b~XxR55suFR1psu3hTr{ zC-Thtf!GJJnc@ggZV&fBXHAS;M*}afDrAanvJk_3^+l%=r1j)zo1rI* z_5FCn?Ncevvhy$|GMc(Z!Oe13MnPxt4?hFF>@HEiEz3jl}Y{^yV9743?|%g)I0!-`aLnx(FtSh~#g2$>FwFABayL*nh#i z9wfQ@m6p@57^G;~7UhH^8xC%}^L;2NyoYUgs>kbh2$sR__o>jgL*Ch&r;&#!(3@;$rnQ&{ z`|$KL=>~o9h*^M1v_nNJxzQ#{Q8fQ~D0J_?vz#AqXc~jfxAI8+;(GY@*}SpA0?cbx zdgEX>VmPCy*v|vpKS?oVk;Q$IYuR1;D~ENLv_S=i+O8NKCOvo-dOt#hXm3r&^{Bgs zzS+Q4ZM}m_QcuGttorLB&B`5Q79SXiw*lR-x-rtkkd^X5>+@6ZFhwhM;?eKQJR#vC zs*kw}+FNsVTm?c=3f83K3k6ki%gUl~l7qU+)}9^3iol@38~+_ZnEH0!dZjRrY2bX(_Z zh4zbP)0C?_;_TWN(21Q@2B|OFvfvG@fF+GO=KyFL72VqQZX|YKXKi67C#d~E-qKch z9@yDyA-F>WdPK5H9-J)bg5Y;~Mfao8P6bZPBmq3NVzXe!OPnZOcxcV=lMN}jQe1S@Oq;0 zr1+KG1HI20)OQIKm;Rp2K0_6zf0x1jchE%A@iS8{RN~j0iSOwdpJDKl||7%fI>X zSD+~GXaaJ4#%$Dont3h_Py(4*Jg0&l)Pm0o{-Bpy0T+9FYmm)LV)?ff=2t8KDK7u) z#%q%N|35tTS|{+I-2RW;{Uwg#ReS_~)bYD)HwS{x40!S1W&NdL=9V z{w(~vN%;R=`1o2?^EZ!QDscXvsgL=8t19LhNWawQyjH^eFPFvqjq!Tb{O9QXdrZvs zOvL;h6L)HlJFbYKKi9>a`i+K3grUKt^iC#8t2R*#Pf$i-(7Dbnb19ID)QZHSz)NX% zPIY}%+uJr9kqkYqHalY_2UmF02rGp-H9NaDd+}>BBBS4JqTVd@eV4b>(T%wHMEFkf z#FpD>BCFQXDZE)j_rf*d28MsW(q6C}X>jtp3+oT3+bfTJ2fN~=ANVJSaRM(0BC-x{ zHy>E=xwBE^&GdbFcptBmkIvQ%*s@T5o?Cm~_eR}%1N-`g= znKfCJPT|F#zE@~6AYYi}+}9IsM0MU7Gw_M`O)WgX@1cyxL>y(D%2YenIs5&B-y4R?=Fp|W~&QQw%W&zha1EkPFIf+m)Z-k?tfef(<=*=C!FzgnqFU` zoF1@=-E`h6m)OBylfxv<#0&N#d7{55(xV?UeG~gLz_O4~Q(^`Saz zrLj|H5U25D-;n!klsfwZYv&2U>JcF|(r<9fYHam!4Jm7ans+=@j|%BV<~PnUW6!8- zw3Q#;`7z#7@XoI^(!@_GUpZ%c1;JK-yGY9rx#Dj}LdDd5-$qMf)`ya2eiUUPji>Io z+HgHV@vs@0IC<`*#=XY%yJO(3?wj`BC|$-Ry|-@ucP9kZ$SZE#iY3%b7RaQz)x4#j zBIwRdI%q<^mY_|4r1umMK@1!SSD(6Phk(7Oh^r=f+SXtJpGq0w>kDKi0`y!Q{xW!y zm{!_?c2GB1`bqX#q(_^kDoV{ zlk?GP=Gb(t1u++_1sbha_tV|_nu;H$rkjf7DSth13f!FPLGt;6=WEwau zJDf-nZaUV`O6V&7``Zm@W0`DByduV9E zRG@2=P8b!p@GT>f8Fb#Lz!dA7DP`~+$R_`g@1qjYgH|h=BeEsmj^HBr!Dan??Y=oN zh-`6^VBG4J&9J#Z0Ha3v8%W@lfWPR_69E<2Y{B$T%Lp+pLMYTD5NSIEPU6%~x+@JZZwE~>BeQ)+XnMQ-`qs-){%UvyX-5qZF4Y(bt zgD&;ETq{vLHsQ9weHIF$g{AC2r6eGSz_ER3IrEYPC)%@EypK12&=k{jHKE`!&{I96 znJ=2Cwhd*s2&A-7-^J*4eds&B5iNyU$K3M~`QhW5sb6>TCBrb=0FbU<*M*V!MaQ&e z@H0UotPiEW#YhIfw61wjr!~U0{*P^W?UUQfsHf2(TT5yb=N*91Ixb1oN48V9|}ag;KE!;bPAn>lmi{fLgNRY`(R&P-eAU4(2>HmXB^vXTmEa{D$&|v7 zMcV^KgMHDp1|CT~rgh-i!t7@fK47b^7bIE(9LGEvAICzzlqcrZ@iWHc9#oGx^uW84 z(3A5~N{?41wWSGul9ePr@VW&ff^5S}^CZvuIHezR*SLN#YIF>5{1o_i|uSEt> zUphglwYG3@Rumiz?$H-Kp+g~e`R-cXQ)=YS>@mz2wU*HxgInLA_#FA&9v)4$xgwIy zsx=Qq2X*7%cg`8H4t|&A@}*zw&F>G~cE;u)MsMF4Q=ECeEGvA|8n;0UEee3zv41_J-;#n99g2&RR}LPci7D zSI{1t;dh5XA(AKX%3e*}DFP>Fg%n)XpM*tKM{H$W_}ax5`oT1N45QeklHT8)W_$7~ zuT(d_ZLr0Y`ys_Mn0+c4sg<;=&kX}#W{L0PCPaKYh!w3l*w^A^%CXbHbY2}ie9*uI z&!ajNWqkU}F}6e6+Ql^_F>)KXn@;mR70TX8$8a)h#r|F1^fE%f93l^du4}sBZavlq zM$x_zrCzmo1y9`KA#%^(GUm7)pMH;aw+X4P*yt3|L#uql^jpQ||G>=5CYBZVx9GwbZr|B#TYOc5UnxqJ})vZR~(ItX+rm zHS_T@%>jE?$G2=%uL#Ue$lS z^=dN5BKw9839mqI&AiNx*sdw%oWYP3aX`)~$Q{b}GuO2jv_S8V)UhiVP;Q&_W@3aP zDSWAtCN>0AsW1mf{xIIkQf>(}(aUge^+v-XyCqG?ls$io#P|+JSUP$Ei|oR+HJ`CH zGG0km{}b}1c3#^w^ct3dL(@q8_h3!9Dsz^D6jl~~s$KOZ0wUK9TKQG-$t}88cr}qv zm(7gptQ*Ncs0XSCt`qa*y~(q;4i$6GG=4Ns-X=rDzEhgRcyHqPJNUFap^JDx1a0bo z3oh)(T&#gBxW+WqelJky?a!I(;CGg@)zBQA{&EtMqUMJSTOT7!n(A@{zkNP_i@UOo zI}yMp9$MDpS5`dh1kjoSTU6}JtX*!A*B!yJj`Vgh)QH*br_-naE0i63cH7Jn>XXQ=qB(*?9v?I z&6cSfahAZN^KUMA{3z39Vt^BjQwt+Zv`3xUx;c?9h?n>&rb_HGW_}UnBUeSOG{Q0# z%r*=~s@kZ7qIN z4;HrPh4o0zUN14V+uCH^;k%I}YIAg7p;Rmm1l929#g?td@!B6>Wm(*Rmpz-rLx=$; zt~hc}(F)hl3@YRvAZmxGO(FJ2>Xkd4bAlR0gfQn18i_|aF{M)Xo_3tA&1->Em#CB^6yX{O=S<+?G$Hx|w> zY6KD^pTP7u@0A#hIbdb2&6%)8I0=}$@=)edxzHE-R>v%vnGjto+q2x5-jQPFUoCgo zG)bh}kf?wV8D{n2QtrmU5w+nY9&C7i=j&_ga6;Zy**K-EHCtbadQX z?G0NtTM6nbsaLh0EYfv$@D0n5@@iLTBpmGeBv)MFL7A~C)hBj`*$kNjVika8R!`a| zl}zjw{dHN%&J~v~AQv+^$Z_Ec-&}DJAfZAKt~OcyEi*PJS(cA=OFF|*Gtk8jZhz45 zd>clS(~Y2xixDSv*JP_h_`19G(1^h)uV*8z=)41b0aq!#iG&GNwxB_qlC1uyjIW~U zI(;j}BDQ*dh0Uk63B%VQihFf6@t_|Rr1=X^oETyX|Iu^N6@XTfaBA~)aBE^RD8FjI zDUDywMVnBpuM+6oGOWW~F~qN1RV#=uFVKhSZUaB%4ngYB`=#jk+qh=GazNIxDNDFW zZ2>tS-JRSKG6*J+4ouCQUgw)HO1paTwX&Y5PBhc-!!jtvufLn7`R#nzC_#m?Zk{#& zF4UOurlq--G7DWIU)AHP_ZM54P4On15?%;;sNKOqh8TJ}Ae~Hjf~7~NN$A`jrM-T! zTZT4+2lKcnw8nlHwYEO0bCn2X=2!2|9_xFKk6mwQ7Z=Mq{Cbz-l?xNw#F-kU^a&li z(s~Ri>NSU>uzRo+S5q_22{Esd;TLh*3)K=LN2{Q;{Zw1_YT_^MQI`m=gHLk%Jrntf zm3?K+#MMxkl{3c%&9c8#5(xfgMau7U~ll=}{Nn@`Xu)_vUnTpH2D9GZZM`G!79Rq`Y`4 zPRvq_%{Un*TMd&|1RbdP*#@o@o4ML-7l8@q;=Qh}%)Vmy1>_84zN~bUL#IjHZ^KI5 z;=lhU^V=EIOstp6+IH^Fp`ygY(A$CH`GP+}+hm>8JGz#D;>dsA-SE8<^09_s$uy8{ zE2{JJWkVxZFO`YBd9*!2&rUnD9jRJH+k|5th7&gA;TNJUho6IY{bR&~>Fo|!i*(FObz1Q>Ru8G&?2D!FWhW0+p(VZ}1 zHuJNgRQ7)V4Mrls-S;m!@Yg+5f6^AOG}r$G>GNM~h5A3e?TO_N-uizJ!Nc-bX7p9_ zpCk3}2_9As&R4O27Crox;311aCmBP1YEmk#qyOT{A(tVMt}-|QPD&C-f#3`_HTom? zO7x1k$r9)rlHt5~LWJ~@gbSdQcLhj$&pJEHx2FGL4U(t$G_$&!-{<=0aVv)RMWmDK z(+ro74<7gIkDHHNvpe~Un^62aaw#EQ_UNA<252sJ^3$uMqBGP_4Q|5gvNlY1-r{&F zE-bkx$!DMztACO2&eVInQ1-p!PoD^{$O4AXewlNL)bIRUFR8}?F~3-oBF$#)DTf3G+oNW{rPmXm#b4##o=D2 zk1);`(3&mWJfgBbcfh^k5xGCmfHQWIbmk$sIwQcO$(U3!5Tcb`svP^)!i0JlVjng( z-jB>LJ=uL6empC{TL(K;(X`~;-a_z za-guWxLS{^A*Jsa4n+|Z_BC1)gPtD2hv@hd_S+&(W4t1cem83|M}6C%FBBoLiyV&N z(q|e^XQYdUM_n*p!zY9t?Y{M(xMCZ!V2`b?91r0)1fNhtWWammAmpPP-Vde8 zDdR`sbe1>1=AZ7rK@jQmY~b6YfA_tFBLcKPZ3n}@!w{PiGIT>CnQMvLDLnB)Jqv^= zXFPXV;$BP9GjkVfuF-KdNDeQ|9=aEJw2xW{J%+_17Xt8fN{T?`0)@w0(DjGf9VN^# zP1$g+W(FWL#d|TZ+}E7VoRffD{kiSJC?L!Rniv;3l|Opj%kKfeawT#iXmSL< zOf?FIEMh)%_@1#-7kUH(TC|oJPI<}|!80!cm)g#9)IGdQ%<#!alFfmq@d-MY2d$c` z5d32@!u!26jxV^RAEnC7=nPaOE#!{8JmSukY%j#{dU(gbJ&L>r8cBoj9+YviTA z#-+G+<^^f&$j?T&oBIe+4v+-pzxU72*g{P(HTJioh-<+eqNsvvvUwywt`SE2(plmG zhxoQc@(N%~gU=_R^}O%tV<@e*63L88xQWTSeQWRn)Ajrm9zy_qf$LjK9wp(l$u!7t z6bxp`ng+*BDy@`4?YR+F&BdOBY`#)+oK&RJq?v1OI?U_7F@MUFG_hon-^8;LObAS? zJ{EguMa(k@(2Lp%j}%P=BjbAhZt&M$?)Q+Ml!<87XM|j|?R`Ciiw|2Znx)h!9&839(gc8u~L3yTiCa;Qq z3gb>lh*&}9X2A>d2}7C7aVRi#a?B{7FFRw~V^DKnlMjLUg&3!+L#ZGN-pTfe_-BV$ zq;aoC=QlmBB5jps!yJ+r23V*@PkX^P$$?dnIaIA9vnRX#O8hXqVFYiXTgLd#obr+S zyZPAWI}ZuE{Z34kgd@zk_uLLB1D(M_YxP&&F8et0i0!g1;Z zuA_&L2IR?U-Bp((bpApq+SJ!mVb?&OFrI#k8JfMP8o7h8sxRBVcNw@YP|XeovrMR; zz=hCvto9}SZBol*$H%Kw9y*3?=P*o^ZaNwPE%pz7@Y&1CZ8}x<+wa`$-zRGyuJxyM zWNca)hLeNKg;7|z#dlT#LxYvbAv;vx))>6A7o7MN0G10LZP;uakw2BEnV?|Gv|mbt z=8UVeIVhm2#@@l7bN>yadXxYH$sbO4w+k7c?MJ~m9IHLck6C(qg%h28vNete5-b!Rg$eKLK)p zCE+d3LW?Hn^H6n;mSsu|Zw`j)3Dh6m1W)ux=Sw=33l^C~Az0x#Wt`0FjnM8h(v9yK zh$y!_zo8H`$jB*Y+f6jV8`a>OqEIwY6Enf@Oz*P>TT?}r%QCSa{S@RLE>p{7deF@! zP1@jEt{KsCAFNlFR^i%qTWT3|v#H=kli*`Bll7f%8^ECzEpHV^mW86d92&VC@1Y;x2bOWkJYTZ~1}cDwxgm*Dc8D`wU+D5JBR+={JR-+Fkk9 zixc@arOTk7@ge1_o(?$rKQPRM-b7+G?QPabqM@!(!}61)ay22V#z}pJ;7Vf9gO>Ke zM!}#0;2VOb2*WjMptcoP*&N|LK1(OAn;;{}M@*OyDx#!G``fBEm$WMc)eXc%kDskz zD9IQ^=5Qn?UvtBL-F)L$+43(czJA)lG*<3AQW+GQk zosx`#m8gL9*7$cvZ$b(VJC_rrK*~8a7e}%^LJ0MC+Kq}W>IBg-JTqQ^XYR>b9;d`* zh+YT#{!y>C@sUe<;o&MrBvse$J{$fRb8qb+pEVDJ``nN#X14V=ic}o<5Ej!zWe?3} z(AnM(j1JN!dTCiw&Jjw6AidHkKc)jY_Ev5FW%T867OT&q8;X+Hq*?gs>MH8PhB1MD8q>xsG1~p@?5=cY+4#^`b z+yeR2N~(^oyO6{9>L|?`W|r@ZnJ)X2sKg!EAXl$< z!;BPkBeARa^X;Z4etF2=FXJJ3nOO_>$mxA&BZSgXYE<{utz5Eng;?-bOUD9zZLyTw zPu;7O{<@4a#y>HlN6$Xr%Ole1A+vN%7)?j%{4rfK2SiStiDIa!$?6ezBWU^QyKDzN zZjy&6I;!sUa^0#1v(&j@-LX#A<$R?=x??eea~ z>OhI>!@V@deTupZpaff>a>ccN9vb1-6x^m zt_0hiK>n|w_53YxekzlrX}vHJe&hYcE-CUgjccGPDg2Xuq+wnU^I`~fTW=~IwQxfF zlzdo|WXM_VU3%nz5OT`$pxu36j~>Q>CmCY-o}DsK|D^BY2t=#mP*PP2~Z zTC(`uw(Xph&biB%4hKPrtp^TWJxK&ihT>i{OA}cWt~TQ6p;n5!wDV3>J6CddjaQC< z)8mz7kw_DYOz(5Isn@Qt!9NgtRJ8lC_IXmM{*tm0PsaQ*cfzY$bqU$m^CJu#_7lw7 zx1avr7}Pq8{54n8d!N)Z^7X~Eo1x2~l-!h>)?tTzLuxH6m)B+MwTQ1aRD(r1ix0i> zF?4I)+8Mq|EVlV)mbJ6|04ex~MvMP&u_Uy!D{%*&Oy@H}m96GlwKD8HqKYYdJ^X7l z|DX2V{7<0y=Px_?zw;F*|Hl#jANzd%_aOY&T8uw;IM$^ z0>TasL0-&4JeZ$ z_l>l-@$nTPjq}o#Q{^Bw0;++I(ddoE$rV8fBnIO#oufetAm*+G^kI9S({bY52}ruPfyBt$T?5ni_T9pc`x_)I0+c zh&No+=A;qD{zgNZ8uWqG>-!9B6{bVXGOQRjhGHWA8cxa5&Ztv1tB?x4Hn;uJ{=#!! zFn4O5+Ba<8UAb}hwXuD?t&>$-)Au z*A99^(dHZt6Lb7(dp1TPPg{S^VirdA>7i^VUCx>*o({nxk8MF8$_l_k@DnGrQ)9L) zc!BMsA=G5t5Qvg2oxmBImV|BgI2R(!u$vqbr-+O}z#U* z^Y=OiLZ)Y+3zl8^-)$k;;WQB^pe4r~9U+nOCius=3?)Jd*@Tl+D&kHXXgmR2 znV-7nf^6N$wp zhk4emcj1Y)xfF6ordcIaCCc%`$J&z zQxn8)R*(@^&?;pEUciZ@u;6I=GMipbWo&vkBem=*QssuAGvaot?hikA8q}E*x%6O& z$qfXLcMo#_8|cjJY!y|VQV=#FBrJxfg-+!Jrxle%k5k98_u`eFCd7yOj5Tv-qvd(M6LD`f`c0)km#yNW|J z+Y}>tV?r3beNPcHU1LX?=4O7Pz&d4m8SV;THLEJWVEj2a1q73p`@T^U72{wm#~K{K z9fmbmOe!Dr;dbZ3**UV-Gsc%c$H1d)7aA7b@OCoC8aNk=`z=6QlSd>aZwa9GTEp#^ zI#aR0RVqq|m>HrW3!uQ}K<$emA|Hq3%9Nl? zDj;3}i9Ab3v4&G^V+_vfpXVfRfCO$%dUX9W#*zfC8@_}ZNh!6c6bG8t_HN2lA_2yt zlbvnq$Bk`gN4t9l{O5q6%WU53=h}^3W^BNnt$p=7@^@m1 z^6;mWF;-?52);nuT0BjYd<*FN^l@UvUvx~@VP2f6u>If|G?rT#Nna%zOC|iBNg0Hi z+ajWJrJl2Luv7OfGV&G4yhbS`OSwu_-US7Lxdd%tMIrzvA($atR)spqDLbBt0t=b* z2CWQ^!GM1PfdL!gQ*|9n{!hqkxyDu8XB0RLptyOM%_CA$=377aeQqV@$N3jay_QRg%<9JxMwj`><3qNn<5JDiu1*dKf z>Ot|ykvU>6Bu71t4Z$q-&z7+V7=Q2+CJb5j{@u70{m|uS|FgEr1cZ%*5c+H%DkE=9 zhQ$l&-FjcHA!02+&su!WSnQJIG7R8|o-BbwL*X6Wz>tg~7&f#a6Y`~@zrs;-R})$# z6hev1JY)CNOyCi0iWzRFj#49GYhVOH1-*@;6A<2j0))Ym+FGpmQck`6Ii^Kd#R+yE z{U`MiSR3P73G57&+3?P;I_uI5n|gMmqPcv7!T1hp__rpYtY^9B-arP;UxsDc2K#Vw zrawa<1Tq-a@*$!(Qi8Y|F&D%$il$%V)oCxk-V+8SB_lU9HDn#hGO;3P-UO0P8(|Q6 z#IR*DIKntRv`e|BC@fVmvQDJ2FLZRYSpYhA>#t+ch=Qs?9MINaZC{&uG0dTBSQ{>SqjUW$_1JxkPMr_mt*aHRH(VYyZu=gU2BQ4|bqmrMA zSjk3Aj`rk)!m%Q);k0ig?M9Saxm`?K5I6gxB9(_hjfX)Ac~#7lLH8E}j%7a{ph>V# z8H8+Tul*t_m%b9H)gJ?2Ji}OhwP_eQ&}uSq6v#*HY|6%(+F^APg|lo4@%@vTjN`r- zVEXIny@>kgCHm#Y=DPw-iTtN`DZG`6rFwKRvmZ}wL8k4@?;^8{ zTCS0wTmA5T+J0RcRWG%OIW^}NHnO=Ua+>e6NoeXt%SAHYy37&zGqkaoDel&e!tu<} z91#F$Ekj&w0HL*A_G;6L56O4Yo^y^fcnSj=>(uWJB&He zNTTd7BdMz!j|jL03$zw%qX#oDE@YWawy_J zs>*LD#(n}2{&S1gpCSV(t_`JQA{mo=Q*jC^6-)u^M%BG&91iuOQ7!$D2q5gY)Y4E> z_*7Tsl6)CpAxIN-O~=Q1FdXTpiVXT7P;E1EvU~;zVg0a=sLZf>ny!*mmL)1Lo@6&PkzQ;EHy zOMAv#5LhV`l1cSd*)wquc?m#8?H>!kXPI?F78`>K01O--bq*?b@+zW;F}#yVx5!M& z2paST0KFVCT3DWoIhdG!zH6Jb-P!?xeynfFS+jCsJ1FBT)x-&QWb5Yo4kDsx*V%co z^ca^pL6mJNDd<8EEpluCEo{?rWtSRGQa{YR(PqPXfU8p4{BImDp(o02=_o~k+0+vo z)nko}V#Lz=$+&s(d5r2;4MXQLpJU0sYRp<|k1`oI)Y>kcd7WW(3?Q(Z#!Pylw0Ogd zv~-1MZRyKISuqjSnDu!V&Y)UUF0^BtL?=^XoEQ$3dhQ*DzVgj{_&?T$kv9IC^JXHO zC_BzcgzJUM_?M_LzmANRhpji5#C}3u^qeIPGWJhVG^%cJX9RluOj?jx5M$33@w~9s zj#6<3cl8u}wcV-M2{#Z=&w!S$v0RdeA~djC(J%}d>P%|fZ|t>8ZoC$%R58~lwE+#M z;0#0tJTx(=KCmK?jF#57v;v>0us=o|+IYbE!!)#z@wx#^K3Cp2<<}$%o>xK+@q2PP z4f0~aAY<=`7Pl>^3+ypxO=6pok-jBi*A!WuK5KVX44Bh?;eA@Fhq%|`*(+>XKDdBI zLIDViR4Yd_mpBlqwSFDNk7Zg#BSe>wN=%vhAZluD-Od_hl1i)Ti-VfNAja)_;P}cU z?Reo+!R${;0hefDH*5vc$Fx6ll)-h=c0M!ZIl{2Pe(=*j5$8b zc;+bQ*!s9`M_e#!7BL@LURabctG`i{FubCa=JP>lCgpIA#ocS~azsZEs+-zQteZeN z@b2xVYQawH42Bc%ri_+RGbcMPrSZY+X~hWxOVa>;AOc}~BiMZ17f_u9?buDEwU9NN zI5n)NT?2k8|C*PV&#M+dt&hw|`h=G_$wG1lIKhjlPM3rB&Mc;rnpS_zGW6ZWvOR7B z`?g97Mu(@Nb)i~Vo!D5k3|GPmT!%`ZeAu@kMHsYdG?=%X6CODmSwRg|BSG-ch;SN1 zy~*}dh&J_SX<pC2K;y?jl-=W1d5( zi2lQ4T_dbn!HmnxREC?fv~jf9qxmKE9is6HXJN3lWkJ_S(d!rlOPm-Hb36rZSQS)E znkzZe{mu58XM2PPds<$Ez~CQ0JHnc51BSheYY2&virT3efKyHs%_X&QyR>n#1rY4L zOJoiQ%?JKzXm7$~%DcR+m!}sP*z$_5v&kw=%f!BUxQzwcPR%D6y1ZKFr8REzh3&Tr zwRmLCaTGCtWi;&cNF{7iWSXW8Scc$FOPYO~hQX8WB{kPTIN;uk+J)$s@;Ey)Rfv*( zb~J~43T^hWq_!2-MQKO;9dDh)19{yuO$~x=3EP;{9;YROEMjd%O1aGfv{*dKS!s*< z-f$pQ$rA^G=qf}@kraib=Rt2rhy<6`rlmhS)oq}@%o)*Cq`0aFM4|hnnW0V`H`yK$ z%TVMo9&WEnhJKST64|;lL79<{9TmU|+ITYQ0Mcl63t)V_Xb%s=|UhcI~GvAD3R zP{x)_ZXq_#!&y!qt(-WR(>k9zdB3ZkOJ|&m6vs}}8tv)49})h_->F!cW@p++CU};w z*5G>15R_Kg`t^xBhzI>cp{|H?lTxY%*(hq$F5n9=?E^dcU&BKGQ`GfO&C7oc3;m^Z z`X2c&d~N@a>305>qWw4Nc9{Pit>fQH+WrgBho0p>=yv2C*IAK#o+7`1@keEZkU{uj znJ}kUYH^SM#1}QDPibv{fBTeXTaOi%6iwo{WiKYb2Xh_nx}bxIiv7MyR+^T>mzHHGKP+46qQ!0X1Fv4Pfq=Awe5MO{Vpe#(U( zeOI^S=+)ZoYB$7{fv)sbQ{{|j`pjz z+Z8IocYFKIeB2`1RGG!oj_$;YwLA^fpDQ(}Z{I$JoGwZLu3TIoX=cjzqnAp|l!+9P znH-5Ke_|<~Ub14cHZ(|nuTW1WB`W>x1RvG^{RB@XHht>1%gLN410G=~{0~`)LC`LIFfhX0soWrnv^rH8n!P_I0!xW-02ChABEy z9VQG!aDxghT6%7N*2wrZATfv21pcU$Uo0z{FYwo=uU>;BvYH}bcLz;9tAjF?BksPy zo|s83+en$#j39}6I9}3bz&llk(aUk9`We;{JK9!@Q2M|3z>xjFDB<&t8Alj5oN->5 zR{mssf>A%(0@v^X!l&>85<@(9%r6ec_0(?x(YMq4p$?F>psuYG6Hahz5N*`zl=fLc zu7Yu@#ML0&wifPPB0MQb&l>h?r!yYrHY{qt_<@^VyTZv3y_fs#0M?yX`%Cqv(g*xu zaiM}JUHjcZaJLQahmWGB9QHMZRg68`t;m(niNLl|J5GUUVu4+9HFd+P|0aWK4{2m- zh_o9A6T}=z1skN1EXa{hpWj<^z{!XeGcQMz`@~KPcPmMvYxpkGdVuF&G_`^JzKiDD z10oxvn(%_0oK#D%vW_$^<7CBuUz~;^2Hebl_j9K*=<2h_Z;rKt^n44=P|6DWxzB9m z!2Pikbi_5!Q1al9&~Q?YcOKjdV6sccrvqXI6<<~fxxD^>wQxDbNf-x;+}6a>4VZUS z-@EoVn}em%CuEK#R5e=xeqh`!WiXf(8Z@pO?bZ&%^4j&I1-4uqLay>3Y>qTp82<&3 z2(w{w1dd*1z3j-69}Jfk{E)SMq6vgIGiRWw2q6g3pD@u5k?`b`l+pO0@jpTL6|zOk zn|$W})ClGbs4Q#*fzmAe!^M_I@SDvM8TOZpEun&Hgwa9Ek;4=J{xl} zB_DigH#Xb^r_=yxZ{MhYwwZoXr4sS9kv?=bFNnZAEhDA^P3QKxer_we2^_QiGIJ5h z>sN}1pS<6$jU-h&ebjFi@}8}pC0+e-|BVZjj)=Fbo&A`TR3(9oJu(L+moWc`+L!$* z=~xmflCM-LJ!9?-?o|Jr3+;WF%OR#heX+$tqYM^)Ol0cXk{818laPiNe%a^=2*0|} zOPtoZSZnFScKVFpp&G!uJc_|@i4Zdkt9<=VmIcLojhECrq;gI+;*p2|(vj9Wc=9wL zr);3e!uq83)OUMwKcwGU@sLdQ(HaGf!p#>W87#w8{$g|3RjGfoIhOxobC^o-X`r`3 z!*L?($GfV1r!=cE+7<4a0gaBtq29#*545ET{N$nsY*@E$x%v1 z9%Eq%%Iq)AXlj`P7KpvRcs&D%7x$@=2V=10mxA+Z?SJa&!q*^d>{T9ajsA<_dbR7#N%{T?rg@$Y)SD{f15A3yQ+82Vba?2Jj+myLYy({vQ<9g;d&>L2L$(4^8Cp(qANLXa2>F(r;+|s?o|3#Dzu{%{5Zz9_b4afxZM$HsqmCpC_ z&ldz6*wDc9`U5mYOxerSabXuay!WSmTDrP0zA4R!PX+IjHnBc?XPo(niGozbSIc2r z6}OENX?JJ}WB|qq9~5lXQpubd+{nF3G^e4ODRbxkwy$vagphiJ6slW>=(t6WTI?nm zvZx-czw)z}&wiu3ev)H@^QZRpk72d-O95^aV<-4Y1e#a*HA)EFK*wa?tBdGqG zpcIbTT0|w;%>&8pbo~_$A5X4nQHuv$)QdlJPx_NA(V`jJSzX!mv}4XW!v5ICskH-G z=w>0Qr8FbVu-IiG7?9#haFOzBzi zTU{F@vbbF0gn6XMwFQwc#eW8z&3A$~-Ksj~DT}fXD-Z@?H>yw#vHnoYIGDhS*hF(Y zj>T92LPcBfkl4tpdidjC%l(^kiW~mGs~Zmqg?~>Lbrg+k3`^cFpRc zH^9&<7=xRt$x5}xrJYQ0O{bo@?<9l|y=l1hh%3fve5;nrXTg2oBD3axqN5d%S89Z7 zpxMDg@t04b2Ue@*x;y(Ytqn5cS}dvfiM39ghJG5KoEw|{8yjIL#fa|7RNa*Avh*WG z+F?x5njH2dvLJ*0t4v!db069q$_FN-5Wmn6$SV+Ch}`jN>=wBd^{sI7T@G7b=LU;S z!R8sI-JWknU*anCD#Wt7Y|GI4ybh51f-I4&GS$tPsxx*-N3sEMlwf7K&B95fpSEZ# zyQwM6r5=U-ooLXduw_L$Z=D?VsP_D>U1{Ha#cNqS&bs6yn#jDTb#6D+p7__)sQ8*w zak~uNNG+D0WhfG0&@UOrAePF)s!H?>XUbuR_GOI=(9v5zSH!3%?T@xXw|>_Toz34s42UQOQbxt+n@8*{&@f+`L>Uay z7Db9RbHD^fnf!-*@ygaE`2dUmRPcp zM{gL+a8hnqPMXL*J6}(K9m3i1;PLID)0GD0>V!_5?2R-{?@vT4ywl(VcR^xZ75%oj zNr);}7LvxXyeXFHB78W<&#Wz!Mnf!Kx5_;|#fg!1>VvRF(P%%v^@*@1>`Tf0DSdA6 z5y@OA62&rjhQ-o(Xzdey4qD0&BHW=h%T9XYfp5fc|!U` zH$#QNY}I~4!MXJe#E;juEhlyK>KHJ9b08VlDTZuXWj~K3u(AZSRmsh7%KM%(DR-PM5P65p~3$64xGY;w0GXhGiz* zkDAxK`yy9wpbQiB#b?+fl4hnG_$L$P$9(#B4yfx1GE7y5rC)`|Nkgt?`dw}1o}YL| z19lcr-hUmp6O?>jgj=gM7&Vnls)%o@*mp||sm-bSOpC}R1uHbTR!9{~El<|w^)6*3 zfCgun*jK%ce1l2i0AhaBk{$JTNH_GO7qx##WBQW6;U`7PUY3?sJrgzZKH15998|^P7hHoK(Lb6OFuG-E#kGLQkz=#^Dd8r=P`el!H&&l5A^0-L*(7BX!J?fRw4 zI-<>!KeP}dwZ8>G1J`HnOWbE9`z!YALBEj+Dj!NH&@Lhi__!97y1IHQovsOLX8rQi zH&Le3>wRwn(&u&5-RW~hf9m$$2k<#r?r;$UO4#==ku|YJZ-F zuFNqi&sR-Z(VcRWoeyvO%Er6B%T0Cq#l?eD>s0ZgM?&^TTc+~!H$|px1d4k)KVm+i zzIZ}E%+cQ6qYozqi4?x|UU+YS@d5acmR5EaNQvAI7bo}2rgH~xMucxh7MFj>*LN1s zp&x4ut8!y&6V<&_eJNHDpH9l_9O6cd0U4wh;F=ImgxTShkDWtWJtnd^7RpGc{KFg( zZ&c)9t=|j(0g0ZB8y5Og`y2g}K=VCmDW|S`t!721_=%1OGG3dqWn=e-w*%q}BpaFQ zAH(33H+{QmCZRslTOX6qApCu|XSz~Tw66oVz8RmQY@@9_ZbsJ`CG%&~M3t_J0zeO-E zeTS+r@HN&4KuJ4IUXMgG^e)-{orX_XI+IyfsRuR|1=m_`3$X}s$Xa^D_O@62Pg<|%P*f*@U4h4GPPYT? zT`&DX9i9VPCFuhKmqi!9RWMJl06jSUf2m;h70j&J0_j!FAiqZLf@`x~VyztxD2R>( zdDx2F*asVxsP5IiR*Iwo@zdtL?EvAk`nr#INaj9v5V`nVypR7OgZbU}2SY%j{Vy4e z<=-+G%Im8l`!@Cu?Oi-?5c_%Jb}i};W*(5UVaE)SH=oV)xGf+ zx{wADeUV@Kv#v(Wy~ww?0eW03$Js!~P@O zV>sXekI{}jP=D!QY`Z-b z`MEkJi4o{fea0-;s0~Bkbw>L2D|)v-?Sa>XKuSbX!$|qQSu*4QLkIKcTL(k=KXfpS zg@J0js^b*j$O+)z$VnHVsC%HUTv`-pSEAUS0Y-8Q(Mt0}rb-BIfEu3Aq@mgjpL88K zrsV1gbO9)HUw~Ul-49fvHVqPD$H~JguD_5I*}svK*#(!p;FBj7a5NfHgLpmj!yeZL zdda7R>dktkS6d1f>E?Z?H;hBYpTv5%-e!*ufY6HcS~3qe9W6(>sl+ zJ>;`_1nH1$sopu9{tG$b>Qy}`xc~x2H@rJGOeY9`6#L{(?HTcC@n8hzUo9WPbb*#N z1Qo2M{o%d_@`Fsxfd7skVFq0M&fnu_$u~&`^x|aX_w$7w<#zy3q)-DBLKTyK%M=1& zS^_MJ)K#RDY6oj3=mtpm6mS>=K+f*U5h~!KK&%fkz5GtGep(US(|(CL?>QmY!@M3F zi4=Y1lA(omKqoH1xtLeeQgGV1xA!6MO}mbWRWemphx$v&A3R}ee8f1EXoaSUh3lXsQ%SPKxKcwAuB z)+2PcD%f3&1~g;7F<#e5l(@2B!gWn-12MWJ_i?n!qC7U|-O@=yBqvu&<(Epes#q3V zWe4^SF{Bu*m;+sJa-yKAELTcq6Z(LDxXoV3i^ZyI{Ji+m5a6#KJ)Ow5ip4`q|L}s= z_yYq~Vy0>Bl6$?Lx>>!+P;zK^6nXzZxKzlhLK6`O=BC$is`=U%@au?bxQRw;?=|vx zHqxkm!o9IlkFBc*TyIBwv8zCv_-M&Z_{)gvJCq|eVHIVc;ksf5=MAwr zIwP3Uv`}yyRj!_G6(@E6@wl5S$1s}st>1`RL~D15qnEPtQ_~L z@z6(5jL%aWDKBJ{He&V&Vxpg-#sDFJEhG9K-OZtH!L8ut0V;M?$P6 zD2V+;>lmD&)(#|1qX6)9q7X2mP#_`JAU<|MK$7ESdn@q9$EkNLuW2+>1ejOc`UzP@ zU1Du>np<-&#$GX5l3NP#%UcLthTRCfZw26bxMWhiL)DCS_Tuv5I?ckeiHTT5K|EBq zX+h}bx=K140kT=4R{Pu@$C!vhSUt04}-CijNI1>)@m9;>xkBg-FCaf zpQqSa=*^q!wQO&Im^1^%305DFsp)wDra^(Pk;*+H>R6*RZ`dz3Ix_W03 z5zc`^K~j1r7nYqOK9xjorB*H#xX3rp5)gxcpFxDNZqK%9n3Z*@XSjM=6%cd|kzq-L z5|QCDsQ@;d;)^bEt_X`wyP0~3my(*0=d9O$aK-ItE9br&CI{iDH^PIc;FS8AzKnUe z{X@xors<_o4xxI>B8X}TFZu>N+$pmO_L$m0`1oY>xD@mxB)EjJppR9U=cj3fDP8(N zqb|tr=?W}(@}*z+MEfGwErfcx(5VU^x$#kODCBd>A*sUc)4%V6{v_n#J^bzpNSpFP z!~M0zzGi%y00hOyq0+yw?Gs=Q8mdcO(z+bKq&$vvCzr$Mc-r6ekX7`5tntO=COXP46Gi)4fyH>UM+h z_@fpGtrel>x$+`*=5p)W9=fVz9|}EYT7xcVx!^Rbk5vHO~8~D<#;&M zM}Yv(RrME-Y2jk^kXh$xii>c$SvZgPaUUZ7nHBa(qO1}>?IJ`Bbio~U9X5!i$mj(% zu10m#VaH@VjEEQES|~i#`WsXw0!+JtQ6x%*S&O@dHE^N#v~$-oQNrWbJGYa5cX8KK zv87codc~sOm-H)gxU(#ro)^JOnsCS81Z#ZHSQCb^J3Q5XULn%5%gr{ZTA$78Aw%x7 zUMRi4%>`}#*hc}B*DdK~Et=^x$xY9YX>BdEWK6BU)-d-q<5@jMRs*tg?9;F8=b_-M zF*1@kHN}fK^734L#0yex{9t%_b@i+r=WqFQ2@tEd1En zlaS&eA5#b9i_QGCa&~taV6dulaqZ;|(I*gAiDuX*++5yGSB6e+5Pc~lxKJa|>4zxl zV*%wJcV5;)UE7`xKZ?>R4=;xnaWx}#FZ>go0|72Aci;F6X4{d8nM?q8;TT z!Vq!5ske}(a8Vu?X&Jo;h)=WzZ+Qe9&hJt9X|PHRDLZJpeydBZx4qtcSd~1!x_MEm zIWnScws1bDI$i3x9f=k@tCh~eDN(}W?mU>=S@d;o>`epcU2>Ef8UkGYs;jyY<~|+lk{|^ zGV4ijE-|(MjWs%_dIc1VIAqz{-$E0o zBZIwGckN&G0AzJbGNRIQ*@A!=48WRDXu1Ja<)x->Uw_{2$*=o z1uV}sy@e2d<{)(*iuKGQb{SGsk}kd=d#X?D0niyn#{H}lAMDW~{-Kc$_)!d8QhtE& zfh0e`g)7!p3>*uH&Lolg4E&|=;(F4RYbl0thjVpWf}g*9`SF0$4Ch^=#A^o7lDz~} z$>xHQ$%d%`OSisOi(#?B#07*+=6fIwPd*{o+J2gg{UqD%-cChZIiB!UTFuoseM!&N z{JbUQy|kW4xMj?8)Tny`aV_J|u(U>Ms`nbbk+q)qXlNWw;7tiNEPjF#n`}?qeV`ic;>F^J!)0H1FJ8CZo1cK4xg3@5v9aH_N zk-_vq?1X>3nYd-@ZLAVkI{I4jT3P1>)4|_TCxt{I@%p4Ef>hopk*AQ)7l72vPQz_q z-^ZiX^JD7gU2vDrcT8j}hwt=ewVog&j#)0FS|lzLVHXdFkIhracDK98Om3R8RcDSe zyZ8Ar3DJ4037#x%nm^wl&g-zY%Oh>(#BD;fwXdur5=FgL9Hz+Vl+`s1+q9;8dER^N@9DT@aN{mc_1ho*Xbg40rP_mx^0Rm5i z2An~UmHBqUJ?VY<`;*{CL~+|~a01`#Y7JlPQkiP&^Y(hQKXkZ`lif2CGxC7LZ2>bc z7W&~QQ%Wp$VhFE2cmMbVK870ce$>0a+!l(;1@9-pfN{9~Zvzk0*^yJ7TT6P%%eL>v1%s@~Bh9`k@h;A@b2hjW#U<4}hjP@J5j2 zLs?!R=%^>8Yt}6qEm&P^zFT@GB#h#xA5#ommqt_Vme)UMX10NTS;q_fMj#wWs{_bc zejRZcKujL(g5e1+&qQHm;J~1GXN9Rd9+O47*8tlB+MqdQLYPZ`@#BM|3uFUCK+(cq z+GcNY@3)BQ-OvO4b3O@Y|_L`l*TAO$@dDe@ ztGjhx*I5bRGsqdaAli|wn{vRX^!;v0H`#RzE9BFKY;l1j~#+aEn?GbynCB_LR-eXlB2_u|RVG`Zt$Vq5-9gE9C+@ z!Irak?fq3zO7@_T(H*}58$kqNY?7}yf)gk1`z*a2g~uky z;H8^^6-J{C6$Mgh1qn(?A~QS?Keaa9H z;n7w4kRmxB7Z27Pqk($U=oLKWCRC<>_AYGAdA>OyVADD;nZN8uzwh?mY!z&T2sq%z z>c;cb;APywvPt`ST~CB`b+ZkWA$G~$x#20&$po>oIRzS}batNb)j2lNMbG57wDnGr z(&w`Hj$-bT?QC^y1z%{i*GHFi0h&s2sF5w4iD{S(Km9w$W9^`_<9nCiV49|DJgdAm zEhtq0MMIXgQ0nY&ydZz+H3K9i3%fLfun5XAWbZn$$(-I8PK6~rA;of1M=A>AOTs0gHA{_;~7|zM?>4Cc0f@@=x+*q01Sol z6Z&BhN4if`(ug_|4JT+kd^QZC13(9IOtO8=5vDSTm_~i-tph!LyvFjhOc5KC_>IwI z(is`Igq}-|5G6%qmrORGKikWtwPo5Qv!=PcK8qk5paKN^J<;G@r~P*!{Uk-8C6{fj zieaMm+|)`H7Oi3y%eW3BjB6ej!aS?De?)QD46XbTy(atUSj8)lK?<#;1RO>ir-71R zw``@5RG8Iv5`bNwdz`#Ma%E6Hg-CBr7@Eh*0Tg$e^J+cZ@A zB4br)-8JY7>e(`CY=B2Xl+5y3QLbNSn8p5yu2Mn6KMjQNrc8HS#c%5Uy)=|xFV zTuoiTHTe-};XLLk?np@GXvuf3u42B4vxYL(-nz2RYojG(bA?L_3rMLX8x_k_7Bs*xq9auvWo+!mBu?aOWdK~p#{E+IA%fXduNnAa?;DrmcI z536AI*?jhzs-sdeOS_|!zYCdqCy}(&H=49xuVNz&99FQGdXZLA@@Nk)4+y+;X}zqP zeO&BL%;|V*RdP|kQz>MRFX)voh)8J2+pn)A+b)78P!kLi4~lZ~)YoVumQW%-kK;bxk*Cu=_qeX)n=Q?VWO2J{ve-g#+hdJzI~lwXNgje}4=&kw zU0+m@lkH7_c|>Adu1S1XS;~;~L)NU-^{^x$Y0FJhqx-Cj-#&Ks+p7DxdNVf%U`tEI zMz`?{uiqk>b9}8+k+?_4;GjZN{rFybzRuEv148xM`W0FU*g#?Z27B2!kB(N^jGR`L zJG+AN)bx`w$t`>xvyJH}9@tPOxaEO^FBbxCA+#GNu)UP`aeeR+;Ri<@{I)n5*JU*H z@JD%cWy}VPCrd+xKr0(L~UYiQ^cb!xdgzrX>}^TpaYN zNq@@_rUj+BYY?C1k)1x_3)>~;8J-2Z7xtVHH%0!Gvg0SZxjO4Gy0fpNV61P&@pVmM zfLS<8I)<<=y#*qH<5f=$r;CTI&5~af(z|b(ATwS|{a}8OPt+Hv2Kox+zjH&4t*o5C#~Pd47&{W!IhebA#~j-HqvZDvb87-AeRo@D zCxY*S##Y8=-@!HdHUwPy1ZED#Cfr13PEK|lbaY0>w65ls=61$L=K8d@4yJT}y`vKn zm(l&6O%o9~={uMjJ8=`~8d&MuSQ7DkcMyDcaM9`W5NMH$eCMeW2xw6dINKQgZ&YTX z|2BaAm!<#e`MWj^!FPg=xv32S5g*a_B@lEl*8fgTCI9>akOnXZFa&S_umy1ZewhF` z0aO7H0H}Vq9RQ5JTZ{no01N<3|2)Xt)<)?2x{wQTFw!%y(KFMteTQ4J(KArdGm_EM zlYI}9wl(^H86oFjYvgQb{J;0{|8@bx{MWzR|87YqYha=1WKAdY9a8k2i~3gz?01wB z!_WU}b;Hd5zgRV1YG}u7G@&j!`hWh)+c5+}!PWMuhX5*Y4geF03|cnBN8*iiZ8-Ng zW%*OlWPhvq#`%iUz^&TBlu9&K<&>F6A%~%J_Urii_7+D%a29nQ>q?4XzcY6U3m?W< ztA2<>D{`ojyv`o5(XJEL@DO3rjWFF0x^~bPIZSGVRAhskG>)w$%b*7~0rIJGlp*y* zIybz^#=g;Z8rK%&}250XBZ~FiwTY zMu?&YF@!p$5j9)QU!)bo;`T!#MkRh^xwAl70VqeINFS6L@=k38g##@C@tnUfGK9Mz zf8)|de~;w%fRe80E+dIw+v`o^Cxqk#M^JcS|AUN-14(#;ozg-*gb`Ypi&S; zCN!TwAP%K-@*mjsNbApZ9Fvpp_@(#ty!geD1s)iV|L(;BRt0ku0NH@groT5*ry39h zJAxrZ2u3sC<(MNltSXo+MQ&@oVe5EEHpoJ&t8mdu~ZNT%L&v2G$ZRPLgL3dhcc zTXMz0IJCvM)Gdj9jqrdANeJ+Ue`SXNURraCFdh{bJXkJoA4foS))8(u72{_}#dQz6 zkR5{q+$vw3BSufg&yb5klvc(RCa}Pr;*?bi1R|j*5qnOwM*xRR4bE^p@CpYAQu}!F zI?o*5fQxuxAo9AH9JQaoA_m7~E+`G+v8+}Bq@}6&6=yNv zdLli40yqYz?J(fv7-vZ#y=4xwpf=Inrf81eMfL+?qZExB>e*@I0SmUQMmfs&0Ujf? zPGy0k_f7iu`++*{&_k_9^pkV-+hNRz$_y-lIfiRtPH;gYdiqWfQYS!jf?l}8z+h40 zq*$+RL%=Wr!bJQ3@{;>)%HQ;3DAIc2mVlGhf-hMu-5SOUk`+JQ$O&USQyQ2lZI+p^ z4rEmpBV(3mV@njjlC~vviAz_zigvr|Z85@j%cXpL*Up#4tL@xI6`gG;>M1+zaX-fQ zB?1v>cIwxR)Cies|A)s@o+q2v%;u)^M~(K?A0FoNVqL7axeSbC@Ew_0MK(GgIsD3J z#GdK=S_myEmUpwdiVyxKyy0j3VJXpaXc|g^acDv4vKjh)T1!%%l?f6OnvjFT*u3*E z;IdS!;I&d0gOqd0v@rLc6z0>37s81~6CC65D=Wh|{Kg}vKD@^X<|BOuSwoaDk|1XB zTxk!rj06l$iUv{og3wBVvwQYtT+ks3dL4gAC@Ceqc%TH-6vnVo`#<}!YpFT)n8)~E zR$0vJMV3-`%}1zXg7ub5lenLoY~GH)&at()r$pzG(l*mxp3J2s9qm_a|7^ny=M+6O z{VXwuq#ZrbuD9(3Gu`DFjp$^Xo4748DxSlyTC92V

fb+3(Bp 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 z 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 SYw#8yHv-4O-Tr?${yzX+I-REg literal 0 HcmV?d00001 diff --git a/externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf b/externals/hermes/source/externals/essentials/license/essentials_Lizenz_und_Nutzungsbedingungen_private_und wissenschaftliche_Nutzung_Fassung_20170406_en.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90989c4cc27cf3135af011fb83b5a1394c022809 GIT binary patch literal 158334 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 R(6Q8Ut9M+d5#!O0{}(wUXJ!BZ literal 0 HcmV?d00001 diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/addBoost.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addBoost.cmake new file mode 100644 index 0000000..d833dc1 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addBoost.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(Y_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${Y_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${Y_BOOST_LIB_INCLUDE}) + set(SX_BOOST_LIB_PATH ${Y_BOOST_LIB_PATH}) + set(SX_BOOST_LIB_INCLUDE ${Y_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("Y_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") +elseif(SX_BOOST_LIB_INCLUDE) + set(Boost_LIBRARIES ${SX_BOOST_LIB_PATH}) + set(Boost_INCLUDE_DIRS ${SX_BOOST_LIB_INCLUDE}) + + include_directories(${Boost_INCLUDE_DIRS}) + message("SX_BOOST_LIB_INCLUDE is set by user.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + +else() + message("SX_BOOST_LIB_INCLUDE is not set by user. Searching for boost libraries.") + set(Boost_USE_MULTITHREADED ON) + find_package(Boost COMPONENTS date_time filesystem system program_options chrono thread random unit_test_framework) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + message("Boost found.") + message("Path to libraries: ${Boost_LIBRARIES}") + message("Path to includes: ${Boost_INCLUDE_DIRS}") + else() + message(STATUS "Boost libraries not found!") + endif() +endif() diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake new file mode 100644 index 0000000..48bd9c6 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addSeadexOptions.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +# Seadex preprocessor definitions + + +option("SX_NO_LOGGING" "Use when you want to use no logging at all (no logging code is created).") +if( "${SX_NO_LOGGING}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_LOGGING\"") + message(STATUS "No logging used.") +else() + message(STATUS "Logger is used.") +endif() + + +option("SX_NO_STD_MAKE_UNIQUE" "When the standard make_unique is not available (e.g. no C++14 support), you have to define this preprocessor definition. A yasmine drop-in replacement template will be used instead then.") +if( "${SX_NO_STD_MAKE_UNIQUE}" ) + set(extra_flags "${extra_flags} -D \"SX_NO_STD_MAKE_UNIQUE\"") + message(STATUS "SX_NO_STD_MAKE_UNIQUE is defined.") +endif() + + +option("SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG" "Sets to use a workaround for bug in GCC with expansion of template parameter pack that appears in a lambda-expression (bug reported for GCC 4.8.4)") +if( "${SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG}" ) + set(extra_flags "${extra_flags} -D \"SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG\"") + message(STATUS "SX_GCC_EXPAND_TEMPLATE_PARAM_PACK_BUG is defined.") +endif() \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake new file mode 100644 index 0000000..b568fbb --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addSpecificFlags.cmake @@ -0,0 +1,112 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +add_compiler_flag("-Wall") + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +#gcc/clang compiler flags + if(NOT "SX_PEDANTIC" STREQUAL "OFF") + add_compiler_flag("-pedantic") + endif() + + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + add_compiler_flag("-g") + endif() + + if("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++03") + add_compiler_flag("-D \"SX_CPP03_BOOST\"") + add_compiler_flag("-D \"SX_NO_VARIADIC_MACRO\"") + elseif("${CPP_VERSION}" STREQUAL "03") + add_compiler_flag("-std=c++14") + else() + add_compiler_flag("-std=c++11") + add_compiler_flag("-D \"SX_NO_STD_MAKE_UNIQUE\"") + endif() + +# platform + if( "${CMAKE_CXX_FLAGS}" STREQUAL "-m64" ) + add_compiler_flag("-m64") + message(STATUS "setting platform x64") + elseif("${CMAKE_CXX_FLAGS}" STREQUAL "-m32") + add_compiler_flag("-m32") + message(STATUS "setting platform x86") + endif() +endif() + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # Checks buffer security. + set(extra_flags "${extra_flags} /GS") + + #Sets output warning level. + set(extra_flags "${extra_flags} /W4") + + #Disable specific Warnings. + set(extra_flags "${extra_flags} /wd\"4127\" /wd\"4250\"") + + #Defines constants and macros. + set(extra_flags "${extra_flags} /D \"_CRT_SECURE_NO_WARNINGS\"") + + #Enables function-level linking. + set(extra_flags "${extra_flags} /Gy") + + #Specifies standard behaviour under /Ze. + set(extra_flags "${extra_flags} /Zc:wchar_t /Zc:inline") + + #Disable minimal rebuild. + set(extra_flags "${extra_flags} /Gm-") + + #Enables additional security features and warnings. + set(extra_flags "${extra_flags} /sdl") + + #Specifies floating-point behaviour. + set(extra_flags "${extra_flags} /fp:precise") + + #Multibyte character sets macro. + set(extra_flags "${extra_flags} /D \"_MBCS\"") + + #Enables you to provide internal compiler error (ICE) information directly to the Visual C++ team. + set(extra_flags "${extra_flags} /errorReport:prompt") + + #Treats warnings as errors. + if( "${MSVC_VERSION}" STRGREATER "1800" ) + set(extra_flags "${extra_flags} /WX") + #else( "${MSVC_VERSION}" STRLESS "1900" ) + else() + set(extra_flags "${extra_flags} /WX-") + endif() + + + #Generates intrinsic functions. + set(extra_flags "${extra_flags} /Oi") + + #Specifies the model of exception handling. + set(extra_flags "${extra_flags} /EHsc") + + #Creates an object file. + set(extra_flags "${extra_flags} /Fo") + + #Marks an executable as verified to be compatible with the Windows Data Execution Prevention feature. + #set(extra_flags "${extra_flags} /NXCOMPAT") + + + # for release + if( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" ) + #Creates fast code. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /PDB-") + + #Controls LINK optimizations. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /OPT:REF /OPT:ICF") + + # for debug + elseif( "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" ) + #Creates a program database (PDB) file. + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /PDB") + endif() + +endif() \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake new file mode 100644 index 0000000..7964d92 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/addYasmineOptions.cmake @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +include("${CMAKE_CURRENT_LIST_DIR}/addSeadexOptions.cmake") + +# yasmine's preprocessor definitions + + +set(Y_OPTIMIZE "SPEED" CACHE STRING "Sets the optimize type. Supported values: SPEED and SIZE. Default value is SPEED.") +if( "${Y_OPTIMIZE}" STREQUAL "SIZE" ) + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SIZE\"") + message(STATUS "Optimizing for size.") +else() + set(extra_flags "${extra_flags} -D \"Y_OPTIMIZE_4_SPEED\"") + message(STATUS "Optimizing for speed.") +endif() + + +option("Y_LEAN_AND_MEAN" "If you compile the library with Y_LEAN_AND_MEAN being defined or if you define the macro locally before including yasmine.hpp, all the state pseudostates and the asynchronous simple state (with the asynchronous behaviour) are excluded (i.e. those headers are not included). This can reduce compile time.") +if( "${Y_LEAN_AND_MEAN}" ) + set(extra_flags "${extra_flags} -D \"Y_LEAN_AND_MEAN\"") + message(STATUS "Y_LEAN_AND_MEAN is defined.") +endif() + +option("Y_PROFILER" "If Y_PROFILER is defined, the state machine will count the number of events that were processed. The user can query the counter by calling the 'get_number_of_processed_events' method.") +if( "${Y_PROFILER}" ) + set(extra_flags "${extra_flags} -D \"Y_PROFILER\"") + message(STATUS "Y_PROFILER is defined.") +endif() + diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/functions.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/functions.cmake new file mode 100644 index 0000000..3a76857 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/functions.cmake @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +function(use_pthread varName) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(${varName} ${${varName}} pthread PARENT_SCOPE) + endif() +endfunction() + + +function(use_boost_libraries varName) + set(${varName} ${${varName}} ${Boost_LIBRARIES} PARENT_SCOPE) +endfunction() + + +function(add_library_for_linking varName libraryName) + set(${varName} ${${varName}} ${libraryName} PARENT_SCOPE) +endfunction() diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake new file mode 100644 index 0000000..105747b --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsAddCompilerFlags.cmake @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +include(CheckCXXCompilerFlag) + + +function(add_compiler_flag varFlag) + string(FIND "${CMAKE_CXX_FLAGS}" "${varFlag}" flag_already_set) + if(flag_already_set EQUAL -1) + check_cxx_compiler_flag("${varFlag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${varFlag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake new file mode 100644 index 0000000..c638987 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/functionsRapidJSON.cmake @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +function(use_rapid_JSON) +if(SX_RAPIDJSON) + message("SX_RAPIDJSON is set by user.") +else() + message("SX_RAPIDJSON is not set by user. Setting default value.") + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + find_package(RapidJSON) + if(NOT ("${RAPIDJSON_INCLUDE_DIRS}" STREQUAL "")) + set(SX_RAPIDJSON ${RAPIDJSON_INCLUDE_DIRS}) + message(STATUS "Found rapidjson on: ${RAPIDJSON_INCLUDE_DIRS}") + else() + set(SX_RAPIDJSON /usr/include) + message(STATUS "Set default value for rapidjson") + endif() + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(SX_RAPIDJSON "C:\\Program Files") + endif() +endif() + +include_directories(${SX_RAPIDJSON}) + +message(STATUS "include rapidJSON from: ${SX_RAPIDJSON}") + +endfunction() diff --git a/externals/hermes/source/externals/essentials/source/CMakeHelpers/setVariables.cmake b/externals/hermes/source/externals/essentials/source/CMakeHelpers/setVariables.cmake new file mode 100644 index 0000000..a6f1454 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeHelpers/setVariables.cmake @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + + +if(("${Y_STATIC}" STREQUAL "ON") OR ("${SX_STATIC}" STREQUAL "ON")) + set(LINK_TYPE "STATIC") +else() + set(LINK_TYPE "SHARED") +endif() diff --git a/externals/hermes/source/externals/essentials/source/CMakeLists.txt b/externals/hermes/source/externals/essentials/source/CMakeLists.txt new file mode 100644 index 0000000..daef5a2 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/CMakeLists.txt @@ -0,0 +1,16 @@ + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +include(./CMakeHelpers/setVariables.cmake) + +include(./CMakeHelpers/addBoost.cmake) +include(./CMakeHelpers/functions.cmake) +include(./CMakeHelpers/functionsAddCompilerFlags.cmake) + +add_subdirectory(essentials) + +if(EXISTS essentials_unit_tests) +add_subdirectory(essentials_unit_tests) +endif() diff --git a/externals/hermes/source/externals/essentials/source/build/c++03.props b/externals/hermes/source/externals/essentials/source/build/c++03.props new file mode 100644 index 0000000..d76c9b5 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/c++03.props @@ -0,0 +1,31 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + <_PropertySheetDisplayName>c++03 + + + + SX_NO_VARIADIC_MACRO;SX_CPP03_BOOST;BOOST_SP_USE_STD_ATOMIC;WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(BOOST_PATH);%(AdditionalIncludeDirectories) + + + + $(BOOST_LIB_PATH);$(SolutionDir)\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/build/debug_info.props b/externals/hermes/source/externals/essentials/source/build/debug_info.props new file mode 100644 index 0000000..5dc702b --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/debug_info.props @@ -0,0 +1,18 @@ + + + + + + + + + NotSet + true + + + EditAndContinue + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/build/essentials.props b/externals/hermes/source/externals/essentials/source/build/essentials.props new file mode 100644 index 0000000..8bdf813 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/essentials.props @@ -0,0 +1,31 @@ + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + Level4 + 4127;4250 + WIN32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + None + false + true + include;%(AdditionalIncludeDirectories) + /D "_STL_WARNING_LEVEL=3" %(AdditionalOptions) + + + + + + No + Default + + + false + + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/build/use_boost.props b/externals/hermes/source/externals/essentials/source/build/use_boost.props new file mode 100644 index 0000000..85fdae4 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/use_boost.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/build/use_boost_as_external.props b/externals/hermes/source/externals/essentials/source/build/use_boost_as_external.props new file mode 100644 index 0000000..cdd4e52 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/use_boost_as_external.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\..\..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/build/use_boost_externals.props b/externals/hermes/source/externals/essentials/source/build/use_boost_externals.props new file mode 100644 index 0000000..27f07b7 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/use_boost_externals.props @@ -0,0 +1,30 @@ + + + + + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1 + ..\..\..\3rd party\libs\boost\Content\boost_1_65_1\stage\win\$(Platform)\$(PlatformToolsetVersion)\lib + + + + + + $(BOOST_PATH);%(AdditionalIncludeDirectories) + Y_USE_BOOST;BOOST_SP_USE_STD_ATOMIC;%(PreprocessorDefinitions) + + + $(BOOST_LIB_PATH);%(AdditionalLibraryDirectories) + + + + + + $(BOOST_PATH) + true + + + $(BOOST_LIB_PATH) + true + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/build/use_essentials.props b/externals/hermes/source/externals/essentials/source/build/use_essentials.props new file mode 100644 index 0000000..9f7bfc9 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/use_essentials.props @@ -0,0 +1,32 @@ + + + + + ..\..\..\essentials\source\essentials\include + ..\..\..\essentials\source\essentials\include\compatibility + ..\..\..\essentials\source\$(Platform)\$(Configuration) + + + + + $(ESSENTIALS_INCLUDE_PATH);$(ESSENTIALS_COMPATIBILITY_PATH);%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);$(ESSENTIALS_LIB_PATH);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + + $(ESSENTIALS_INCLUDE_PATH) + + + $(ESSENTIALS_COMPATIBILITY_PATH) + + + $(ESSENTIALS_LIB_PATH) + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/build/use_essentials_base.props b/externals/hermes/source/externals/essentials/source/build/use_essentials_base.props new file mode 100644 index 0000000..7f85a09 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/build/use_essentials_base.props @@ -0,0 +1,28 @@ + + + + + ..\essentials\include + ..\$(Platform)\$(Configuration) + + + + + $(ESSENTIALS_INCLUDE_PATH);$(ESSENTIALS_COMPATIBILITY_PATH);%(AdditionalIncludeDirectories) + None + + + + $(SolutionDir)\$(Platform)\$(Configuration);$(ESSENTIALS_LIB_PATH);%(AdditionalLibraryDirectories) + essentials.lib;%(AdditionalDependencies) + + + + + $(ESSENTIALS_INCLUDE_PATH) + + + $(ESSENTIALS_LIB_PATH) + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/changelog.txt b/externals/hermes/source/externals/essentials/source/changelog.txt new file mode 100644 index 0000000..d1a6a27 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/changelog.txt @@ -0,0 +1,38 @@ +# Change log +All notable changes to this project are documented in this file. + +##[1.3.2] - 2017-12-18 + +### Added +• SX_UNUSED_VARIABLE macro for suppressing warnings for unreferenced variable. +• backward compatibility for macros Y_NO_STD_MAKE_UNIQUE, Y_CPP03_BOOST, Y_UNIQUE_PTR, Y_MAKE_UNIQUE, Y_MAKE_SHARED, Y_UNUSED_PARAMETER + +### Changed +• CMake: use external CMakeHelpers files +• CMake: refactoring of build scripts + +### Fixed +• missing boost namespace in sxprintf + + +##[1.1.0] - 2017-09-20 + +### Added +• Support for Visual Studio 2017 builds +• conversion functions: to_lower and to_upper +• added uri class + + +##[1.0.1] - 2017-04-07 + +### Changed +• macro helpers improved to count up to 15 parameters +• essentials file structure refactoring. All source files are now located in the 'source' folder, the header files for compatibility +are located in the 'include/essentials/compatibility' folder and other header files are located in the 'include/essentials' folder. + + +##[1.0.0] - 2017-03-30 + +• The very first released version of essentials + + diff --git a/externals/hermes/source/externals/essentials/source/essentials.sln b/externals/hermes/source/externals/essentials/source/essentials.sln new file mode 100644 index 0000000..c96fe08 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials.sln @@ -0,0 +1,156 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2010 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials", "essentials\essentials.vcxproj", "{132F81F8-46DA-49D0-9071-D70BC087B38C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials_unit_tests", "essentials_unit_tests\essentials_unit_tests.vcxproj", "{6F4D72B1-E418-4859-8C19-D58659041948}" + ProjectSection(ProjectDependencies) = postProject + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build_tools", "build_tools", "{77439103-0A48-4243-8D07-3223DC5CF353}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMake", "CMake", "{86310DF6-AE4D-48C6-B302-80F5091FC09B}" + ProjectSection(SolutionItems) = preProject + ..\CMakeLists.txt = ..\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{1C08A7CC-21A3-42E1-AA39-7E03F88A73F3}" + ProjectSection(SolutionItems) = preProject + CMakeLists.txt = CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "essentials", "essentials", "{968024AC-A87C-40E9-B75A-B7AE9790C73F}" + ProjectSection(SolutionItems) = preProject + essentials\CMakeLists.txt = essentials\CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMakeHelpers", "CMakeHelpers", "{35E7ED3A-7DF9-4E75-B289-99B3D0050992}" + ProjectSection(SolutionItems) = preProject + CMakeHelpers\addBoost.cmake = CMakeHelpers\addBoost.cmake + CMakeHelpers\addSeadexOptions.cmake = CMakeHelpers\addSeadexOptions.cmake + CMakeHelpers\addSpecificFlags.cmake = CMakeHelpers\addSpecificFlags.cmake + CMakeHelpers\addYasmineOptions.cmake = CMakeHelpers\addYasmineOptions.cmake + CMakeHelpers\functions.cmake = CMakeHelpers\functions.cmake + CMakeHelpers\functionsAddCompilerFlags.cmake = CMakeHelpers\functionsAddCompilerFlags.cmake + CMakeHelpers\functionsRapidJSON.cmake = CMakeHelpers\functionsRapidJSON.cmake + CMakeHelpers\setVariables.cmake = CMakeHelpers\setVariables.cmake + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "essentials_unit_tests", "essentials_unit_tests", "{63218938-B7EC-4913-9B3B-CEAE1F2A925B}" + ProjectSection(SolutionItems) = preProject + essentials_unit_tests\CMakeLists.txt = essentials_unit_tests\CMakeLists.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug - C++ 03|Win32 = Debug - C++ 03|Win32 + Debug - C++ 03|x64 = Debug - C++ 03|x64 + Debug - C++ 03|x86 = Debug - C++ 03|x86 + Debug - VS 2015|Win32 = Debug - VS 2015|Win32 + Debug - VS 2015|x64 = Debug - VS 2015|x64 + Debug - VS 2015|x86 = Debug - VS 2015|x86 + Debug - VS 2017|Win32 = Debug - VS 2017|Win32 + Debug - VS 2017|x64 = Debug - VS 2017|x64 + Debug - VS 2017|x86 = Debug - VS 2017|x86 + Release - C++ 03|Win32 = Release - C++ 03|Win32 + Release - C++ 03|x64 = Release - C++ 03|x64 + Release - C++ 03|x86 = Release - C++ 03|x86 + Release - VS 2015|Win32 = Release - VS 2015|Win32 + Release - VS 2015|x64 = Release - VS 2015|x64 + Release - VS 2015|x86 = Release - VS 2015|x86 + Release - VS 2017|Win32 = Release - VS 2017|Win32 + Release - VS 2017|x64 = Release - VS 2017|x64 + Release - VS 2017|x86 = Release - VS 2017|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.Build.2 = Debug - VS 2013|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {6F4D72B1-E418-4859-8C19-D58659041948}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {86310DF6-AE4D-48C6-B302-80F5091FC09B} = {77439103-0A48-4243-8D07-3223DC5CF353} + {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} = {86310DF6-AE4D-48C6-B302-80F5091FC09B} + {968024AC-A87C-40E9-B75A-B7AE9790C73F} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + {35E7ED3A-7DF9-4E75-B289-99B3D0050992} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + {63218938-B7EC-4913-9B3B-CEAE1F2A925B} = {1C08A7CC-21A3-42E1-AA39-7E03F88A73F3} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CB028EB1-46EF-44C3-B508-97BC3E09DC4D} + EndGlobalSection +EndGlobal diff --git a/externals/hermes/source/externals/essentials/source/essentials/CMakeLists.txt b/externals/hermes/source/externals/essentials/source/essentials/CMakeLists.txt new file mode 100644 index 0000000..edc08df --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 2.8) + +project(essentials) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +file(GLOB essentials_SRC "include/essentials/*.hpp" "include/essentials/compatibility/*.hpp" "source/*.cpp") + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(./../CMakeHelpers/addSpecificFlags.cmake) +include(./../CMakeHelpers/addSeadexOptions.cmake) + +include_directories("./include") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library(libessentials ${LINK_TYPE} ${essentials_SRC}) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library(essentials STATIC ${essentials_SRC}) +endif() + + +file(GLOB essentials_hpp "include/essentials/*.hpp" "include/essentials/compatibility/*.hpp") +install(FILES ${essentials_hpp} DESTINATION include/essentials/include) + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + install(TARGETS libessentials DESTINATION lib) + set_target_properties(libessentials PROPERTIES PREFIX "") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + install(TARGETS essentials DESTINATION lib) + set_target_properties(essentials PROPERTIES PREFIX "") +endif() diff --git a/externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj b/externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj new file mode 100644 index 0000000..63f7f7e --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj @@ -0,0 +1,545 @@ + + + + + Debug - C++ 03 + Win32 + + + Debug - C++ 03 + x64 + + + Debug - Clang + Win32 + + + Debug - Clang + x64 + + + Debug - VS 2013 + Win32 + + + Debug - VS 2013 + x64 + + + Debug - VS 2015 + Win32 + + + Debug - VS 2015 + x64 + + + Debug - VS 2017 + Win32 + + + Release - C++ 03 + Win32 + + + Release - C++ 03 + x64 + + + Release - Clang + Win32 + + + Release - Clang + x64 + + + Release - VS 2015 + Win32 + + + Release - VS 2015 + x64 + + + Release - VS 2017 + Win32 + + + Debug - VS 2017 + x64 + + + Release - VS 2017 + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {132F81F8-46DA-49D0-9071-D70BC087B38C} + essentials + 8.1 + + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141_clang_c2 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj.filters b/externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj.filters new file mode 100644 index 0000000..e68031a --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/essentials.vcxproj.filters @@ -0,0 +1,107 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4a8b49fc-8912-43d5-a33a-962f5e097001} + + + {13a9f023-217a-4d7a-946f-8147bce1d21a} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + + + + license + + + license + + + license + + + license + + + license + + + + + Header Files\compatibility + + + Header Files\compatibility + + + Header Files\compatibility + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\compatibility + + + \ No newline at end of file diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/base.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/base.hpp new file mode 100644 index 0000000..9ea9eb7 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/base.hpp @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A +#define BASE_0C97CC9D_8A5B_4696_9964_49819CD9233A + + +//!\def SX_ASSERT( _condition, _message ) +//!\brief Assert a given condition. Adds the message to the assert for better diagnostics when the assert is triggered. +#define SX_ASSERT( _condition, _message ) \ + do \ + { \ + assert( ( _condition ) && _message ); \ + } \ + while( 0 ) + +//!\def SX_ASSERTED( _x ) +//!\brief Suppress warnings for variables that are only used within asserts. +#define SX_ASSERTED( _x ) static_cast< void >( _x ); + +//!\def SX_UNUSED_PARAMETER( _x ) +//!\brief Suppress warnings for unreferenced parameters. +#define SX_UNUSED_PARAMETER( _x ) static_cast( _x ) + + +//!\def SX_UNUSED_VARIABLE( _x ) +//!\brief Suppress warnings for unreferenced variable. +#define SX_UNUSED_VARIABLE( _x ) static_cast( _x ) + + +#include + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/build_number.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/build_number.hpp new file mode 100644 index 0000000..6771ace --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/build_number.hpp @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 +#define BUILD_NUMBER_0A2C7A7F_B3EC_443A_BDD8_652E7DEFC433 + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + +namespace version +{ + + + const sxe::uint16_t BUILD_NUMBER( 96 ); + + +} + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp new file mode 100644 index 0000000..1946dc4 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/chrono.hpp @@ -0,0 +1,59 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 +#define CHRONO_2625645C_6611_46F7_AA2F_6F3B256839F3 + + +#ifdef SX_CPP03_BOOST + +#include + +#else + +#include + +#endif + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + using boost::chrono::time_point; + using boost::chrono::system_clock; + using boost::chrono::steady_clock; + using boost::chrono::seconds; + using boost::chrono::milliseconds; + using boost::chrono::duration_cast; + using boost::chrono::time_point; + + +#else // C++11 compatibility + + + using std::chrono::time_point; + using std::chrono::system_clock; + using std::chrono::steady_clock; + using std::chrono::milliseconds; + using std::chrono::seconds; + using std::chrono::duration_cast; + using std::chrono::time_point; + + +#endif + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp new file mode 100644 index 0000000..4d5e764 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/compatibility.hpp @@ -0,0 +1,184 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 +#define COMPATIBILITY_63A35CFD_26BC_42BE_9F09_D559349FFE63 + + +#include "essentials_backward_compatibility.hpp" + + +#ifdef SX_CPP03_BOOST +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4456 ) +#pragma warning( disable : 4996 ) +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#else +#include +#include +#include +#include +#include +#endif + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + #define SX_OVERRIDE + #define SX_FINAL + #define SX_DELETE + #define SX_NULLPTR NULL + + #define SX_FOR(_variable, _container) BOOST_FOREACH( _variable, _container ) + + #define SX_CONSTEXPR const + + #define SX_NOEXCEPT throw() + + + using boost::shared_ptr; + #define SX_UNIQUE_PTR shared_ptr + + #define SX_MAKE_SHARED boost::make_shared + #define SX_MAKE_UNIQUE boost::make_shared + + template + _type& move(_type& _t) + { + return( _t ); + } + + using boost::int8_t; + using boost::int16_t; + using boost::int32_t; + using boost::int64_t; + using boost::uint8_t; + using boost::uint16_t; + using boost::uint32_t; + using boost::uint64_t; + + using boost::bind; + using boost::ref; + using boost::cref; + using boost::placeholders::_1; + using boost::placeholders::_2; + + using boost::function; + + using boost::remove_reference; + using boost::remove_const; + + using boost::random_device; + + +#else // C++11 compatibility + + #ifdef SX_NO_STD_MAKE_UNIQUE + + template< typename t, typename ... args > + std::unique_ptr< t > make_unique(args&& ... _args) + { + return( std::unique_ptr< t >(new t(std::forward< args >(_args)...)) ); + } + + #else + + using std::make_unique; + + #endif + + #define SX_OVERRIDE override + #define SX_FINAL final + #define SX_DELETE = delete + #define SX_NULLPTR nullptr + + #define SX_FOR(_variable, _container) for( _variable : _container ) + + #ifdef _MSC_VER + #if _MSC_VER <= 1800 + #define SX_CONSTEXPR const + #endif + #endif + + #ifndef SX_CONSTEXPR + #define SX_CONSTEXPR constexpr + #endif + +#ifdef _MSC_VER + #if _MSC_VER <= 1800 + #define SX_NOEXCEPT throw() + #else + #define SX_NOEXCEPT noexcept + #endif +#else + #define SX_NOEXCEPT noexcept +#endif + + using std::shared_ptr; + template + using SX_UNIQUE_PTR = std::unique_ptr<_pointee>; + + #define SX_MAKE_SHARED std::make_shared + #define SX_MAKE_UNIQUE sxe::make_unique + + using std::move; + + + using std::int8_t; + using std::int16_t; + using std::int32_t; + using std::int64_t; + using std::uint8_t; + using std::uint16_t; + using std::uint32_t; + using std::uint64_t; + + using std::bind; + using std::ref; + using std::cref; + using std::placeholders::_1; + using std::placeholders::_2; + + using std::function; + + using std::remove_reference; + using std::remove_const; + + using std::random_device; + + +#endif + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp new file mode 100644 index 0000000..c0b2d60 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/essentials_backward_compatibility.hpp @@ -0,0 +1,31 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 +#define ESSENTIALS_BACKWARD_COMPATIBILITY_EBFE3698_30C0_456A_A146_1F081011CB49 + + +#ifdef Y_NO_STD_MAKE_UNIQUE +#define SX_NO_STD_MAKE_UNIQUE +#endif + + +#ifdef Y_CPP03_BOOST +#define SX_CPP03_BOOST +#endif + + +#define Y_UNIQUE_PTR SX_UNIQUE_PTR +#define Y_MAKE_UNIQUE SX_MAKE_UNIQUE +#define Y_MAKE_SHARED SX_MAKE_SHARED +#define Y_UNUSED_PARAMETER SX_UNUSED_PARAMETER + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp new file mode 100644 index 0000000..2381481 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/compatibility/thread.hpp @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF +#define THREAD_A43220E4_F5F8_42D5_9B31_749D813922CF + + +#ifdef SX_CPP03_BOOST + +#include +#include + +#else + +#include +#include +#include +#include + +#endif + + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST // C++03 compatibility + + using boost::thread; + using boost::unique_lock; + using boost::mutex; + using boost::lock_guard; + using boost::condition_variable; + using boost::this_thread::sleep_for; + using boost::atomic; + + +#else // C++11 compatibility + + + using std::thread; + using std::unique_lock; + using std::mutex; + using std::lock_guard; + using std::condition_variable; + using std::this_thread::sleep_for; + using std::atomic; + + +#endif + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/conversion.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/conversion.hpp new file mode 100644 index 0000000..c46dd99 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/conversion.hpp @@ -0,0 +1,53 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 +#define CONVERSION_99CAC61B_DD8A_43E2_8612_0F42873A5741 + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + + //!\brief Converts a number from string to int. + //!\param _int_as_string Number in string format. + //!\param _result Variable where the result will be stored. + //!\return True on success, false otherwise. + bool string_to_int( const char* const _int_as_string, int& _result ); + + //!\brief Converts a number from unsigned int 32 to string. + //!\param _value Number to be converted. + //!\return Number as string. + std::string to_string( const sxe::uint32_t _value ); + + //!\brief Converts a number from int to string. + //!\param _value Number to be converted. + //!\return Number as string. + std::string to_string( const int _value ); + + //!\brief Converts a string to uppercase. + //!\param _value String to be converted. + //!\return String in uppercase format. + //!\sa to_lower + std::string to_upper( const std::string& _value ); + + //!\brief Converts a string to lowercase. + //!\param _value String to be converted. + //!\return String in lowercase format. + //!\sa to_upper + std::string to_lower( const std::string& _value ); + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp new file mode 100644 index 0000000..96d967f --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/essentials_version.hpp @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E +#define VERSION_E55DC329_9A27_4598_928C_1CD8A4AA389E + + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + + +namespace version +{ + + +void log_version(); + + +sxe::uint16_t get_major_version(); +sxe::uint16_t get_minor_version(); +sxe::uint16_t get_patch_version(); +sxe::uint16_t get_build_number(); + + +} + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception.hpp new file mode 100644 index 0000000..76ad4b8 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception.hpp @@ -0,0 +1,30 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 +#define EXCEPTION_B675DC28_13E9_4827_9916_4649C36BD407 + + +#include "exception_template.hpp" + + +namespace sxe +{ + + +//!\def SX_EXCEPTION( exception ) +//!\brief The Seadex essentials exception class. +SX_EXCEPTION( exception ) + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp new file mode 100644 index 0000000..2415a7d --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/exception_template.hpp @@ -0,0 +1,160 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D +#define EXCEPTION_TEMPLATE_6EFED438_B578_4EF6_B02A_53DC49B89A0D + + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/sxprintf.hpp" + + +#ifndef SX_CPP03_BOOST + + +//!\def SX_EXCEPTION( _name ) +//!\brief Create an exception class inheriting std::exception with the given name. It also supports +//! creating messages with placeholders by calling sxprintf. +//!\sa sxprintf +#define SX_EXCEPTION( _name ) \ +class _name: public std::exception \ +{ \ +public: \ + template< typename ... args > \ + _name(const std::string & _what, args ... _args ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _args ... ) ) \ + { \ + } \ +\ +\ + virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ +\ +\ + virtual const char* what() const throw () SX_OVERRIDE \ + { \ + return ( what_.c_str() ); \ + } \ +\ +\ +private: \ + std::string what_; \ +\ +\ +}; + + +#else + + +#define SX_EXCEPTION( _name ) \ +class _name: public std::exception \ +{ \ +public: \ + explicit _name(const std::string & _what ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str() ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6 ) ) \ + { \ + } \ +\ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ) \ + { \ + } \ +\ +\ + explicit _name(const std::string & _what, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ):\ + std::exception(), \ + what_( sxe::sxprintf( _what.c_str(), _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ) \ + { \ + } \ +\ +\ + virtual ~_name () SX_NOEXCEPT SX_OVERRIDE {}\ +\ +\ + virtual const char* what() const throw () SX_OVERRIDE \ + { \ + return ( what_.c_str() ); \ + } \ +\ +\ +private: \ + std::string what_; \ +\ +\ +}; + + +#endif + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp new file mode 100644 index 0000000..757c60a --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/format_settings.hpp @@ -0,0 +1,45 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB +#define FORMAT_SETTINGS_1D24A599_70E3_42BB_BFE6_46BD94217FAB + + +#include + +#include "compatibility/compatibility.hpp" + + +namespace sxe +{ + +//!\struct format_settings +//!\brief Structure containing information for formatting the output of sxprintf. +struct format_settings SX_FINAL +{ + //!\brief Constructor. + format_settings(); + + + std::string format_string_; + bool missing_closing_bracket_; + bool correct_; + bool hex_; + bool pad_zeros_; + bool places_set_; + int places_; + bool decimal_places_set_; + int decimal_places_; +}; + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp new file mode 100644 index 0000000..b0777eb --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/macro_helpers.hpp @@ -0,0 +1,46 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 +#define MACRO_HELPERS_D52C3077_E0EF_4C4E_B451_1472DEE602E8 + + +#ifndef SX_NO_VARIADIC_MACRO + + +//!\def EXPAND( x ) +//!\brief Helper to work around some Visual C++ compiler quirk dealing with variadic macros. +#define EXPAND( x ) x + +//!\def CAT( A, B ) +//!\brief Concatenate two tokens. +#define CAT( A, B ) A ## B + +//!\def SELECT( NAME, NUM ) +//!\brief Creating a name from a base name and a number with underscore between them. +#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM ) + +//!\def GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) +//!\brief Helper for counting the number of parameters of a macro. +#define GET_COUNT( _ONE, _TWO, _THREE, _FOUR, _FIVE, _SIX, _SEVEN, _EIGHT, _NINE, _TEN, _ELEVEN, _TWELVE, _THIRTEEN, _FOURTEEN, _FIFTEEN, COUNT, ... ) COUNT + +//!\def VA_SIZE( ... ) +//!\brief Count the number of parameters of a macro. +#define VA_SIZE( ... ) EXPAND( GET_COUNT( __VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1 ) ) + +//!\def VA_SELECT( NAME, ... ) +//!\brief Selects the correct overloaded macro based on the number of parameters. +#define VA_SELECT( NAME, ... ) EXPAND( SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__) ) + + +#endif + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp new file mode 100644 index 0000000..b93fff3 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/non_copyable.hpp @@ -0,0 +1,68 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 +#define NON_COPYABLE_D2C5BF6C_4B43_42AF_9E42_1AAE2B5C49C8 + + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST + + +//!\def SX_NO_COPY(_class_name) +//!\brief Delete the copy constructor and assignment operator of the given class. +#define SX_NO_COPY(_class_name)\ +private:\ + _class_name(const _class_name&) SX_DELETE;\ + _class_name& operator=(const _class_name&) SX_DELETE;\ +public:\ +\ + + +//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) +//!\brief Delete the assignment operator of the given class. +#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ +private:\ + _class_name& operator=( const _class_name& ) SX_DELETE;\ +public:\ +\ + + +#else + + +//!\def SX_NO_COPY(_class_name) +//!\brief Delete the copy constructor and assignment operator of the given class. +#define SX_NO_COPY(_class_name)\ + _class_name(const _class_name&) SX_DELETE;\ + _class_name& operator=(const _class_name&) SX_DELETE;\ +\ + + +//!\def SX_NO_ASSIGNMENT_OPERATOR(_class_name) +//!\brief Delete the assignment operator of the given class. +#define SX_NO_ASSIGNMENT_OPERATOR(_class_name)\ + _class_name& operator=( const _class_name& ) SX_DELETE;\ +\ + + +#endif + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp new file mode 100644 index 0000000..0d9a863 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/sxprintf.hpp @@ -0,0 +1,242 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 +#define PRINTF_2B6FD3F2_C084_486B_805B_5F0E05B743E4 + + +#include +#include + + +#ifdef SX_CPP03_BOOST + #include + #include +#endif + +#include "compatibility/compatibility.hpp" +#include "format_settings.hpp" + + +namespace sxe +{ + + +#ifdef SX_CPP03_BOOST + typedef boost::variant< bool, int, unsigned int, sxe::int8_t, sxe::uint8_t, sxe::uint16_t, sxe::uint32_t, + std::string, std::size_t, const char*, boost::int_least64_t, double > value_type; + typedef std::vector< value_type > value_types; +#endif + + +extern const char PLACE_HOLDER; +extern const char* const SUPERFLUOUS_PARAMETER_START; +extern const char SUPERFLUOUS_PARAMETER_END; +extern const char OPENING_SQUARE_BRACKET; +extern const char CLOSING_SQUARE_BRACKET; + + +template< typename value > +struct stream_writer +{ + static void print( std::ostream& _os, const value& _value ) + { + _os << _value; + } +}; + + +template< > +struct stream_writer< sxe::uint8_t > +{ + static void print(std::ostream& _os, const sxe::uint8_t& _value) + { + _os << static_cast( _value ); + } +}; + + +// cppcheck-suppress unusedFunction +std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ); +sxe::format_settings parse_format_string( const char** const _format ); + + +#ifdef SX_CPP03_BOOST + +void print_value_type_value( std::ostream& _os, const value_type& _value ); + + +#endif + + +template< typename value > +void print_superfluous_parameters( std::ostream& _os, const value& _value ) +{ + _os << SUPERFLUOUS_PARAMETER_START; +#ifndef SX_CPP03_BOOST + stream_writer< value >::print( _os, _value ); +#else + print_value_type_value( _os, _value ); +#endif + _os << SUPERFLUOUS_PARAMETER_END; +} + + +#ifndef SX_CPP03_BOOST + + +template< typename value, typename ... args > +void print_superfluous_parameters( std::ostream& _os, + const value& _value, args ... _args ) +{ + _os << SUPERFLUOUS_PARAMETER_START; + stream_writer< value >::print( _os, _value ); + _os << SUPERFLUOUS_PARAMETER_END; + print_superfluous_parameters( _os, _args ... ); +} + + +#else + + +#endif + + +void sxprintf( std::ostream& _os, const char* _format ); + +#ifndef SX_CPP03_BOOST +template< typename value, typename ... args > +void sxprintf( std::ostream& _os, const char* _format, const value& _value, args ... _args ) +{ + while( *_format ) + { + if( PLACE_HOLDER == *_format ) + { + if( PLACE_HOLDER == *( _format + 1 ) ) + { + ++_format; // skip first place holder + _os << *_format++; // output of the second place holder + } + else + { + if( OPENING_SQUARE_BRACKET == *( _format + 1 ) ) + { + ++_format; + const sxe::format_settings format_settings = sxe::parse_format_string( &_format ); + const std::ios_base::fmtflags stream_flags = _os.flags(); + const char streafill_ = _os.fill(); + if( format_settings.correct_ ) + { + _os << format_settings; + stream_writer< value >::print( _os, _value ); + } + else + { + while( CLOSING_SQUARE_BRACKET != *( _format ) ) + { + ++_format; + } + stream_writer< value >::print( _os, _value ); + _os << format_settings; + } + _os.flags( stream_flags ); + _os.fill( streafill_ ); + } + else + { + stream_writer< value >::print( _os, _value ); + } + + sxprintf( _os, _format + 1, _args ... ); + return; + } + } + else + { + _os << *_format++; + } + } + + print_superfluous_parameters( _os, _value, _args ... ); +} + + +//!\brief Creates a formatted message. The format string can contain placeholders ('%'s) that will be replaced with +//!the parameters by this function. To emit a '%' use two percent signs ("%%"). +//!\param _format The format string in which will the placeholders will be replaced (if there are any). +//!\param _args The arguments that will replace the placeholders in the format string. The number of parameters in +//!_args has to be equal to the number of placeholders in the format string. If you pass too few or too many +//!arguments, the resulting string will contain diagnostics in the resulting string +//!([Missing parameter!] or [Superfluous parameter: x]). +//!\return String containing the complete formatted message. +template< typename ... args > +std::string sxprintf(const char* const _format, args ... _args) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _args ...); + return( target_string_stream.str() ); +} + +#else + +std::string sxprintf(const char* const _format); +std::string sxprintf(const char* const _format, const value_type& _value1); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9); +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9, const value_type& _value10); + + +void sxprintf(std::ostream& _os, const char* const _format); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9); +void sxprintf(std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10); + + void sxprintf(std::ostream& _os, const char* const _format, const value_types& _values); + +#endif + + +} + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/include/essentials/uri.hpp b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/uri.hpp new file mode 100644 index 0000000..0499a44 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/include/essentials/uri.hpp @@ -0,0 +1,55 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D +#define URI_72CBB6C3_57D9_443A_99F0_9EDE9A2BC07D + + +#include + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sxe +{ + + +const char URI_DELIMITER = '/'; + + +class uri SX_FINAL +{ +public: + explicit uri( const std::string& _uri = "" ); + ~uri() SX_NOEXCEPT; + bool is_empty() const; + const std::string to_string() const; + const std::string& get_front() const; + const std::string& get_back(); + void push_front( const std::string& _segment ); + void push_back( const std::string& _segment ); + void pop_front(); + void pop_back(); + size_t size() const; + + +private: + const std::string build_uri() const; + void split_string_to_uri_segments( const std::string& _uri ); + + + std::deque< std::string > uri_; +}; + + +} + + +#endif diff --git a/externals/hermes/source/externals/essentials/source/essentials/source/conversion.cpp b/externals/hermes/source/externals/essentials/source/essentials/source/conversion.cpp new file mode 100644 index 0000000..ed91544 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/source/conversion.cpp @@ -0,0 +1,103 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/conversion.hpp" + +#include +#include +#include + +#ifndef SX_CPP03_BOOST + #include +#else + #include +#endif + + +namespace sxe +{ + + +bool string_to_int( const char* const _int_as_string, int& _result ) +{ + bool success = false; + try + { +#ifndef SX_CPP03_BOOST + _result = std::stoi( std::string( _int_as_string ) ); + success = true; +#else + std::istringstream is( _int_as_string ); + if (is >> _result) + { + success = true; + } + else + { + success = false; + } +#endif + + } + catch ( const std::invalid_argument& ) + { + success = false; + } + catch ( const std::out_of_range& ) + { + success = false; + } + return( success ); +} + + +std::string to_string( const sxe::uint32_t _value ) +{ +#ifndef SX_CPP03_BOOST + return( std::to_string( _value ) ); +#else + std::ostringstream ostr; + ostr << _value; + return( ostr.str() ); +#endif +} + + +std::string to_string( const int _value ) +{ +#ifndef SX_CPP03_BOOST + return( std::to_string( _value ) ); +#else + std::ostringstream ostr; + ostr << _value; + return( ostr.str() ); +#endif +} + + +// cppcheck-suppress unusedFunction +std::string to_upper( const std::string& _value ) +{ + std::string value_caps = _value; + std::transform( value_caps.begin(), value_caps.end(), value_caps.begin(), static_cast< int( *)( int ) >( ::std::toupper ) ); + return( value_caps ); +} + + +// cppcheck-suppress unusedFunction +std::string to_lower( const std::string& _value ) +{ + std::string value_to_lower = _value; + std::transform( value_to_lower.begin(), value_to_lower.end(), value_to_lower.begin(), static_cast< int( *)( int ) >( ::std::tolower ) ); + return( value_to_lower ); +} + + +} diff --git a/externals/hermes/source/externals/essentials/source/essentials/source/essentials_version.cpp b/externals/hermes/source/externals/essentials/source/essentials/source/essentials_version.cpp new file mode 100644 index 0000000..7279071 --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/source/essentials_version.cpp @@ -0,0 +1,74 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "essentials/essentials_version.hpp" + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/build_number.hpp" +#include "essentials/sxprintf.hpp" + + +namespace sxe +{ + + +namespace version +{ + + +namespace +{ + + +const sxe::uint16_t VERSION_MAJOR( 1 ); +const sxe::uint16_t VERSION_MINOR( 3 ); +const sxe::uint16_t VERSION_PATCH( 2 ); + + +} + + +// cppcheck-suppress unusedFunction +void log_version() +{ + std::cout << sxe::sxprintf( "essentials library version %.%.%.%.", get_major_version(), + get_minor_version(), get_patch_version(), get_build_number() ) << std::endl; +} + + +sxe::uint16_t get_major_version() +{ + return( VERSION_MAJOR ); +} + + +sxe::uint16_t get_minor_version() +{ + return( VERSION_MINOR ); +} + + +sxe::uint16_t get_patch_version() +{ + return( VERSION_PATCH ); +} + + +sxe::uint16_t get_build_number() +{ + return( BUILD_NUMBER ); +} + + +} + + +} diff --git a/externals/hermes/source/externals/essentials/source/essentials/source/format_settings.cpp b/externals/hermes/source/externals/essentials/source/essentials/source/format_settings.cpp new file mode 100644 index 0000000..0417c8a --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/source/format_settings.cpp @@ -0,0 +1,32 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "essentials/format_settings.hpp" + + +namespace sxe +{ + + +format_settings::format_settings(): + format_string_(), + missing_closing_bracket_( false ), + correct_( false ), + hex_( false ), + pad_zeros_( false ), + places_set_( false ), + places_( 0 ), + decimal_places_set_( false ), + decimal_places_( 0 ) +{ + // Nothing to do... +} + + +} diff --git a/externals/hermes/source/externals/essentials/source/essentials/source/sxprintf.cpp b/externals/hermes/source/externals/essentials/source/essentials/source/sxprintf.cpp new file mode 100644 index 0000000..99844aa --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/source/sxprintf.cpp @@ -0,0 +1,628 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/sxprintf.hpp" + +#include + +#include "essentials/base.hpp" +#include "essentials/conversion.hpp" + + +namespace sxe +{ + + +namespace +{ + + + const char MISSING_PARAMETERS_MESSAGE[] = "[Missing parameter!]"; + const char MISSING_TERMINATOR[] = "[Missing output modifier terminator!]"; + const char ILLEGAL_MODIFIER[] = "[Illegal output modifier!]"; + const char POINT = '.'; + const char ZERO = '0'; + const char X = 'x'; + const char CAPS_X = 'X'; + + +} + + +const char PLACE_HOLDER = '%'; +const char* const SUPERFLUOUS_PARAMETER_START = "[Superfluous parameter: "; +const char SUPERFLUOUS_PARAMETER_END = ']'; +const char OPENING_SQUARE_BRACKET = '['; +const char CLOSING_SQUARE_BRACKET = ']'; + + +// cppcheck-suppress unusedFunction +std::ostream& operator<<( std::ostream& _os, const sxe::format_settings& _format ) +{ + if( !_format.correct_ ) + { + _os << ILLEGAL_MODIFIER; + } + else if( _format.missing_closing_bracket_ ) + { + _os << MISSING_TERMINATOR; + } + else + { + if( _format.hex_ ) + { + _os << std::hex; + _os << std::showbase; + _os.fill( '0' ); + } + else + { + if( _format.pad_zeros_ ) + { + _os.fill( '0' ); + } + + if( _format.places_set_ ) + { + _os.width( _format.places_ ); + } + + if( _format.decimal_places_set_ ) + { + _os.precision( _format.decimal_places_ ); + } + } + } + + return( _os ); +} + + +bool is_allowed_char( const char _char ) +{ + const bool success = ( std::isdigit( _char ) || ( X == _char ) || ( CAPS_X == _char ) ); + return( success ); +} + + +sxe::format_settings parse_format_string( const char** const _format ) +{ + sxe::format_settings format_settings; + format_settings.correct_ = true; + SX_ASSERT( ( OPENING_SQUARE_BRACKET == **_format ), "Format string to parse doesn't start with [." ); + ++*_format; + format_settings.missing_closing_bracket_ = true; + bool point_found = false; + const char* text_before_point = *_format; + std::size_t text_before_point_size = 0; + const char* text_after_point = SX_NULLPTR; + std::size_t text_after_point_size = 0; + while( **_format ) + { + if( CLOSING_SQUARE_BRACKET == **_format ) + { + format_settings.missing_closing_bracket_ = false; + break; + } + else + if( POINT == **_format ) + { + if( point_found ) + { + format_settings.correct_ = false; + break; + } + else + { + point_found = true; + text_after_point = ( *_format ) + 1; + text_after_point_size = 0; + } + } + else + { + const char _text_char = **_format; + if( is_allowed_char( _text_char ) ) + { + if( point_found ) + { + ++text_after_point_size; + } + else + { + ++text_before_point_size; + } + } + else + { + format_settings.correct_ = false; + break; + } + } + + ++( *_format ); + } + + SX_ASSERT( text_before_point, "Logic error parsing format string!" ); + if( ( 0 == text_before_point_size ) && ( 0 == text_after_point_size ) ) + { + format_settings.correct_ = false; + } + + if( ( !format_settings.missing_closing_bracket_ ) && format_settings.correct_ ) + { + if( ( 0 < text_before_point_size ) && ( ( X == text_before_point[ 0 ] ) || ( CAPS_X == text_before_point[ 0 ] ) ) ) + { + format_settings.hex_ = true; + ++text_before_point; + --text_before_point_size; + } + + if( ( 0 < text_before_point_size ) && ( ZERO == text_before_point[ 0 ] ) ) + { + format_settings.pad_zeros_ = true; + ++text_before_point; + --text_before_point_size; + } + + if( 0 < text_before_point_size ) + { + format_settings.places_set_ = true; + if( !string_to_int( text_before_point, format_settings.places_ ) ) + { + format_settings.correct_ = false; + } + } + + if( 0 < text_after_point_size ) + { + SX_ASSERT( text_after_point, "Logic error parsing format string!" ); + format_settings.decimal_places_set_ = true; + if( !string_to_int( text_after_point, format_settings.decimal_places_ ) ) + { + format_settings.correct_ = false; + } + } + } + + return( format_settings ); +} + + +#ifdef SX_CPP03_BOOST + + +void print_superfluous_parameters( std::ostream& _os, const value_types& _values, value_types::const_iterator& _position ) +{ + while( _position != _values.end() ) + { + print_superfluous_parameters( _os, *_position ); + ++_position; + } +} + + +#endif + + +void sxprintf( std::ostream& _os, const char* _format ) +{ + while( *_format ) + { + if( PLACE_HOLDER == *_format ) + { + if( PLACE_HOLDER == *( _format + 1 ) ) + { + ++_format; + } + else + { + _os << MISSING_PARAMETERS_MESSAGE; + } + } + _os << *_format++; + } +} + + +#ifdef SX_CPP03_BOOST + + +std::string sxprintf(const char* const _format) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9); + return( target_string_stream.str() ); +} + + +std::string sxprintf(const char* const _format, const value_type& _value1, const value_type& _value2, const value_type& _value3, + const value_type& _value4, const value_type& _value5, const value_type& _value6, const value_type& _value7, const value_type& _value8, + const value_type& _value9, const value_type& _value10) +{ + std::stringstream target_string_stream; + sxprintf(target_string_stream, _format, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10); + return( target_string_stream.str() ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1 ) +{ + value_types values; + values.push_back( _value1 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + values.push_back( _value9 ); + sxprintf( _os, _format, values ); +} + + +void sxprintf( std::ostream& _os, const char* const _format, const value_type& _value1, const value_type& _value2, + const value_type& _value3, const value_type& _value4, const value_type& _value5, const value_type& _value6, + const value_type& _value7, const value_type& _value8, const value_type& _value9, const value_type& _value10 ) +{ + value_types values; + values.push_back( _value1 ); + values.push_back( _value2 ); + values.push_back( _value3 ); + values.push_back( _value4 ); + values.push_back( _value5 ); + values.push_back( _value6 ); + values.push_back( _value7 ); + values.push_back( _value8 ); + values.push_back( _value9 ); + values.push_back( _value10 ); + sxprintf( _os, _format, values ); +} + + +const char* sxprintf_impl( std::ostream& _os, const char* _format, value_types::const_iterator& _position, + const value_types::const_iterator _end, bool& printed ) +{ + while (*_format) + { + if (PLACE_HOLDER == *_format) + { + if (PLACE_HOLDER == *( _format + 1 )) + { + ++_format; // skip first place holder + _os << *_format++; // output of the second place holder + } + else + { + if (OPENING_SQUARE_BRACKET == *( _format + 1 )) + { + ++_format; + const sxe::format_settings format_settings = sxe::parse_format_string(&_format); + const std::ios_base::fmtflags stream_flags = _os.flags(); + const char streafill_ = _os.fill(); + _os << format_settings; + print_value_type_value( _os, *_position ); + _os.flags(stream_flags); + _os.fill(streafill_); + printed = true; + if( !format_settings.missing_closing_bracket_ ) + { + if( CLOSING_SQUARE_BRACKET == *( _format ) ) + { + ++_format; + } + } + else + { + if( !format_settings.correct_ ) + { + ++_format; + } + } + } + else + { + print_value_type_value( _os, *_position ); + printed = true; + ++_format; + break; + } + + if( _position + 1 != _end ) + { + if( *_format != '\0' ) + { + ++_position; + _format = sxprintf_impl( _os, _format, _position, _end, printed ); + } + } + return( _format ); + } + } + else + { + _os << *_format++; + } + } + return ( _format ); +} + + +void sxprintf( std::ostream& _os, const char * const _format, const value_types& _values ) +{ + SX_ASSERT( _format, "No format string to parse was passed!" ); + const char* current_position = _format; + + value_types::const_iterator _end = _values.end(); + value_types::const_iterator _position = _values.begin(); + while( _position != _end ) + { + bool printed = false; + current_position = sxprintf_impl( _os, current_position, _position, _end, printed ); + if( printed ) + { + ++_position; + } + if( current_position[0] == '\0' ) + { + break; + } + } + + sxprintf( _os, current_position ); + + if( _position != _end ) + { + print_superfluous_parameters( _os, _values, _position ); + } +} + + +void print_value_type_value( std::ostream& _os, const value_type& _value ) +{ + const std::type_info& type_info = _value.type(); + + if( type_info == typeid ( bool ) ) + { + stream_writer< bool >::print( _os, boost::get< bool >( _value ) ); + } + else if( type_info == typeid ( int ) ) + { + stream_writer< int >::print( _os, boost::get< int >( _value ) ); + } + else if( type_info == typeid ( unsigned int ) ) + { + stream_writer< unsigned int >::print( _os, boost::get< unsigned int >( _value ) ); + } + else if( type_info == typeid ( sxe::int8_t ) ) + { + stream_writer< sxe::int8_t >::print( _os, boost::get< sxe::int8_t >( _value ) ); + } + else if (type_info == typeid ( sxe::uint8_t )) + { + stream_writer< sxe::uint8_t >::print(_os, boost::get< sxe::uint8_t >(_value)); + } + else if( type_info == typeid ( sxe::uint16_t ) ) + { + stream_writer< sxe::uint16_t >::print( _os, boost::get< sxe::uint16_t >( _value ) ); + } + else if( type_info == typeid ( sxe::uint32_t ) ) + { + stream_writer< sxe::uint32_t >::print( _os, boost::get< sxe::uint32_t >( _value ) ); + } + else if( type_info == typeid ( std::string ) ) + { + stream_writer< std::string >::print( _os, boost::get< std::string >( _value ) ); + } + else if( type_info == typeid ( std::size_t ) ) + { + stream_writer< std::size_t >::print( _os, boost::get< std::size_t >( _value ) ); + } + else if( type_info == typeid ( const char* ) ) + { + stream_writer< const char* >::print( _os, boost::get< const char* >( _value ) ); + } + else if( type_info == typeid ( boost::int_least64_t ) ) + { + stream_writer< boost::int_least64_t >::print( _os, boost::get< boost::int_least64_t >( _value ) ); + } + else if( type_info == typeid ( double ) ) + { + stream_writer< double >::print( _os, boost::get< double >( _value ) ); + } +} + + +#endif + + +} diff --git a/externals/hermes/source/externals/essentials/source/essentials/source/uri.cpp b/externals/hermes/source/externals/essentials/source/essentials/source/uri.cpp new file mode 100644 index 0000000..1460efb --- /dev/null +++ b/externals/hermes/source/externals/essentials/source/essentials/source/uri.cpp @@ -0,0 +1,136 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex essentials library (http://essentials.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://essentials.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "essentials/uri.hpp" + +#include +#include + +#include "essentials/base.hpp" + + +namespace sxe +{ + + +uri::uri( const std::string& _uri ) + : uri_() +{ + split_string_to_uri_segments( _uri ); +} + + +uri::~uri() SX_NOEXCEPT +{ + // Nothing to do... +} + + +bool uri::is_empty() const +{ + return( uri_.empty() ); +} + + +const std::string uri::to_string() const +{ + return( build_uri() ); +} + + +const std::string& uri::get_front() const +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + return( uri_.front() ); +} + + +const std::string& uri::get_back() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + return( uri_.back() ); +} + + +void uri::push_front( const std::string& _segment ) +{ + uri_.push_front( _segment ); +} + + +void uri::push_back( const std::string& _segment ) +{ + uri_.push_back( _segment ); +} + + +void uri::pop_front() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + uri_.pop_front(); +} + + +void uri::pop_back() +{ + SX_ASSERT( !uri_.empty(), "Uri is empty!" ); + uri_.pop_back(); +} + + +size_t uri::size() const +{ + return( uri_.size() ); +} + + +const std::string uri::build_uri() const +{ + std::stringstream uri; + + SX_FOR( const std::string& uri_element, uri_ ) + { + uri << URI_DELIMITER << uri_element; + } + + return( uri.str() ); +} + + +void uri::split_string_to_uri_segments( const std::string& _uri ) +{ + std::string uri = _uri; + if( !_uri.empty() ) + { + if( URI_DELIMITER == _uri[ 0 ] ) + { + uri = _uri.substr( 1 ); + } + + std::string::size_type start = 0; + std::string::size_type end = uri.find( URI_DELIMITER ); + while( end != std::string::npos ) + { + const std::string& segment = uri.substr( start, end - start ); + uri_.push_back( segment ); + start = ++end; + end = uri.find( URI_DELIMITER, end ); + } + + const std::string& last_segment = uri.substr( start ); + if( last_segment[ 0 ] != URI_DELIMITER ) + { + uri_.push_back( last_segment ); + } + } +} + + +} diff --git a/externals/hermes/source/hermes.sln b/externals/hermes/source/hermes.sln new file mode 100644 index 0000000..223e332 --- /dev/null +++ b/externals/hermes/source/hermes.sln @@ -0,0 +1,109 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2009 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hermes", "hermes\hermes.vcxproj", "{392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}" + ProjectSection(ProjectDependencies) = postProject + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "externals", "externals", "{4A4EEC79-D055-4331-B446-D8A58CC659D5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials", "externals\essentials\source\essentials\essentials.vcxproj", "{132F81F8-46DA-49D0-9071-D70BC087B38C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build_tools", "build_tools", "{FE101D23-F70F-4393-A1AB-0BAF06E53A5A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CMake", "CMake", "{C0BCEDFB-2D5B-4E91-92C1-1B577B58FB38}" + ProjectSection(SolutionItems) = preProject + CMakeLists.txt = CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{3A9DA4AB-5D0F-41F6-BDDC-6847B99F209A}" + ProjectSection(SolutionItems) = preProject + CMakeLists.txt = CMakeLists.txt + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hermes", "hermes", "{E3E33A7D-DB29-4F8A-BB90-37B506136EBD}" + ProjectSection(SolutionItems) = preProject + hermes\CMakeLists.txt = hermes\CMakeLists.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug - C++ 03|x64 = Debug - C++ 03|x64 + Debug - C++ 03|x86 = Debug - C++ 03|x86 + Debug - VS 2015|x64 = Debug - VS 2015|x64 + Debug - VS 2015|x86 = Debug - VS 2015|x86 + Debug - VS 2017|x64 = Debug - VS 2017|x64 + Debug - VS 2017|x86 = Debug - VS 2017|x86 + Release - C++ 03|x64 = Release - C++ 03|x64 + Release - C++ 03|x86 = Release - C++ 03|x86 + Release - VS 2015|x64 = Release - VS 2015|x64 + Release - VS 2015|x86 = Release - VS 2015|x86 + Release - VS 2017|x64 = Release - VS 2017|x64 + Release - VS 2017|x86 = Release - VS 2017|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x86.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x86.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x86.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x86.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x86.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x86.Build.0 = Release - VS 2017|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {4A4EEC79-D055-4331-B446-D8A58CC659D5} + {C0BCEDFB-2D5B-4E91-92C1-1B577B58FB38} = {FE101D23-F70F-4393-A1AB-0BAF06E53A5A} + {3A9DA4AB-5D0F-41F6-BDDC-6847B99F209A} = {C0BCEDFB-2D5B-4E91-92C1-1B577B58FB38} + {E3E33A7D-DB29-4F8A-BB90-37B506136EBD} = {3A9DA4AB-5D0F-41F6-BDDC-6847B99F209A} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DADC4E4C-C2F5-414A-9C22-D455C46495D0} + EndGlobalSection +EndGlobal diff --git a/externals/hermes/source/hermes/CMakeLists.txt b/externals/hermes/source/hermes/CMakeLists.txt new file mode 100644 index 0000000..8cbf683 --- /dev/null +++ b/externals/hermes/source/hermes/CMakeLists.txt @@ -0,0 +1,57 @@ +cmake_minimum_required(VERSION 2.8) + +project(hermes) + +set(CMAKE_VERBOSE_MAKEFILE, 1) + +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +file(GLOB hermes_SRC "./include/hermes/*.hpp" "./source/*.cpp") + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(./../CMakeHelpers/addSpecificFlags.cmake) +include(./../CMakeHelpers/addSeadexOptions.cmake) + +include_directories("./include") +include_directories("./../externals/essentials/source/essentials/include") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") + +set(link_libraries_list "") + +if("${CPP_VERSION}" STREQUAL "03") + use_boost_libraries(link_libraries_list) +endif() + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library_for_linking(link_libraries_list libessentials) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library_for_linking(link_libraries_list essentials) +endif() + +message(STATUS "hermes linking to libraries: ${link_libraries_list}" ) + + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library(libhermes ${LINK_TYPE} ${hermes_SRC}) + target_link_libraries(libhermes LINK_PUBLIC ${link_libraries_list}) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library(hermes STATIC ${hermes_SRC}) + target_link_libraries(hermes LINK_PUBLIC ${link_libraries_list}) +endif() + +file(GLOB hermes_hpp "./include/*.hpp") +install(FILES ${hermes_hpp} DESTINATION include/hermes/include) + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + install(TARGETS libhermes DESTINATION lib) + set_target_properties(libhermes PROPERTIES PREFIX "") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + install(TARGETS hermes DESTINATION lib) + set_target_properties(hermes PROPERTIES PREFIX "") +endif() diff --git a/externals/hermes/source/hermes/hermes.vcxproj b/externals/hermes/source/hermes/hermes.vcxproj new file mode 100644 index 0000000..9cf6406 --- /dev/null +++ b/externals/hermes/source/hermes/hermes.vcxproj @@ -0,0 +1,566 @@ + + + + + Debug - C++ 03 + Win32 + + + Debug - C++ 03 + x64 + + + Debug - Clang + Win32 + + + Debug - Clang + x64 + + + Debug - VS 2013 + Win32 + + + Debug - VS 2013 + x64 + + + Debug - VS 2015 + Win32 + + + Debug - VS 2015 + x64 + + + Debug - VS 2017 + Win32 + + + Release - C++ 03 + Win32 + + + Release - C++ 03 + x64 + + + Release - Clang + Win32 + + + Release - Clang + x64 + + + Release - VS 2015 + Win32 + + + Release - VS 2015 + x64 + + + Release - VS 2017 + Win32 + + + Debug - VS 2017 + x64 + + + Release - VS 2017 + x64 + + + + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} + hermes + 8.1 + + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + StaticLibrary + true + v141 + MultiByte + + + StaticLibrary + true + v141_clang_c2 + MultiByte + + + StaticLibrary + true + v140 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + true + v120 + MultiByte + + + StaticLibrary + false + v141 + true + MultiByte + + + StaticLibrary + false + v141_clang_c2 + true + MultiByte + + + StaticLibrary + false + v140 + true + MultiByte + + + StaticLibrary + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + Disabled + true + + + true + + + + + MaxSpeed + true + true + true + + + true + true + true + + + + + MaxSpeed + true + true + true + + + true + true + true + + + + + MaxSpeed + true + true + true + + + true + true + true + + + + + MaxSpeed + true + true + true + + + true + true + true + + + + + MaxSpeed + true + true + true + + + true + true + true + MachineX64 + + + + + MaxSpeed + true + true + true + + + true + true + true + MachineX64 + + + + + MaxSpeed + true + true + true + + + true + true + true + MachineX64 + + + + + MaxSpeed + true + true + true + + + true + true + true + MachineX64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externals/hermes/source/hermes/hermes.vcxproj.filters b/externals/hermes/source/hermes/hermes.vcxproj.filters new file mode 100644 index 0000000..f4db087 --- /dev/null +++ b/externals/hermes/source/hermes/hermes.vcxproj.filters @@ -0,0 +1,146 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {d2e47838-b932-42ce-a439-fff0ae19104b} + + + {31402a15-9737-4135-87ad-db03f0f6d7a2} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + licenses\hermes + + + licenses\hermes + + + licenses\hermes + + + licenses\hermes + + + licenses\hermes + + + \ No newline at end of file diff --git a/externals/hermes/include/hermes/build_number.hpp b/externals/hermes/source/hermes/include/hermes/build_number.hpp similarity index 93% rename from externals/hermes/include/hermes/build_number.hpp rename to externals/hermes/source/hermes/include/hermes/build_number.hpp index 61892f9..abc516c 100644 --- a/externals/hermes/include/hermes/build_number.hpp +++ b/externals/hermes/source/hermes/include/hermes/build_number.hpp @@ -1,35 +1,35 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef BUILD_NUMBER_D6FF600D_5F67_43E8_A8CD_7BEE789F3AD4 -#define BUILD_NUMBER_D6FF600D_5F67_43E8_A8CD_7BEE789F3AD4 - - -#include "essentials/compatibility/compatibility.hpp" - - -namespace hermes -{ - - -namespace version -{ - - - const sxe::uint16_t BUILD_NUMBER( 66 ); - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef BUILD_NUMBER_D6FF600D_5F67_43E8_A8CD_7BEE789F3AD4 +#define BUILD_NUMBER_D6FF600D_5F67_43E8_A8CD_7BEE789F3AD4 + + +#include "essentials/compatibility/compatibility.hpp" + + +namespace hermes +{ + + +namespace version +{ + + + const sxe::uint16_t BUILD_NUMBER( 101 ); + + +} + + +} + + +#endif diff --git a/externals/hermes/include/hermes/color.hpp b/externals/hermes/source/hermes/include/hermes/color.hpp similarity index 96% rename from externals/hermes/include/hermes/color.hpp rename to externals/hermes/source/hermes/include/hermes/color.hpp index 085e25b..7869745 100644 --- a/externals/hermes/include/hermes/color.hpp +++ b/externals/hermes/source/hermes/include/hermes/color.hpp @@ -1,95 +1,95 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef COLOR_63B5B1DB_D383_404D_93EF_AB2BC3A0D286 -#define COLOR_63B5B1DB_D383_404D_93EF_AB2BC3A0D286 - -#include "hermes_backward_compatibility.hpp" - -#ifndef SX_NO_LOGGING - -namespace hermes -{ - - -#ifndef SX_CPP03_BOOST - - - //!\enum color - //!\brief Enumeration for predefined colors. - enum class color - { - C_BLACK = 0, C_WHITE = 15, C_DARK_WHITE = 7, C_BLUE = 9, C_DARK_BLUE = 1, C_GREEN = 10, C_DARK_GREEN = 2, C_RED = 12, - C_DARK_RED = 4, C_YELLOW = 14, C_DARK_YELLOW = 6, C_AQUA = 3, C_GRAY = 8, C_MAGENTA = 13, C_CYAN = 11 - }; - - -#else - - - //!\struct color - //!\brief Structure representing a predefined color (enum wrapper for C++11 enum class like behavior). - struct color - { - //!\enum color - //!\brief Enumeration for predefined colors. - enum inner - { - C_BLACK = 0, C_WHITE = 15, C_DARK_WHITE = 7, C_BLUE = 9, C_DARK_BLUE = 1, C_GREEN = 10, C_DARK_GREEN = 2, C_RED = 12, - C_DARK_RED = 4, C_YELLOW = 14, C_DARK_YELLOW = 6, C_AQUA = 3, C_GRAY = 8, C_MAGENTA = 13, C_CYAN = 11 - }; - - - //!\brief Constructor. Default value is white. - color() : value_( C_WHITE ) - { - // Nothing to do... - } - - - //!\brief Constructor - //!\param _value Given color value that is represented by the structure. - color( const inner _value ) : value_( _value ) - { - // Nothing to do... - } - - - //!\brief Constructor - //!\param _color Given color structure containing the color that is represented by the structure. - color( const color& _color ) : value_( _color.value_ ) - { - // Nothing to do... - } - - - //!\brief Get the color value represented by the structure. - operator inner() const - { - return ( value_ ); - } - - - //!\brief Color represented by the structure. - inner value_; - - }; - - -#endif - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef COLOR_63B5B1DB_D383_404D_93EF_AB2BC3A0D286 +#define COLOR_63B5B1DB_D383_404D_93EF_AB2BC3A0D286 + +#include "hermes_backward_compatibility.hpp" + +#ifndef SX_NO_LOGGING + +namespace hermes +{ + + +#ifndef SX_CPP03_BOOST + + + //!\enum color + //!\brief Enumeration for predefined colors. + enum class color + { + C_BLACK = 0, C_WHITE = 15, C_DARK_WHITE = 7, C_BLUE = 9, C_DARK_BLUE = 1, C_GREEN = 10, C_DARK_GREEN = 2, C_RED = 12, + C_DARK_RED = 4, C_YELLOW = 14, C_DARK_YELLOW = 6, C_AQUA = 3, C_GRAY = 8, C_MAGENTA = 13, C_CYAN = 11 + }; + + +#else + + + //!\struct color + //!\brief Structure representing a predefined color (enum wrapper for C++11 enum class like behavior). + struct color + { + //!\enum color + //!\brief Enumeration for predefined colors. + enum inner + { + C_BLACK = 0, C_WHITE = 15, C_DARK_WHITE = 7, C_BLUE = 9, C_DARK_BLUE = 1, C_GREEN = 10, C_DARK_GREEN = 2, C_RED = 12, + C_DARK_RED = 4, C_YELLOW = 14, C_DARK_YELLOW = 6, C_AQUA = 3, C_GRAY = 8, C_MAGENTA = 13, C_CYAN = 11 + }; + + + //!\brief Constructor. Default value is white. + color() : value_( C_WHITE ) + { + // Nothing to do... + } + + + //!\brief Constructor + //!\param _value Given color value that is represented by the structure. + color( const inner _value ) : value_( _value ) + { + // Nothing to do... + } + + + //!\brief Constructor + //!\param _color Given color structure containing the color that is represented by the structure. + color( const color& _color ) : value_( _color.value_ ) + { + // Nothing to do... + } + + + //!\brief Get the color value represented by the structure. + operator inner() const + { + return ( value_ ); + } + + + //!\brief Color represented by the structure. + inner value_; + + }; + + +#endif + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/color_mapping.hpp b/externals/hermes/source/hermes/include/hermes/color_mapping.hpp similarity index 96% rename from externals/hermes/include/hermes/color_mapping.hpp rename to externals/hermes/source/hermes/include/hermes/color_mapping.hpp index 12cd0eb..ba0c9a3 100644 --- a/externals/hermes/include/hermes/color_mapping.hpp +++ b/externals/hermes/source/hermes/include/hermes/color_mapping.hpp @@ -1,62 +1,62 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef COLOR_MAPPING_A8F877D1_966B_463B_AE26_BD54CB2FEC35 -#define COLOR_MAPPING_A8F877D1_966B_463B_AE26_BD54CB2FEC35 - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include - -#include "essentials/non_copyable.hpp" -#include "color.hpp" -#include "log_level.hpp" - - -namespace hermes -{ - - -//!\class color_mapping -//!\brief Class for mapping colors to log levels. -class color_mapping SX_FINAL -{ -public: - //!\typedef color_map - //!\brief Alias for the map of log levels to colors. - typedef std::map< log_level, color > color_map; - - //!\brief Constructor. - color_mapping(); - ~color_mapping() SX_NOEXCEPT; - SX_NO_COPY(color_mapping) - - //!\brief Method for getting the color associated with the given log level. - //!\param _log_level The log level for which the color is requested. - //!\return Color value associated with the given log level. - color get_color( const log_level _log_level ) const; - - -private: - color_map color_map_; -}; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef COLOR_MAPPING_A8F877D1_966B_463B_AE26_BD54CB2FEC35 +#define COLOR_MAPPING_A8F877D1_966B_463B_AE26_BD54CB2FEC35 + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include + +#include "essentials/non_copyable.hpp" +#include "color.hpp" +#include "log_level.hpp" + + +namespace hermes +{ + + +//!\class color_mapping +//!\brief Class for mapping colors to log levels. +class color_mapping SX_FINAL +{ +public: + //!\typedef color_map + //!\brief Alias for the map of log levels to colors. + typedef std::map< log_level, color > color_map; + + //!\brief Constructor. + color_mapping(); + ~color_mapping() SX_NOEXCEPT; + SX_NO_COPY(color_mapping) + + //!\brief Method for getting the color associated with the given log level. + //!\param _log_level The log level for which the color is requested. + //!\return Color value associated with the given log level. + color get_color( const log_level _log_level ) const; + + +private: + color_map color_map_; +}; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/cout_logger.hpp b/externals/hermes/source/hermes/include/hermes/cout_logger.hpp similarity index 96% rename from externals/hermes/include/hermes/cout_logger.hpp rename to externals/hermes/source/hermes/include/hermes/cout_logger.hpp index cd6d111..1355a3b 100644 --- a/externals/hermes/include/hermes/cout_logger.hpp +++ b/externals/hermes/source/hermes/include/hermes/cout_logger.hpp @@ -1,63 +1,63 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef COUT_LOGGER_170B8470_DB09_43CF_A547_D6C928D5121F -#define COUT_LOGGER_170B8470_DB09_43CF_A547_D6C928D5121F - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include "logger.hpp" -#include "color_mapping.hpp" - - -namespace hermes -{ - - -//!\class cout_logger -//!\brief Class for printing messages in the console via cout. -class cout_logger: - public logger -{ -public: - //!\brief Constructor - cout_logger(); - virtual ~cout_logger() SX_NOEXCEPT SX_OVERRIDE - { - // Nothing to do... - } - - - SX_NO_COPY(cout_logger) - - //!\brief Prints the message. - //!\param _log_message Log message that will be printed. - //!\return void - virtual void log( const log_message& _log_message ) SX_OVERRIDE; - - -private: - void log_level_as_message( const hermes::log_level _log_level ) const; - - color_mapping color_mapping_; -}; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef COUT_LOGGER_170B8470_DB09_43CF_A547_D6C928D5121F +#define COUT_LOGGER_170B8470_DB09_43CF_A547_D6C928D5121F + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include "logger.hpp" +#include "color_mapping.hpp" + + +namespace hermes +{ + + +//!\class cout_logger +//!\brief Class for printing messages in the console via cout. +class cout_logger: + public logger +{ +public: + //!\brief Constructor + cout_logger(); + virtual ~cout_logger() SX_NOEXCEPT SX_OVERRIDE + { + // Nothing to do... + } + + + SX_NO_COPY(cout_logger) + + //!\brief Prints the message. + //!\param _log_message Log message that will be printed. + //!\return void + virtual void log( const log_message& _log_message ) SX_OVERRIDE; + + +private: + void log_level_as_message( const hermes::log_level _log_level ) const; + + color_mapping color_mapping_; +}; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/file_logger.hpp b/externals/hermes/source/hermes/include/hermes/file_logger.hpp similarity index 97% rename from externals/hermes/include/hermes/file_logger.hpp rename to externals/hermes/source/hermes/include/hermes/file_logger.hpp index f563a9c..145e6df 100644 --- a/externals/hermes/include/hermes/file_logger.hpp +++ b/externals/hermes/source/hermes/include/hermes/file_logger.hpp @@ -1,84 +1,84 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef FILE_LOGGER_0EE18DBE_D91D_407D_BF95_0EBC8A84EBD4 -#define FILE_LOGGER_0EE18DBE_D91D_407D_BF95_0EBC8A84EBD4 - - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include "logger.hpp" -#include "essentials/exception_template.hpp" - - -namespace hermes -{ - - -//!\class file_logger -//!\brief Class for writing messages to a log file. It rotates the log file if a certain size limit is met. Naming and -//!location of the log files can be customized. Also the number of log files in rotation can be set. -class file_logger: - public logger -{ -public: - //!\brief Exception class of the file_logger. - SX_EXCEPTION( exception ) - - //!\brief Constructor - //!\param _max_file_size_in_bytes Maximum size of a log file in bytes. - //!\param _log_files_directory Folder where the log files are stored. - //!\param _name_suffix The suffix for the log files. - //!\param _name_extension The extension of the log files. - //!\param _max_file_number The maximum number of log files. - //!\param _throw_on_error Flag for throwing an exception on error. Default is true. - explicit file_logger( const size_t _max_file_size_in_bytes, const std::string& _log_files_directory, - const std::string& _name_suffix, const std::string& _name_extension, const unsigned _max_file_number, - const bool _throw_on_error = true ); - virtual ~file_logger() SX_NOEXCEPT SX_OVERRIDE; - SX_NO_COPY(file_logger) - - //!\brief Writes the message. - //!\param _log_message Log message that will be written. - //!\return void - virtual void log( const log_message& _log_message ) SX_OVERRIDE; - - -private: - std::string get_log_file_name_with_index( const unsigned _index ) const; - std::string get_working_log_file_name() const; - void log_into_file( const std::string& _message ) const; - void rotate_if_necessary() const; - void rename_files() const; - void rename_file_if_exists( const std::string& _old_name, const std::string& _new_name ) const; - void delete_file( const std::string& _file_name ) const; - - - const size_t max_file_size_in_bytes_; - const std::string log_files_directory_; - const std::string name_sufix_; - const std::string name_extension_; - const unsigned max_file_number_; - const bool throw_on_error_; - std::string working_file_; -}; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef FILE_LOGGER_0EE18DBE_D91D_407D_BF95_0EBC8A84EBD4 +#define FILE_LOGGER_0EE18DBE_D91D_407D_BF95_0EBC8A84EBD4 + + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include "logger.hpp" +#include "essentials/exception_template.hpp" + + +namespace hermes +{ + + +//!\class file_logger +//!\brief Class for writing messages to a log file. It rotates the log file if a certain size limit is met. Naming and +//!location of the log files can be customized. Also the number of log files in rotation can be set. +class file_logger: + public logger +{ +public: + //!\brief Exception class of the file_logger. + SX_EXCEPTION( exception ) + + //!\brief Constructor + //!\param _max_file_size_in_bytes Maximum size of a log file in bytes. + //!\param _log_files_directory Folder where the log files are stored. + //!\param _name_suffix The suffix for the log files. + //!\param _name_extension The extension of the log files. + //!\param _max_file_number The maximum number of log files. + //!\param _throw_on_error Flag for throwing an exception on error. Default is true. + explicit file_logger( const size_t _max_file_size_in_bytes, const std::string& _log_files_directory, + const std::string& _name_suffix, const std::string& _name_extension, const unsigned _max_file_number, + const bool _throw_on_error = true ); + virtual ~file_logger() SX_NOEXCEPT SX_OVERRIDE; + SX_NO_COPY(file_logger) + + //!\brief Writes the message. + //!\param _log_message Log message that will be written. + //!\return void + virtual void log( const log_message& _log_message ) SX_OVERRIDE; + + +private: + std::string get_log_file_name_with_index( const unsigned _index ) const; + std::string get_working_log_file_name() const; + void log_into_file( const std::string& _message ) const; + void rotate_if_necessary() const; + void rename_files() const; + void rename_file_if_exists( const std::string& _old_name, const std::string& _new_name ) const; + void delete_file( const std::string& _file_name ) const; + + + const size_t max_file_size_in_bytes_; + const std::string log_files_directory_; + const std::string name_sufix_; + const std::string name_extension_; + const unsigned max_file_number_; + const bool throw_on_error_; + std::string working_file_; +}; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/file_system.hpp b/externals/hermes/source/hermes/include/hermes/file_system.hpp similarity index 97% rename from externals/hermes/include/hermes/file_system.hpp rename to externals/hermes/source/hermes/include/hermes/file_system.hpp index 2ec9753..3b4dd1e 100644 --- a/externals/hermes/include/hermes/file_system.hpp +++ b/externals/hermes/source/hermes/include/hermes/file_system.hpp @@ -1,45 +1,45 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef FILE_SYSTEM_E5395B2B_BD8A_46B9_831A_B9A24E8CEDC2 -#define FILE_SYSTEM_E5395B2B_BD8A_46B9_831A_B9A24E8CEDC2 - - -#include -#include - - -namespace hermes -{ - - -//!\fn get_file_size -//!\brief Get the size of the file with the given name. -//!\param _file_name Name of file for which the size is requested. -//!\return Size of the given file. -size_t get_file_size( const std::string& _file_name ); - -//!\fn does_file_exist -//!\brief Checks if the file with the given name exists. -//!\param _file_name Name of the file to be checked. -//!\return True if the given file exists, false otherwise. -bool does_file_exist( const std::string& _file_name ); - -//!\fn add_trailing_slash_to_directory_path -//!\brief Add trailing slash to the given path. -//!\param _path Path to which the trailing slash is added. -//!\return Path with trailing slash at the end. -std::string add_trailing_slash_to_directory_path( const std::string& _path ); - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef FILE_SYSTEM_E5395B2B_BD8A_46B9_831A_B9A24E8CEDC2 +#define FILE_SYSTEM_E5395B2B_BD8A_46B9_831A_B9A24E8CEDC2 + + +#include +#include + + +namespace hermes +{ + + +//!\fn get_file_size +//!\brief Get the size of the file with the given name. +//!\param _file_name Name of file for which the size is requested. +//!\return Size of the given file. +size_t get_file_size( const std::string& _file_name ); + +//!\fn does_file_exist +//!\brief Checks if the file with the given name exists. +//!\param _file_name Name of the file to be checked. +//!\return True if the given file exists, false otherwise. +bool does_file_exist( const std::string& _file_name ); + +//!\fn add_trailing_slash_to_directory_path +//!\brief Add trailing slash to the given path. +//!\param _path Path to which the trailing slash is added. +//!\return Path with trailing slash at the end. +std::string add_trailing_slash_to_directory_path( const std::string& _path ); + + +} + + +#endif diff --git a/externals/hermes/include/hermes/globals.hpp b/externals/hermes/source/hermes/include/hermes/globals.hpp similarity index 97% rename from externals/hermes/include/hermes/globals.hpp rename to externals/hermes/source/hermes/include/hermes/globals.hpp index 74ac1d4..3cb71a6 100644 --- a/externals/hermes/include/hermes/globals.hpp +++ b/externals/hermes/source/hermes/include/hermes/globals.hpp @@ -1,26 +1,26 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef GLOBALS_A818BE8A_F8B8_44CA_9596_D6F248E8A175 -#define GLOBALS_A818BE8A_F8B8_44CA_9596_D6F248E8A175 - - -namespace hermes -{ - - -//!\brief Constant for width of the log level block. The log level block has a fixed width for better readability. -extern const int LOG_LEVEL_BLOCK_WIDTH; - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef GLOBALS_A818BE8A_F8B8_44CA_9596_D6F248E8A175 +#define GLOBALS_A818BE8A_F8B8_44CA_9596_D6F248E8A175 + + +namespace hermes +{ + + +//!\brief Constant for width of the log level block. The log level block has a fixed width for better readability. +extern const int LOG_LEVEL_BLOCK_WIDTH; + + +} + + +#endif diff --git a/externals/hermes/include/hermes/hermes_backward_compatibility.hpp b/externals/hermes/source/hermes/include/hermes/hermes_backward_compatibility.hpp similarity index 97% rename from externals/hermes/include/hermes/hermes_backward_compatibility.hpp rename to externals/hermes/source/hermes/include/hermes/hermes_backward_compatibility.hpp index 7780cd7..6fe7c84 100644 --- a/externals/hermes/include/hermes/hermes_backward_compatibility.hpp +++ b/externals/hermes/source/hermes/include/hermes/hermes_backward_compatibility.hpp @@ -1,29 +1,29 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef HERMES_BACKWARD_COMPATIBILITY_0C85D23F_60F8_43E6_A0AE_ABB9F0365630 -#define HERMES_BACKWARD_COMPATIBILITY_0C85D23F_60F8_43E6_A0AE_ABB9F0365630 - - -#ifdef Y_NO_LOGGING -#define SX_NO_LOGGING -#endif - - -#ifdef Y_NO_WINDOWS_H -#define SX_NO_WINDOWS_H -#endif - - -#define Y_LOG SX_LOG -#define Y_LOG_HEX SX_LOG_HEX - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef HERMES_BACKWARD_COMPATIBILITY_0C85D23F_60F8_43E6_A0AE_ABB9F0365630 +#define HERMES_BACKWARD_COMPATIBILITY_0C85D23F_60F8_43E6_A0AE_ABB9F0365630 + + +#ifdef Y_NO_LOGGING +#define SX_NO_LOGGING +#endif + + +#ifdef Y_NO_WINDOWS_H +#define SX_NO_WINDOWS_H +#endif + + +#define Y_LOG SX_LOG +#define Y_LOG_HEX SX_LOG_HEX + + +#endif diff --git a/externals/hermes/include/hermes/hermes_version.hpp b/externals/hermes/source/hermes/include/hermes/hermes_version.hpp similarity index 96% rename from externals/hermes/include/hermes/hermes_version.hpp rename to externals/hermes/source/hermes/include/hermes/hermes_version.hpp index fb0ec05..1192482 100644 --- a/externals/hermes/include/hermes/hermes_version.hpp +++ b/externals/hermes/source/hermes/include/hermes/hermes_version.hpp @@ -1,41 +1,41 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef VERSION_3B8BFD66_4CAA_4921_88C4_D49899FE2C59 -#define VERSION_3B8BFD66_4CAA_4921_88C4_D49899FE2C59 - - -#include "essentials/compatibility/compatibility.hpp" - - -namespace hermes -{ - - -namespace version -{ - - -void log_version(); - - -sxe::uint16_t get_major_version(); -sxe::uint16_t get_minor_version(); -sxe::uint16_t get_patch_version(); -sxe::uint16_t get_build_number(); - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef VERSION_3B8BFD66_4CAA_4921_88C4_D49899FE2C59 +#define VERSION_3B8BFD66_4CAA_4921_88C4_D49899FE2C59 + + +#include "essentials/compatibility/compatibility.hpp" + + +namespace hermes +{ + + +namespace version +{ + + +void log_version(); + + +sxe::uint16_t get_major_version(); +sxe::uint16_t get_minor_version(); +sxe::uint16_t get_patch_version(); +sxe::uint16_t get_build_number(); + + +} + + +} + + +#endif diff --git a/externals/hermes/include/hermes/log.hpp b/externals/hermes/source/hermes/include/hermes/log.hpp similarity index 96% rename from externals/hermes/include/hermes/log.hpp rename to externals/hermes/source/hermes/include/hermes/log.hpp index 0665dd7..b424043 100644 --- a/externals/hermes/include/hermes/log.hpp +++ b/externals/hermes/source/hermes/include/hermes/log.hpp @@ -1,152 +1,152 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_5AD3F1F5_0FC9_4D0E_8101_D9D70B8B1486 -#define LOG_5AD3F1F5_0FC9_4D0E_8101_D9D70B8B1486 - -#include "hermes_backward_compatibility.hpp" - - -#ifdef SX_NO_LOGGING - - -inline void parameter_muncher() -{ - // Nothing to do... -} - - -template< typename T, typename ... args > -void parameter_muncher( T, args ... _args ) -{ - parameter_muncher( _args... ); -} - - -//!\brief Macro that is used when SX_NO_LOGGING is defined and thus there should be no logging. Consumes all parameters -//!so no warnings occur because of unused parameters. The code does nothing and can (will) be removed by the optimizer. -//!\sa sxprintf -#define SX_LOG( _dummy, ... ) \ - do \ - {\ - parameter_muncher( __VA_ARGS__ ); \ - } \ - while( false ) - - -//!\brief Macro that is used when SX_NO_LOGGING is defined and thus there should be no logging. Consumes all parameters -//!so no warnings occur because of unused parameters. The code does nothing and can (will) be removed by the optimizer. -//!\sa sxprintf -#define SX_LOG_HEX( _dummy, ... ) \ - do \ - {\ - parameter_muncher( __VA_ARGS__ ); \ - } \ - while( false ) - - -#else - - -#ifndef SX_CPP03_BOOST - -//!\brief Create a log message. -//!\param _level The log level of the message. -//!\param ... Parameters that are inserted into the message. -//!\sa sxprintf -#define SX_LOG( _level, ... ) \ - do \ - { \ - hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); \ - if( _level <= l_log_manager.get_log_level() ) \ - { \ - l_log_manager.log( _level, hermes::log_manager::get_instance().get_timestamp(), __FILE__, __LINE__, __VA_ARGS__ ); \ - } \ - } \ - while( false ) - - -//!\brief Create a hex log message. -//!\param _level The log level of the message. -//!\param _heading The heading of the message. -//!\param _data The message of the log. -//!\param ... Parameters that are inserted into the message. -//!\sa sxprintf -#define SX_LOG_HEX( _level, _heading, _data, ... ) \ - do \ - { \ - hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); \ - if( _level <= l_log_manager.get_log_level() ) \ - { \ - const std::string l_heading(_heading);\ - const std::string l_data(_data);\ - const std::string l_message = l_heading + "\n" + l_data;\ - l_log_manager.log( _level, hermes::log_manager::get_instance().get_timestamp(), __FILE__, __LINE__, l_message, __VA_ARGS__ ); \ - } \ - } \ - while( false ) - - -//!\brief Create a log message and wait for the message to be written by the logger. -//!\param _level The log level of the message. -//!\param ... Parameters that are inserted into the message. -//!\sa sxprintf -#define SX_LOG_AND_WAIT( _level, ... ) \ - do \ - { \ - hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); \ - if( _level <= l_log_manager.get_log_level() ) \ - { \ - l_log_manager.log_and_wait( _level, hermes::log_manager::get_instance().get_timestamp(), __FILE__, __LINE__, __VA_ARGS__ ); \ - } \ - } \ - while( false ) - - -#else - - -#define SX_LOG hermes::log_helper( __FILE__, __LINE__).log -#define SX_LOG_AND_WAIT hermes::log_helper( __FILE__, __LINE__).log_and_wait - - -#endif - - -#endif - - -#ifndef SX_NO_LOGGING - - -#include "log_manager_template.hpp" -#include "std_timestamp_policy.hpp" - - -namespace hermes -{ - - -//!\brief An alias-declaration for the log manager template. -typedef hermes::log_manager_template< hermes::std_timestamp_policy > log_manager; - - -} - - -#ifdef SX_CPP03_BOOST -#include "log_helper.hpp" -#endif - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_5AD3F1F5_0FC9_4D0E_8101_D9D70B8B1486 +#define LOG_5AD3F1F5_0FC9_4D0E_8101_D9D70B8B1486 + +#include "hermes_backward_compatibility.hpp" + + +#ifdef SX_NO_LOGGING + + +inline void parameter_muncher() +{ + // Nothing to do... +} + + +template< typename T, typename ... args > +void parameter_muncher( T, args ... _args ) +{ + parameter_muncher( _args... ); +} + + +//!\brief Macro that is used when SX_NO_LOGGING is defined and thus there should be no logging. Consumes all parameters +//!so no warnings occur because of unused parameters. The code does nothing and can (will) be removed by the optimizer. +//!\sa sxprintf +#define SX_LOG( _dummy, ... ) \ + do \ + {\ + parameter_muncher( __VA_ARGS__ ); \ + } \ + while( false ) + + +//!\brief Macro that is used when SX_NO_LOGGING is defined and thus there should be no logging. Consumes all parameters +//!so no warnings occur because of unused parameters. The code does nothing and can (will) be removed by the optimizer. +//!\sa sxprintf +#define SX_LOG_HEX( _dummy, ... ) \ + do \ + {\ + parameter_muncher( __VA_ARGS__ ); \ + } \ + while( false ) + + +#else + + +#ifndef SX_CPP03_BOOST + +//!\brief Create a log message. +//!\param _level The log level of the message. +//!\param ... Parameters that are inserted into the message. +//!\sa sxprintf +#define SX_LOG( _level, ... ) \ + do \ + { \ + hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); \ + if( _level <= l_log_manager.get_log_level() ) \ + { \ + l_log_manager.log( _level, hermes::log_manager::get_instance().get_timestamp(), __FILE__, __LINE__, __VA_ARGS__ ); \ + } \ + } \ + while( false ) + + +//!\brief Create a hex log message. +//!\param _level The log level of the message. +//!\param _heading The heading of the message. +//!\param _data The message of the log. +//!\param ... Parameters that are inserted into the message. +//!\sa sxprintf +#define SX_LOG_HEX( _level, _heading, _data, ... ) \ + do \ + { \ + hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); \ + if( _level <= l_log_manager.get_log_level() ) \ + { \ + const std::string l_heading(_heading);\ + const std::string l_data(_data);\ + const std::string l_message = l_heading + "\n" + l_data;\ + l_log_manager.log( _level, hermes::log_manager::get_instance().get_timestamp(), __FILE__, __LINE__, l_message, __VA_ARGS__ ); \ + } \ + } \ + while( false ) + + +//!\brief Create a log message and wait for the message to be written by the logger. +//!\param _level The log level of the message. +//!\param ... Parameters that are inserted into the message. +//!\sa sxprintf +#define SX_LOG_AND_WAIT( _level, ... ) \ + do \ + { \ + hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); \ + if( _level <= l_log_manager.get_log_level() ) \ + { \ + l_log_manager.log_and_wait( _level, hermes::log_manager::get_instance().get_timestamp(), __FILE__, __LINE__, __VA_ARGS__ ); \ + } \ + } \ + while( false ) + + +#else + + +#define SX_LOG hermes::log_helper( __FILE__, __LINE__).log +#define SX_LOG_AND_WAIT hermes::log_helper( __FILE__, __LINE__).log_and_wait + + +#endif + + +#endif + + +#ifndef SX_NO_LOGGING + + +#include "log_manager_template.hpp" +#include "std_timestamp_policy.hpp" + + +namespace hermes +{ + + +//!\brief An alias-declaration for the log manager template. +typedef hermes::log_manager_template< hermes::std_timestamp_policy > log_manager; + + +} + + +#ifdef SX_CPP03_BOOST +#include "log_helper.hpp" +#endif + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/log_and_throw.hpp b/externals/hermes/source/hermes/include/hermes/log_and_throw.hpp similarity index 97% rename from externals/hermes/include/hermes/log_and_throw.hpp rename to externals/hermes/source/hermes/include/hermes/log_and_throw.hpp index bf7a688..fa0f5ed 100644 --- a/externals/hermes/include/hermes/log_and_throw.hpp +++ b/externals/hermes/source/hermes/include/hermes/log_and_throw.hpp @@ -1,124 +1,124 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_AND_THROW_A0ED92EB_7368_43EA_BB73_822E62AB4E66 -#define LOG_AND_THROW_A0ED92EB_7368_43EA_BB73_822E62AB4E66 - - -#include "log.hpp" -#include "essentials/exception.hpp" - - -#ifdef SX_CPP03_BOOST - #ifdef SX_NO_VARIADIC_MACRO - #include "log_and_throw_helper.hpp" - #else - #include "essentials/macro_helpers.hpp" - #endif -#endif - - -namespace hermes -{ - - -#ifndef SX_CPP03_BOOST - - -//!\def LOG_AND_THROW( _log_level, ... ) -//!\brief Log a message and then throw an exception with the same message. -#define LOG_AND_THROW( _log_level, ... ) \ - SX_LOG( _log_level, __VA_ARGS__ ); \ - throw sxe::exception( __VA_ARGS__ ); - - -#else - - -#ifndef SX_NO_VARIADIC_MACRO - -#define HERMES_VA_SELECT( NAME, _level, ... ) EXPAND( SELECT( NAME, VA_SIZE(__VA_ARGS__) )( _level, __VA_ARGS__) ) - -//!\def LOG_AND_THROW( _level, ... ) -//!\brief Log a message and then throw an exception with the same message. -#define LOG_AND_THROW( _level, ... ) EXPAND( HERMES_VA_SELECT( LOG_AND_THROW_PARAM, _level, __VA_ARGS__ ) ) - - -#define LOG_AND_THROW_PARAM_1( _log_level, _what ) \ - SX_LOG( _log_level, _what ); \ - throw sxe::exception( _what ); - - -#define LOG_AND_THROW_PARAM_2( _log_level, _what, _value ) \ - SX_LOG( _log_level, _what, _value ); \ - throw sxe::exception( _what, _value ); - - -#define LOG_AND_THROW_PARAM_3( _log_level, _what, _value1, _value2 ) \ - SX_LOG( _log_level, _what, _value1, _value2 ); \ - throw sxe::exception( _what, _value1, _value2 ); - - -#define LOG_AND_THROW_PARAM_4( _log_level, _what, _value1, _value2, _value3 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3 ); \ - throw sxe::exception( _what, _value1, _value2, _value3 ); - - -#define LOG_AND_THROW_PARAM_5( _log_level, _what, _value1, _value2, _value3, _value4 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4 ); \ - throw sxe::exception( _what, _value1, _value2, _value3, _value4 ); - - -#define LOG_AND_THROW_PARAM_6( _log_level, _what, _value1, _value2, _value3, _value4, _value5 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5 ); \ - throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5 ); - - -#define LOG_AND_THROW_PARAM_7( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6 ); \ - throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6 ); - - -#define LOG_AND_THROW_PARAM_8( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); \ - throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); - - -#define LOG_AND_THROW_PARAM_9( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); \ - throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); - - -#define LOG_AND_THROW_PARAM_10( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); \ - throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); - - -#define LOG_AND_THROW_PARAM_11( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) \ - SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); \ - throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); - - -#else - - -#define LOG_AND_THROW hermes::log_and_throw_helper( __FILE__, __LINE__ ).log - - -#endif - - -#endif - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_AND_THROW_A0ED92EB_7368_43EA_BB73_822E62AB4E66 +#define LOG_AND_THROW_A0ED92EB_7368_43EA_BB73_822E62AB4E66 + + +#include "log.hpp" +#include "essentials/exception.hpp" + + +#ifdef SX_CPP03_BOOST + #ifdef SX_NO_VARIADIC_MACRO + #include "log_and_throw_helper.hpp" + #else + #include "essentials/macro_helpers.hpp" + #endif +#endif + + +namespace hermes +{ + + +#ifndef SX_CPP03_BOOST + + +//!\def LOG_AND_THROW( _log_level, ... ) +//!\brief Log a message and then throw an exception with the same message. +#define LOG_AND_THROW( _log_level, ... ) \ + SX_LOG( _log_level, __VA_ARGS__ ); \ + throw sxe::exception( __VA_ARGS__ ); + + +#else + + +#ifndef SX_NO_VARIADIC_MACRO + +#define HERMES_VA_SELECT( NAME, _level, ... ) EXPAND( SELECT( NAME, VA_SIZE(__VA_ARGS__) )( _level, __VA_ARGS__) ) + +//!\def LOG_AND_THROW( _level, ... ) +//!\brief Log a message and then throw an exception with the same message. +#define LOG_AND_THROW( _level, ... ) EXPAND( HERMES_VA_SELECT( LOG_AND_THROW_PARAM, _level, __VA_ARGS__ ) ) + + +#define LOG_AND_THROW_PARAM_1( _log_level, _what ) \ + SX_LOG( _log_level, _what ); \ + throw sxe::exception( _what ); + + +#define LOG_AND_THROW_PARAM_2( _log_level, _what, _value ) \ + SX_LOG( _log_level, _what, _value ); \ + throw sxe::exception( _what, _value ); + + +#define LOG_AND_THROW_PARAM_3( _log_level, _what, _value1, _value2 ) \ + SX_LOG( _log_level, _what, _value1, _value2 ); \ + throw sxe::exception( _what, _value1, _value2 ); + + +#define LOG_AND_THROW_PARAM_4( _log_level, _what, _value1, _value2, _value3 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3 ); \ + throw sxe::exception( _what, _value1, _value2, _value3 ); + + +#define LOG_AND_THROW_PARAM_5( _log_level, _what, _value1, _value2, _value3, _value4 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4 ); \ + throw sxe::exception( _what, _value1, _value2, _value3, _value4 ); + + +#define LOG_AND_THROW_PARAM_6( _log_level, _what, _value1, _value2, _value3, _value4, _value5 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5 ); \ + throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5 ); + + +#define LOG_AND_THROW_PARAM_7( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6 ); \ + throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6 ); + + +#define LOG_AND_THROW_PARAM_8( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); \ + throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); + + +#define LOG_AND_THROW_PARAM_9( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); \ + throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); + + +#define LOG_AND_THROW_PARAM_10( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); \ + throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); + + +#define LOG_AND_THROW_PARAM_11( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) \ + SX_LOG( _log_level, _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); \ + throw sxe::exception( _what, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); + + +#else + + +#define LOG_AND_THROW hermes::log_and_throw_helper( __FILE__, __LINE__ ).log + + +#endif + + +#endif + + +} + + +#endif diff --git a/externals/hermes/include/hermes/log_and_throw_helper.hpp b/externals/hermes/source/hermes/include/hermes/log_and_throw_helper.hpp similarity index 97% rename from externals/hermes/include/hermes/log_and_throw_helper.hpp rename to externals/hermes/source/hermes/include/hermes/log_and_throw_helper.hpp index 898ab1e..9cd04b3 100644 --- a/externals/hermes/include/hermes/log_and_throw_helper.hpp +++ b/externals/hermes/source/hermes/include/hermes/log_and_throw_helper.hpp @@ -1,210 +1,210 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_AND_THROW_HELPER_048D9A04_8BD3_49F0_97EA_7DCB3D6E08FC -#define LOG_AND_THROW_HELPER_048D9A04_8BD3_49F0_97EA_7DCB3D6E08FC - - -#ifdef SX_CPP03_BOOST - - -#include - -#include "essentials/compatibility/compatibility.hpp" -#include "essentials/non_copyable.hpp" -#include "essentials/exception.hpp" -#include "log.hpp" - - -namespace hermes -{ - - - struct log_level; - - - class log_and_throw_helper SX_FINAL - { - public: - log_and_throw_helper( const std::string& _file_name, const int _line ); - ~log_and_throw_helper() SX_NOEXCEPT; - SX_NO_COPY( log_and_throw_helper ) - - void log( const log_level& _level, const std::string& _message ) const; - - template< typename _parameter_type1 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1 ); - } - throw sxe::exception( _message, _value1 ); - } - - - template< typename _parameter_type1, typename _parameter_type2 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, - _value2 ); - } - throw sxe::exception( _message, _value1, _value2 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, - _value2, _value3 ); - } - throw sxe::exception( _message, _value1, _value2, _value3 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, - typename _parameter_type4 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, - _value2, _value3, _value4 ); - } - throw sxe::exception( _message, _value1, _value2, _value3, _value4 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, - typename _parameter_type4, typename _parameter_type5 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5 ); - } - throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, - typename _parameter_type4, typename _parameter_type5, typename _parameter_type6 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6 ); - } - throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, - typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); - } - throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, - typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, - typename _parameter_type8 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, - _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); - } - throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, - typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, - typename _parameter_type8, typename _parameter_type9 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); - } - throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, - typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, - typename _parameter_type8, typename _parameter_type9, typename _parameter_type10 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9, - _parameter_type10 _value10 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); - } - throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, - _value10 ); - } - - private: - const std::string& file_name_; - const int line_; - - - }; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_AND_THROW_HELPER_048D9A04_8BD3_49F0_97EA_7DCB3D6E08FC +#define LOG_AND_THROW_HELPER_048D9A04_8BD3_49F0_97EA_7DCB3D6E08FC + + +#ifdef SX_CPP03_BOOST + + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/non_copyable.hpp" +#include "essentials/exception.hpp" +#include "log.hpp" + + +namespace hermes +{ + + + struct log_level; + + + class log_and_throw_helper SX_FINAL + { + public: + log_and_throw_helper( const std::string& _file_name, const int _line ); + ~log_and_throw_helper() SX_NOEXCEPT; + SX_NO_COPY( log_and_throw_helper ) + + void log( const log_level& _level, const std::string& _message ) const; + + template< typename _parameter_type1 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1 ); + } + throw sxe::exception( _message, _value1 ); + } + + + template< typename _parameter_type1, typename _parameter_type2 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, + _value2 ); + } + throw sxe::exception( _message, _value1, _value2 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, + _value2, _value3 ); + } + throw sxe::exception( _message, _value1, _value2, _value3 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, + typename _parameter_type4 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, + _value2, _value3, _value4 ); + } + throw sxe::exception( _message, _value1, _value2, _value3, _value4 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, + typename _parameter_type4, typename _parameter_type5 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5 ); + } + throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, + typename _parameter_type4, typename _parameter_type5, typename _parameter_type6 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6 ); + } + throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, + typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); + } + throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, + typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, + typename _parameter_type8 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, + _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); + } + throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, + typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, + typename _parameter_type8, typename _parameter_type9 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); + } + throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, + typename _parameter_type4, typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, + typename _parameter_type8, typename _parameter_type9, typename _parameter_type10 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9, + _parameter_type10 _value10 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); + } + throw sxe::exception( _message, _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, + _value10 ); + } + + private: + const std::string& file_name_; + const int line_; + + + }; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/log_callback.hpp b/externals/hermes/source/hermes/include/hermes/log_callback.hpp similarity index 96% rename from externals/hermes/include/hermes/log_callback.hpp rename to externals/hermes/source/hermes/include/hermes/log_callback.hpp index dae84de..6ef5ff7 100644 --- a/externals/hermes/include/hermes/log_callback.hpp +++ b/externals/hermes/source/hermes/include/hermes/log_callback.hpp @@ -1,59 +1,59 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_CALLBACK_B451A9E6_FCDE_44DB_B821_5F838D942994 -#define LOG_CALLBACK_B451A9E6_FCDE_44DB_B821_5F838D942994 - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - -#include "essentials/compatibility/compatibility.hpp" - -namespace hermes -{ - - -//!\interface log_callback -//!\brief Interface that adds wait functionality to the class that implements it. -class log_callback -{ -public: - log_callback() - { - // Nothing to do... - } - - - virtual ~log_callback() SX_NOEXCEPT - { - // Nothing to do... - } - - - //!\brief Wait for a condition. - virtual void wait() = 0; - - //!\brief The thing we are waiting for is done. - virtual void done() = 0; - - //!\brief Checks the thing we are waiting for is done. - virtual bool is_done() = 0; -}; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_CALLBACK_B451A9E6_FCDE_44DB_B821_5F838D942994 +#define LOG_CALLBACK_B451A9E6_FCDE_44DB_B821_5F838D942994 + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + +#include "essentials/compatibility/compatibility.hpp" + +namespace hermes +{ + + +//!\interface log_callback +//!\brief Interface that adds wait functionality to the class that implements it. +class log_callback +{ +public: + log_callback() + { + // Nothing to do... + } + + + virtual ~log_callback() SX_NOEXCEPT + { + // Nothing to do... + } + + + //!\brief Wait for a condition. + virtual void wait() = 0; + + //!\brief The thing we are waiting for is done. + virtual void done() = 0; + + //!\brief Checks the thing we are waiting for is done. + virtual bool is_done() = 0; +}; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/log_helper.hpp b/externals/hermes/source/hermes/include/hermes/log_helper.hpp similarity index 97% rename from externals/hermes/include/hermes/log_helper.hpp rename to externals/hermes/source/hermes/include/hermes/log_helper.hpp index 92623d1..efc8ef7 100644 --- a/externals/hermes/include/hermes/log_helper.hpp +++ b/externals/hermes/source/hermes/include/hermes/log_helper.hpp @@ -1,342 +1,342 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_HELPER_F1630103_70EA_469C_B378_32955DA9A018 -#define LOG_HELPER_F1630103_70EA_469C_B378_32955DA9A018 - - -#ifdef SX_CPP03_BOOST - - -#include - -#include "essentials/compatibility/compatibility.hpp" -#include "essentials/non_copyable.hpp" -#include "log.hpp" - - -namespace hermes -{ - - -struct log_level; - - -class log_helper SX_FINAL -{ -public: - log_helper( const std::string& _file_name, const int _line ); - ~log_helper() SX_NOEXCEPT; - SX_NO_COPY( log_helper ) - - void log( const log_level& _level, const std::string& _message ) const; - - - template< typename _parameter_type1 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, - _value2, _value3, _value4 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, - typename _parameter_type9 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, - typename _parameter_type9, typename _parameter_type10 > - void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9, - _parameter_type10 _value10 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); - } - } - - - template< typename _parameter_type1 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, - _value2, _value3, _value4 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, - typename _parameter_type9 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); - } - } - - - template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, - typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, - typename _parameter_type9, typename _parameter_type10 > - void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, - _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, - _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9, - _parameter_type10 _value10 ) const - { - log_manager_template& l_log_manager = log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, - _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); - } - } - - -private: - const std::string& file_name_; - const int line_; - - -}; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_HELPER_F1630103_70EA_469C_B378_32955DA9A018 +#define LOG_HELPER_F1630103_70EA_469C_B378_32955DA9A018 + + +#ifdef SX_CPP03_BOOST + + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/non_copyable.hpp" +#include "log.hpp" + + +namespace hermes +{ + + +struct log_level; + + +class log_helper SX_FINAL +{ +public: + log_helper( const std::string& _file_name, const int _line ); + ~log_helper() SX_NOEXCEPT; + SX_NO_COPY( log_helper ) + + void log( const log_level& _level, const std::string& _message ) const; + + + template< typename _parameter_type1 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, + _value2, _value3, _value4 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, + typename _parameter_type9 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, + typename _parameter_type9, typename _parameter_type10 > + void log( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9, + _parameter_type10 _value10 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); + } + } + + + template< typename _parameter_type1 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, _value1, + _value2, _value3, _value4 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, + typename _parameter_type9 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9 ); + } + } + + + template< typename _parameter_type1, typename _parameter_type2, typename _parameter_type3, typename _parameter_type4, + typename _parameter_type5, typename _parameter_type6, typename _parameter_type7, typename _parameter_type8, + typename _parameter_type9, typename _parameter_type10 > + void log_and_wait( const log_level& _level, const std::string& _message, _parameter_type1 _value1, + _parameter_type2 _value2, _parameter_type3 _value3, _parameter_type4 _value4, _parameter_type5 _value5, + _parameter_type6 _value6, _parameter_type7 _value7, _parameter_type8 _value8, _parameter_type9 _value9, + _parameter_type10 _value10 ) const + { + log_manager_template& l_log_manager = log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log_and_wait( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message, + _value1, _value2, _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ); + } + } + + +private: + const std::string& file_name_; + const int line_; + + +}; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/log_level.hpp b/externals/hermes/source/hermes/include/hermes/log_level.hpp similarity index 96% rename from externals/hermes/include/hermes/log_level.hpp rename to externals/hermes/source/hermes/include/hermes/log_level.hpp index 07b05f8..651d0a4 100644 --- a/externals/hermes/include/hermes/log_level.hpp +++ b/externals/hermes/source/hermes/include/hermes/log_level.hpp @@ -1,118 +1,118 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_LEVEL_5059A1FA_DC2D_4C94_AA8B_49B750B30F07 -#define LOG_LEVEL_5059A1FA_DC2D_4C94_AA8B_49B750B30F07 - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include - - -namespace hermes -{ - - -#ifndef SX_CPP03_BOOST - - -//!\enum log_level -//!\brief The log levels. -enum class log_level -{ - LL_OFF = -1, LL_ASSERT = 0, LL_FATAL = 1, LL_ERROR = 2, LL_WARN = 3, LL_INFO = 4, LL_DEBUG = 5, LL_TRACE = 6, LL_SPAM = 7 -}; - - -#else - - -//!\struct log_level -//!\brief Structure representing a log level (enum wrapper for C++11 enum class like behavior). -struct log_level -{ - //!\enum log_level - //!\brief The log levels. - enum inner - { - LL_OFF = -1, LL_ASSERT = 0, LL_FATAL = 1, LL_ERROR = 2, LL_WARN = 3, LL_INFO = 4, LL_DEBUG = 5, LL_TRACE = 6, LL_SPAM = 7 - }; - - - //!\brief Constructor - //!\param _value Given log level value that is represented by the structure. - log_level( inner _value ) : value_( _value ) - { - // Nothing to do... - } - - - //!\brief Constructor. Default value is LL_OFF. - log_level() : value_( LL_OFF ) - { - // Nothing to do... - } - - - //!\brief Constructor - //!\param _color Given log level structure containing the log level value that is represented by the structure. - log_level(const log_level& _log_level) : value_(_log_level.value_) - { - // Nothing to do... - } - - - //!\brief Function returning the log level value represented by the structure. - operator inner() const - { - return ( value_ ); - } - - - //!\brief Log level value represented by the structure. - inner value_; - -}; - - -#endif - - - -//!\brief Convert the given log level to a string. -//!\param _log_level The log level. -//!\return The log level as string. -std::string log_level_to_string( const log_level _log_level ); - - - -#ifdef SX_CPP03_BOOST - - -bool operator==( const hermes::log_level& _lhs, const hermes::log_level::inner _rhs ); -bool operator==( const hermes::log_level::inner _lhs, const hermes::log_level& _rhs ); -bool operator<(const hermes::log_level _lhs, const hermes::log_level _rhs); -bool operator<=( const hermes::log_level _lhs, const hermes::log_level _rhs ); - - -#endif - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_LEVEL_5059A1FA_DC2D_4C94_AA8B_49B750B30F07 +#define LOG_LEVEL_5059A1FA_DC2D_4C94_AA8B_49B750B30F07 + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include + + +namespace hermes +{ + + +#ifndef SX_CPP03_BOOST + + +//!\enum log_level +//!\brief The log levels. +enum class log_level +{ + LL_OFF = -1, LL_ASSERT = 0, LL_FATAL = 1, LL_ERROR = 2, LL_WARN = 3, LL_INFO = 4, LL_DEBUG = 5, LL_TRACE = 6, LL_SPAM = 7 +}; + + +#else + + +//!\struct log_level +//!\brief Structure representing a log level (enum wrapper for C++11 enum class like behavior). +struct log_level +{ + //!\enum log_level + //!\brief The log levels. + enum inner + { + LL_OFF = -1, LL_ASSERT = 0, LL_FATAL = 1, LL_ERROR = 2, LL_WARN = 3, LL_INFO = 4, LL_DEBUG = 5, LL_TRACE = 6, LL_SPAM = 7 + }; + + + //!\brief Constructor + //!\param _value Given log level value that is represented by the structure. + log_level( inner _value ) : value_( _value ) + { + // Nothing to do... + } + + + //!\brief Constructor. Default value is LL_OFF. + log_level() : value_( LL_OFF ) + { + // Nothing to do... + } + + + //!\brief Constructor + //!\param _color Given log level structure containing the log level value that is represented by the structure. + log_level(const log_level& _log_level) : value_(_log_level.value_) + { + // Nothing to do... + } + + + //!\brief Function returning the log level value represented by the structure. + operator inner() const + { + return ( value_ ); + } + + + //!\brief Log level value represented by the structure. + inner value_; + +}; + + +#endif + + + +//!\brief Convert the given log level to a string. +//!\param _log_level The log level. +//!\return The log level as string. +std::string log_level_to_string( const log_level _log_level ); + + + +#ifdef SX_CPP03_BOOST + + +bool operator==( const hermes::log_level& _lhs, const hermes::log_level::inner _rhs ); +bool operator==( const hermes::log_level::inner _lhs, const hermes::log_level& _rhs ); +bool operator<(const hermes::log_level _lhs, const hermes::log_level _rhs); +bool operator<=( const hermes::log_level _lhs, const hermes::log_level _rhs ); + + +#endif + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/log_manager_template.hpp b/externals/hermes/source/hermes/include/hermes/log_manager_template.hpp similarity index 97% rename from externals/hermes/include/hermes/log_manager_template.hpp rename to externals/hermes/source/hermes/include/hermes/log_manager_template.hpp index a080318..0b71d8d 100644 --- a/externals/hermes/include/hermes/log_manager_template.hpp +++ b/externals/hermes/source/hermes/include/hermes/log_manager_template.hpp @@ -1,594 +1,594 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_MANAGER_TEMPLATE_F6D33798_A43A_4C29_86F1_0FC821B92F9B -#define LOG_MANAGER_TEMPLATE_F6D33798_A43A_4C29_86F1_0FC821B92F9B - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include - -#include "essentials/base.hpp" -#include "logger.hpp" -#include "log_message.hpp" -#include "essentials/sxprintf.hpp" -#include "waiter.hpp" - - -namespace hermes -{ - - -namespace -{ - - -bool LOG_MANAGER_EXISTS = false; - - -} - -//!\class t_log_manager_template -//!\brief The log manager (a singleton) controls the different loggers, manages the current log level, and takes care -//!of dispatching log messages. -template< typename time_stamp_policy > -class log_manager_template SX_FINAL -{ -public: - //!\brief Get a reference to the single instance of the log manager template. - static log_manager_template& get_instance( void ) - { - static log_manager_template instance; - return( instance ); - } - - - SX_NO_COPY(log_manager_template) - - //!\brief Get the currently set log level. - //!\return Current log level. - log_level get_log_level() const - { - return( log_level_ ); - } - - - //!\brief Set a new log level. - //!\param _log_level Log level to be set. - //!\return void - void set_log_level( const log_level _log_level ) - { - log_level_ = _log_level; - } - - -#ifndef SX_CPP03_BOOST - - - //!\brief Add a message to the queue of messages that will be processed. - //!\param _log_level Log level of the message. - //!\param _time_stamp Date and time when the log message was created. - //!\param _file The file from where the log was called. - //!\param _line The line from where the log was called. - //!\param _message The message text for the log. - //!\param _args Parameters that are inserted in the message. - //!\return void - //!\sa log_and_wait, SX_LOG(), sxprintf - template< typename ... args > - void log( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, args ... _args ) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _args ... ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - } - - - //!\brief Add a message to the queue of messages and waits the message to be processed. - //!\param _log_level Log level of the message. - //!\param _time_stamp Date and time when the log message was created. - //!\param _file The file from where the log was called. - //!\param _line The line from where the log was called. - //!\param _message The message text for the log. - //!\param _args Parameters that are inserted in the message. - //!\return void - //!\sa log, SX_LOG(), sxprintf - template< typename ... args > - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, args ... _args ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _args ... ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - -#else - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str() ) ); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const hermes::log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value) ); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, - _value2) ); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, - _value3)); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, - _value3, _value4)); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5 ) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, - _value3, _value4, _value5)); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6)); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7) ); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, - const sxe::value_type& _value8) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7, _value8) ); - sxe::lock_guard< sxe::mutex > lock(mutex_); - messages_.push(message); - } - condition_.notify_one(); - } - - - void log( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, - const sxe::value_type& _value8, const sxe::value_type& _value9 ) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - } - - - void log( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, - const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ) - { - { - log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - } - - -//**************************************************log_and_wait**************************************************// - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str() ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, - const sxe::value_type& _value8 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7, _value8 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, - const sxe::value_type& _value8, const sxe::value_type& _value9 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, - const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, - const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, - const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ) - { - waiter waiter; - { - log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, - _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - messages_.push( message ); - } - condition_.notify_one(); - waiter.wait(); - } - - - -#endif - - - //!\brief Adds a logger to which the log will be written. - //!\param _logger - The logger to be added. - //!\return void - void add_logger( logger_uptr _logger ) - { - SX_ASSERT( stop_, "Logger cannot be added while running!" ); - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - loggers_.push_back( sxe::move( _logger ) ); - } - - - //!\brief Starts the logging. On starting, a new thread is created which processes the enqueued log message by - //!sending them to each logger. The thread has to be stopped and joined before the log manager is destroyed! - //!\return void - //!\sa halt, join - void run() - { - stop_ = false; - thread_ = sxe::thread( sxe::bind( &log_manager_template::work, this ) ); - } - - - //!\brief Stops the logging. The thread that processes the log messages is notified that it should stop. It still has - //!to be joined later. - //!\return void - //!\sa run, join, halt_and_join - void halt() - { - { - sxe::lock_guard< sxe::mutex > lock( mutex_ ); - stop_ = true; - } - condition_.notify_one(); - } - - - //!\brief Joins the thread that processed the log messages. Join has to be called after the halt function. - //!\return void - //!\sa halt, run, halt_and_join - void join() - { - thread_.join(); - } - - - //!\brief Stops the logging and joins the thread that processed the log messages. - //!\return void - //!\sa halt, run, join - void halt_and_join() - { - halt(); - join(); - } - - - //!\brief Get the current date and time as a string. - //!\return String containing the date and time. - static std::string get_timestamp() - { - return( time_stamp_policy::get_timestamp() ); - } - - -private: - log_manager_template() - : thread_(), - mutex_(), - condition_(), - stop_( true ), - loggers_(), - messages_(), - log_level_( log_level::LL_OFF ) - { - SX_ASSERT( !LOG_MANAGER_EXISTS, "Log manager already exists!" ); - LOG_MANAGER_EXISTS = true; - } - - - ~log_manager_template() - { - SX_ASSERT( stop_, "Thread is still running! It was not stopped." ); - } - - - bool should_be_running() const - { - return( stop_ || !messages_.empty() ); - } - - - bool finished() const - { - return( stop_ && messages_.empty() ); - } - - - void work() - { - while( true ) - { - log_message message; - { - sxe::unique_lock< sxe::mutex > lock( mutex_ ); - condition_.wait( lock, sxe::bind( &log_manager_template::should_be_running, this ) ); - - if( finished() ) - { - break; - } - - message = messages_.front(); - messages_.pop(); - } - - SX_FOR(const logger_uptr& logger, loggers_) - { - logger->log( message ); - message.done(); - } - } - } - - - sxe::thread thread_; - sxe::mutex mutex_; - sxe::condition_variable condition_; - bool stop_; - loggers loggers_; - std::queue< log_message > messages_; - log_level log_level_; -}; - - -} - - -#endif - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_MANAGER_TEMPLATE_F6D33798_A43A_4C29_86F1_0FC821B92F9B +#define LOG_MANAGER_TEMPLATE_F6D33798_A43A_4C29_86F1_0FC821B92F9B + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include + +#include "essentials/base.hpp" +#include "logger.hpp" +#include "log_message.hpp" +#include "essentials/sxprintf.hpp" +#include "waiter.hpp" + + +namespace hermes +{ + + +namespace +{ + + +bool LOG_MANAGER_EXISTS = false; + + +} + +//!\class t_log_manager_template +//!\brief The log manager (a singleton) controls the different loggers, manages the current log level, and takes care +//!of dispatching log messages. +template< typename time_stamp_policy > +class log_manager_template SX_FINAL +{ +public: + //!\brief Get a reference to the single instance of the log manager template. + static log_manager_template& get_instance( void ) + { + static log_manager_template instance; + return( instance ); + } + + + SX_NO_COPY(log_manager_template) + + //!\brief Get the currently set log level. + //!\return Current log level. + log_level get_log_level() const + { + return( log_level_ ); + } + + + //!\brief Set a new log level. + //!\param _log_level Log level to be set. + //!\return void + void set_log_level( const log_level _log_level ) + { + log_level_ = _log_level; + } + + +#ifndef SX_CPP03_BOOST + + + //!\brief Add a message to the queue of messages that will be processed. + //!\param _log_level Log level of the message. + //!\param _time_stamp Date and time when the log message was created. + //!\param _file The file from where the log was called. + //!\param _line The line from where the log was called. + //!\param _message The message text for the log. + //!\param _args Parameters that are inserted in the message. + //!\return void + //!\sa log_and_wait, SX_LOG(), sxprintf + template< typename ... args > + void log( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, args ... _args ) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _args ... ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + } + + + //!\brief Add a message to the queue of messages and waits the message to be processed. + //!\param _log_level Log level of the message. + //!\param _time_stamp Date and time when the log message was created. + //!\param _file The file from where the log was called. + //!\param _line The line from where the log was called. + //!\param _message The message text for the log. + //!\param _args Parameters that are inserted in the message. + //!\return void + //!\sa log, SX_LOG(), sxprintf + template< typename ... args > + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, args ... _args ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _args ... ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + +#else + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str() ) ); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const hermes::log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value) ); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, + _value2) ); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, + _value3)); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, + _value3, _value4)); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5 ) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, + _value3, _value4, _value5)); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6)); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7) ); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log(const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, + const sxe::value_type& _value8) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf(_message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7, _value8) ); + sxe::lock_guard< sxe::mutex > lock(mutex_); + messages_.push(message); + } + condition_.notify_one(); + } + + + void log( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, + const sxe::value_type& _value8, const sxe::value_type& _value9 ) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + } + + + void log( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, + const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ) + { + { + log_message message( SX_NULLPTR, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + } + + +//**************************************************log_and_wait**************************************************// + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str() ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, + const sxe::value_type& _value8 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7, _value8 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, + const sxe::value_type& _value8, const sxe::value_type& _value9 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7, _value8, _value9 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + void log_and_wait( const log_level _log_level, const std::string& _time_stamp, const std::string& _file, const int _line, + const std::string& _message, const sxe::value_type& _value1, const sxe::value_type& _value2, const sxe::value_type& _value3, + const sxe::value_type& _value4, const sxe::value_type& _value5, const sxe::value_type& _value6, const sxe::value_type& _value7, + const sxe::value_type& _value8, const sxe::value_type& _value9, const sxe::value_type& _value10 ) + { + waiter waiter; + { + log_message message( &waiter, _log_level, _time_stamp, _file, _line, sxe::sxprintf( _message.c_str(), _value1, _value2, + _value3, _value4, _value5, _value6, _value7, _value8, _value9, _value10 ) ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + messages_.push( message ); + } + condition_.notify_one(); + waiter.wait(); + } + + + +#endif + + + //!\brief Adds a logger to which the log will be written. + //!\param _logger - The logger to be added. + //!\return void + void add_logger( logger_uptr _logger ) + { + SX_ASSERT( stop_, "Logger cannot be added while running!" ); + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + loggers_.push_back( sxe::move( _logger ) ); + } + + + //!\brief Starts the logging. On starting, a new thread is created which processes the enqueued log message by + //!sending them to each logger. The thread has to be stopped and joined before the log manager is destroyed! + //!\return void + //!\sa halt, join + void run() + { + stop_ = false; + thread_ = sxe::thread( sxe::bind( &log_manager_template::work, this ) ); + } + + + //!\brief Stops the logging. The thread that processes the log messages is notified that it should stop. It still has + //!to be joined later. + //!\return void + //!\sa run, join, halt_and_join + void halt() + { + { + sxe::lock_guard< sxe::mutex > lock( mutex_ ); + stop_ = true; + } + condition_.notify_one(); + } + + + //!\brief Joins the thread that processed the log messages. Join has to be called after the halt function. + //!\return void + //!\sa halt, run, halt_and_join + void join() + { + thread_.join(); + } + + + //!\brief Stops the logging and joins the thread that processed the log messages. + //!\return void + //!\sa halt, run, join + void halt_and_join() + { + halt(); + join(); + } + + + //!\brief Get the current date and time as a string. + //!\return String containing the date and time. + static std::string get_timestamp() + { + return( time_stamp_policy::get_timestamp() ); + } + + +private: + log_manager_template() + : thread_(), + mutex_(), + condition_(), + stop_( true ), + loggers_(), + messages_(), + log_level_( log_level::LL_OFF ) + { + SX_ASSERT( !LOG_MANAGER_EXISTS, "Log manager already exists!" ); + LOG_MANAGER_EXISTS = true; + } + + + ~log_manager_template() + { + SX_ASSERT( stop_, "Thread is still running! It was not stopped." ); + } + + + bool should_be_running() const + { + return( stop_ || !messages_.empty() ); + } + + + bool finished() const + { + return( stop_ && messages_.empty() ); + } + + + void work() + { + while( true ) + { + log_message message; + { + sxe::unique_lock< sxe::mutex > lock( mutex_ ); + condition_.wait( lock, sxe::bind( &log_manager_template::should_be_running, this ) ); + + if( finished() ) + { + break; + } + + message = messages_.front(); + messages_.pop(); + } + + SX_FOR(const logger_uptr& logger, loggers_) + { + logger->log( message ); + message.done(); + } + } + } + + + sxe::thread thread_; + sxe::mutex mutex_; + sxe::condition_variable condition_; + bool stop_; + loggers loggers_; + std::queue< log_message > messages_; + log_level log_level_; +}; + + +} + + +#endif + +#endif diff --git a/externals/hermes/include/hermes/log_message.hpp b/externals/hermes/source/hermes/include/hermes/log_message.hpp similarity index 97% rename from externals/hermes/include/hermes/log_message.hpp rename to externals/hermes/source/hermes/include/hermes/log_message.hpp index d0585c7..fee8c1a 100644 --- a/externals/hermes/include/hermes/log_message.hpp +++ b/externals/hermes/source/hermes/include/hermes/log_message.hpp @@ -1,66 +1,66 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOG_MESSAGE_2F81F136_9F98_4FE3_A47A_9DEBB9538995 -#define LOG_MESSAGE_2F81F136_9F98_4FE3_A47A_9DEBB9538995 - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include "log_level.hpp" -#include "essentials/compatibility/compatibility.hpp" - - -namespace hermes -{ - - -class log_callback; - - -//!\struct log_message -//!\brief Structure of the message to be logged, containing all necessary elements: log callback (if it is used), -//!\log level, time stamp of the log, file and line where the log is generated and the message of the log. -struct log_message SX_FINAL -{ - //!\brief Constructor - log_message(); - - //!\brief Constructor - //!\param _log_callback Pointer to log callback. - //!\param _log_level Log level for this log message. - //!\param _time_stamp Time stamp of the log message. - //!\param _file File where the log message was generated. - //!\param _line Line of the file where the log message is generated. - //!\param _message The message of the log. - log_message( log_callback* _log_callback, const log_level _log_level, const std::string& _time_stamp, - const std::string& _file, const int _line, const std::string& _message ); - - //!\brief Function that notifies the log callback that we are done. - void done(); - - log_level log_level_; - std::string time_stamp_; - std::string file_; - int line_; - std::string message_; - log_callback* log_callback_; -}; - - -} - - -#endif - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOG_MESSAGE_2F81F136_9F98_4FE3_A47A_9DEBB9538995 +#define LOG_MESSAGE_2F81F136_9F98_4FE3_A47A_9DEBB9538995 + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include "log_level.hpp" +#include "essentials/compatibility/compatibility.hpp" + + +namespace hermes +{ + + +class log_callback; + + +//!\struct log_message +//!\brief Structure of the message to be logged, containing all necessary elements: log callback (if it is used), +//!\log level, time stamp of the log, file and line where the log is generated and the message of the log. +struct log_message SX_FINAL +{ + //!\brief Constructor + log_message(); + + //!\brief Constructor + //!\param _log_callback Pointer to log callback. + //!\param _log_level Log level for this log message. + //!\param _time_stamp Time stamp of the log message. + //!\param _file File where the log message was generated. + //!\param _line Line of the file where the log message is generated. + //!\param _message The message of the log. + log_message( log_callback* _log_callback, const log_level _log_level, const std::string& _time_stamp, + const std::string& _file, const int _line, const std::string& _message ); + + //!\brief Function that notifies the log callback that we are done. + void done(); + + log_level log_level_; + std::string time_stamp_; + std::string file_; + int line_; + std::string message_; + log_callback* log_callback_; +}; + + +} + + +#endif + +#endif diff --git a/externals/hermes/include/hermes/logger.hpp b/externals/hermes/source/hermes/include/hermes/logger.hpp similarity index 96% rename from externals/hermes/include/hermes/logger.hpp rename to externals/hermes/source/hermes/include/hermes/logger.hpp index 362e79c..9d3e998 100644 --- a/externals/hermes/include/hermes/logger.hpp +++ b/externals/hermes/source/hermes/include/hermes/logger.hpp @@ -1,64 +1,64 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOGGER_4207DA98_D8C1_41B4_B5B1_29E8C5A22DF3 -#define LOGGER_4207DA98_D8C1_41B4_B5B1_29E8C5A22DF3 - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include "logger_fwd.hpp" -#include "essentials/non_copyable.hpp" - - -namespace hermes -{ - - -struct log_message; - - -//!\interface logger -//!\brief Interface of the general logger. The specialized loggers derive from this interface. -class logger -{ -public: - //!\brief logger constructor. - logger() - { - // Nothing to do... - } - - - virtual ~logger() SX_NOEXCEPT - { - // Nothing to do... - } - - - SX_NO_COPY(logger) - - //!\brief Log the message to the target medium. - //!\param _log_message Message to be logged. - //!\return void - virtual void log( const log_message& _log_message ) = 0; -}; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOGGER_4207DA98_D8C1_41B4_B5B1_29E8C5A22DF3 +#define LOGGER_4207DA98_D8C1_41B4_B5B1_29E8C5A22DF3 + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include "logger_fwd.hpp" +#include "essentials/non_copyable.hpp" + + +namespace hermes +{ + + +struct log_message; + + +//!\interface logger +//!\brief Interface of the general logger. The specialized loggers derive from this interface. +class logger +{ +public: + //!\brief logger constructor. + logger() + { + // Nothing to do... + } + + + virtual ~logger() SX_NOEXCEPT + { + // Nothing to do... + } + + + SX_NO_COPY(logger) + + //!\brief Log the message to the target medium. + //!\param _log_message Message to be logged. + //!\return void + virtual void log( const log_message& _log_message ) = 0; +}; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/logger_fwd.hpp b/externals/hermes/source/hermes/include/hermes/logger_fwd.hpp similarity index 96% rename from externals/hermes/include/hermes/logger_fwd.hpp rename to externals/hermes/source/hermes/include/hermes/logger_fwd.hpp index 2d7704c..18d2e9d 100644 --- a/externals/hermes/include/hermes/logger_fwd.hpp +++ b/externals/hermes/source/hermes/include/hermes/logger_fwd.hpp @@ -1,44 +1,44 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef LOGGER_FWD_9F0DC46E_91EC_44AB_ADE0_7F223D30DE83 -#define LOGGER_FWD_9F0DC46E_91EC_44AB_ADE0_7F223D30DE83 - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include - -#include "essentials/compatibility/compatibility.hpp" - - -namespace hermes -{ - - -class logger; - -//!\typedef Alias for logger smart pointer. -typedef sxe::SX_UNIQUE_PTR< logger > logger_uptr; - -//!\typedef Alias for vector of logger smart pointers. -typedef std::vector< logger_uptr > loggers; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef LOGGER_FWD_9F0DC46E_91EC_44AB_ADE0_7F223D30DE83 +#define LOGGER_FWD_9F0DC46E_91EC_44AB_ADE0_7F223D30DE83 + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include + +#include "essentials/compatibility/compatibility.hpp" + + +namespace hermes +{ + + +class logger; + +//!\typedef Alias for logger smart pointer. +typedef sxe::SX_UNIQUE_PTR< logger > logger_uptr; + +//!\typedef Alias for vector of logger smart pointers. +typedef std::vector< logger_uptr > loggers; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/std_timestamp_policy.hpp b/externals/hermes/source/hermes/include/hermes/std_timestamp_policy.hpp similarity index 96% rename from externals/hermes/include/hermes/std_timestamp_policy.hpp rename to externals/hermes/source/hermes/include/hermes/std_timestamp_policy.hpp index 39eb9d6..3879b39 100644 --- a/externals/hermes/include/hermes/std_timestamp_policy.hpp +++ b/externals/hermes/source/hermes/include/hermes/std_timestamp_policy.hpp @@ -1,47 +1,47 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef STD_TIMESTAMP_POLICY_A0D64C16_D7D3_4E06_B647_F949D14BBBAB -#define STD_TIMESTAMP_POLICY_A0D64C16_D7D3_4E06_B647_F949D14BBBAB - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include - -#include "essentials/non_copyable.hpp" - - -namespace hermes -{ - -//!\class std_timestamp_policy -//!\brief Provides time stamps for the logger. -class std_timestamp_policy SX_FINAL -{ -public: - SX_NO_COPY(std_timestamp_policy) - - //!\ Provides time stamp as string. - //!\return Time stamp as string. - static std::string get_timestamp(); -}; - - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef STD_TIMESTAMP_POLICY_A0D64C16_D7D3_4E06_B647_F949D14BBBAB +#define STD_TIMESTAMP_POLICY_A0D64C16_D7D3_4E06_B647_F949D14BBBAB + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include + +#include "essentials/non_copyable.hpp" + + +namespace hermes +{ + +//!\class std_timestamp_policy +//!\brief Provides time stamps for the logger. +class std_timestamp_policy SX_FINAL +{ +public: + SX_NO_COPY(std_timestamp_policy) + + //!\ Provides time stamp as string. + //!\return Time stamp as string. + static std::string get_timestamp(); +}; + + +} + + +#endif + + +#endif diff --git a/externals/hermes/include/hermes/waiter.hpp b/externals/hermes/source/hermes/include/hermes/waiter.hpp similarity index 96% rename from externals/hermes/include/hermes/waiter.hpp rename to externals/hermes/source/hermes/include/hermes/waiter.hpp index 350920f..5b23b65 100644 --- a/externals/hermes/include/hermes/waiter.hpp +++ b/externals/hermes/source/hermes/include/hermes/waiter.hpp @@ -1,60 +1,60 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifndef WAITER_5E57D733_02DD_413D_A906_5047979A5DFD -#define WAITER_5E57D733_02DD_413D_A906_5047979A5DFD - -#include "hermes_backward_compatibility.hpp" - - -#ifndef SX_NO_LOGGING - - -#include "log_callback.hpp" -#include "essentials/compatibility/thread.hpp" - - -namespace hermes -{ - - //!\class waiter - //!\brief Class that implements the log callback and gives the logger the ability to wait for a message to be printed. This useful when - //!when we have to be sure writing a log message has definitely finished (e.g. before triggering an assert). - class waiter : public log_callback - { - public: - //!\brief Constructor - waiter(); - virtual ~waiter() SX_NOEXCEPT SX_OVERRIDE; - - //!\brief Wait for the process to finish. - virtual void wait() SX_OVERRIDE; - - //!\brief The thing we are waiting for is done. - virtual void done() SX_OVERRIDE; - - //!\brief Check if the thing we are waiting for is done. - //!\return True if it's done, false otherwise. - virtual bool is_done() SX_OVERRIDE; - - - private: - sxe::mutex done_mutex_; - sxe::condition_variable done_condition_variable_; - bool done_; - }; - -} - - -#endif - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef WAITER_5E57D733_02DD_413D_A906_5047979A5DFD +#define WAITER_5E57D733_02DD_413D_A906_5047979A5DFD + +#include "hermes_backward_compatibility.hpp" + + +#ifndef SX_NO_LOGGING + + +#include "log_callback.hpp" +#include "essentials/compatibility/thread.hpp" + + +namespace hermes +{ + + //!\class waiter + //!\brief Class that implements the log callback and gives the logger the ability to wait for a message to be printed. This useful when + //!when we have to be sure writing a log message has definitely finished (e.g. before triggering an assert). + class waiter : public log_callback + { + public: + //!\brief Constructor + waiter(); + virtual ~waiter() SX_NOEXCEPT SX_OVERRIDE; + + //!\brief Wait for the process to finish. + virtual void wait() SX_OVERRIDE; + + //!\brief The thing we are waiting for is done. + virtual void done() SX_OVERRIDE; + + //!\brief Check if the thing we are waiting for is done. + //!\return True if it's done, false otherwise. + virtual bool is_done() SX_OVERRIDE; + + + private: + sxe::mutex done_mutex_; + sxe::condition_variable done_condition_variable_; + bool done_; + }; + +} + + +#endif + + +#endif diff --git a/externals/hermes/source/color_mapping.cpp b/externals/hermes/source/hermes/source/color_mapping.cpp similarity index 96% rename from externals/hermes/source/color_mapping.cpp rename to externals/hermes/source/hermes/source/color_mapping.cpp index b290316..8a9d2b4 100644 --- a/externals/hermes/source/color_mapping.cpp +++ b/externals/hermes/source/hermes/source/color_mapping.cpp @@ -1,78 +1,78 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SX_NO_LOGGING - - -#include "hermes/color_mapping.hpp" - -#include -#include - - -namespace hermes -{ - -#ifndef SX_CPP03_BOOST - - -color_mapping::color_mapping() - : color_map_( - { - { log_level::LL_FATAL, color::C_RED }, { log_level::LL_ERROR, color::C_DARK_RED }, - { log_level::LL_ASSERT, color::C_DARK_RED }, { log_level::LL_WARN, color::C_YELLOW }, - { log_level::LL_INFO, color::C_DARK_YELLOW }, { log_level::LL_DEBUG, color::C_DARK_GREEN }, - { log_level::LL_TRACE,color::C_DARK_GREEN }, { log_level::LL_SPAM, color::C_GREEN } - } ) -{ - // Nothing to do... -} - - -#else - - - color_mapping::color_mapping() - { - color_map_[ log_level::LL_FATAL ] = color::C_RED; - color_map_[ log_level::LL_ERROR ] = color::C_DARK_RED; - color_map_[ log_level::LL_ASSERT ] = color::C_DARK_RED; - color_map_[ log_level::LL_WARN ] = color::C_YELLOW; - color_map_[ log_level::LL_INFO ] = color::C_DARK_YELLOW; - color_map_[ log_level::LL_DEBUG ] = color::C_DARK_GREEN; - color_map_[ log_level::LL_TRACE ] = color::C_DARK_GREEN; - color_map_[ log_level::LL_SPAM ] = color::C_GREEN; - } - - -#endif - - -color_mapping::~color_mapping() SX_NOEXCEPT -{ - // Nothing to do... -} - - -color color_mapping::get_color( const hermes::log_level _log_level ) const -{ - color color_to_use( color::C_WHITE ); - color_map::const_iterator search = color_map_.find( _log_level ); - if (search != color_map_.end()) - { - color_to_use = search->second; - } - return( color_to_use ); -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SX_NO_LOGGING + + +#include "hermes/color_mapping.hpp" + +#include +#include + + +namespace hermes +{ + +#ifndef SX_CPP03_BOOST + + +color_mapping::color_mapping() + : color_map_( + { + { log_level::LL_FATAL, color::C_RED }, { log_level::LL_ERROR, color::C_DARK_RED }, + { log_level::LL_ASSERT, color::C_DARK_RED }, { log_level::LL_WARN, color::C_YELLOW }, + { log_level::LL_INFO, color::C_DARK_YELLOW }, { log_level::LL_DEBUG, color::C_DARK_GREEN }, + { log_level::LL_TRACE,color::C_DARK_GREEN }, { log_level::LL_SPAM, color::C_GREEN } + } ) +{ + // Nothing to do... +} + + +#else + + + color_mapping::color_mapping() + { + color_map_[ log_level::LL_FATAL ] = color::C_RED; + color_map_[ log_level::LL_ERROR ] = color::C_DARK_RED; + color_map_[ log_level::LL_ASSERT ] = color::C_DARK_RED; + color_map_[ log_level::LL_WARN ] = color::C_YELLOW; + color_map_[ log_level::LL_INFO ] = color::C_DARK_YELLOW; + color_map_[ log_level::LL_DEBUG ] = color::C_DARK_GREEN; + color_map_[ log_level::LL_TRACE ] = color::C_DARK_GREEN; + color_map_[ log_level::LL_SPAM ] = color::C_GREEN; + } + + +#endif + + +color_mapping::~color_mapping() SX_NOEXCEPT +{ + // Nothing to do... +} + + +color color_mapping::get_color( const hermes::log_level _log_level ) const +{ + color color_to_use( color::C_WHITE ); + color_map::const_iterator search = color_map_.find( _log_level ); + if (search != color_map_.end()) + { + color_to_use = search->second; + } + return( color_to_use ); +} + + +} + + +#endif diff --git a/externals/hermes/source/cout_logger.cpp b/externals/hermes/source/hermes/source/cout_logger.cpp similarity index 96% rename from externals/hermes/source/cout_logger.cpp rename to externals/hermes/source/hermes/source/cout_logger.cpp index 23c6c03..9c4fb80 100644 --- a/externals/hermes/source/cout_logger.cpp +++ b/externals/hermes/source/hermes/source/cout_logger.cpp @@ -1,96 +1,96 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SX_NO_LOGGING - - -#include "hermes/cout_logger.hpp" - -#include -#include -#include - -#include "essentials/conversion.hpp" - -#include "hermes/log_message.hpp" - - -#ifdef WIN32 - - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -#ifndef SX_NO_WINDOWS_H - #include -#endif - - -#endif - -#include "hermes/globals.hpp" - - -namespace hermes -{ - - -cout_logger::cout_logger() - : logger(), - color_mapping_() -{ - // Nothing to do... -} - - -void cout_logger::log( const log_message& _log_message ) -{ - std::stringstream log_stream; - log_level_as_message( _log_message.log_level_ ); - log_stream << " " << _log_message.time_stamp_; - log_stream << " [" << _log_message.file_; - log_stream << "@" << sxe::to_string( _log_message.line_ ); - log_stream << "]: " << _log_message.message_; - std::cout << log_stream.str() << std::endl; -} - - -void cout_logger::log_level_as_message( const hermes::log_level _log_level ) const -{ - const std::string& log_level = log_level_to_string( _log_level ); - -#ifdef WIN32 - - CONSOLE_SCREEN_BUFFER_INFO console_screen_buffer_info; - HANDLE handle = GetStdHandle( STD_OUTPUT_HANDLE ); - GetConsoleScreenBufferInfo( handle, &console_screen_buffer_info ); - const color color_of_log_level = color_mapping_.get_color( _log_level ); -#ifndef SX_CPP03_BOOST - SetConsoleTextAttribute( handle, static_cast< WORD >( color_of_log_level ) ); -#else - SetConsoleTextAttribute(handle, static_cast< WORD >( color_of_log_level.value_ )); -#endif - std::cout << " " << std::setw( LOG_LEVEL_BLOCK_WIDTH ) << std::setfill( ' ' ) << std::left << log_level; - SetConsoleTextAttribute( handle, console_screen_buffer_info.wAttributes ); - -#else - - std::cout << " " << std::setw( LOG_LEVEL_BLOCK_WIDTH ) << std::setfill( ' ' ) << std::left << log_level; - -#endif - - -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SX_NO_LOGGING + + +#include "hermes/cout_logger.hpp" + +#include +#include +#include + +#include "essentials/conversion.hpp" + +#include "hermes/log_message.hpp" + + +#ifdef WIN32 + + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#ifndef SX_NO_WINDOWS_H + #include +#endif + + +#endif + +#include "hermes/globals.hpp" + + +namespace hermes +{ + + +cout_logger::cout_logger() + : logger(), + color_mapping_() +{ + // Nothing to do... +} + + +void cout_logger::log( const log_message& _log_message ) +{ + std::stringstream log_stream; + log_level_as_message( _log_message.log_level_ ); + log_stream << " " << _log_message.time_stamp_; + log_stream << " [" << _log_message.file_; + log_stream << "@" << sxe::to_string( _log_message.line_ ); + log_stream << "]: " << _log_message.message_; + std::cout << log_stream.str() << std::endl; +} + + +void cout_logger::log_level_as_message( const hermes::log_level _log_level ) const +{ + const std::string& log_level = log_level_to_string( _log_level ); + +#ifdef WIN32 + + CONSOLE_SCREEN_BUFFER_INFO console_screen_buffer_info; + HANDLE handle = GetStdHandle( STD_OUTPUT_HANDLE ); + GetConsoleScreenBufferInfo( handle, &console_screen_buffer_info ); + const color color_of_log_level = color_mapping_.get_color( _log_level ); +#ifndef SX_CPP03_BOOST + SetConsoleTextAttribute( handle, static_cast< WORD >( color_of_log_level ) ); +#else + SetConsoleTextAttribute(handle, static_cast< WORD >( color_of_log_level.value_ )); +#endif + std::cout << " " << std::setw( LOG_LEVEL_BLOCK_WIDTH ) << std::setfill( ' ' ) << std::left << log_level; + SetConsoleTextAttribute( handle, console_screen_buffer_info.wAttributes ); + +#else + + std::cout << " " << std::setw( LOG_LEVEL_BLOCK_WIDTH ) << std::setfill( ' ' ) << std::left << log_level; + +#endif + + +} + + +} + + +#endif diff --git a/externals/hermes/source/file_logger.cpp b/externals/hermes/source/hermes/source/file_logger.cpp similarity index 96% rename from externals/hermes/source/file_logger.cpp rename to externals/hermes/source/hermes/source/file_logger.cpp index 205bac0..ea66d69 100644 --- a/externals/hermes/source/file_logger.cpp +++ b/externals/hermes/source/hermes/source/file_logger.cpp @@ -1,186 +1,186 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SX_NO_LOGGING - - -#include "hermes/file_logger.hpp" - -#include -#include -#include - -#include "essentials/conversion.hpp" - -#include "hermes/file_system.hpp" -#include "hermes/globals.hpp" -#include "hermes/log_message.hpp" - - -namespace hermes -{ - - -file_logger::file_logger( const size_t _max_file_size_in_bytes, const std::string& _log_files_directory, - const std::string& _name_suffix, const std::string& _name_extension, const unsigned _max_file_number, - const bool _throw_on_error ) : - max_file_size_in_bytes_( _max_file_size_in_bytes ), - log_files_directory_( add_trailing_slash_to_directory_path( _log_files_directory ) ), - name_sufix_( _name_suffix ), - name_extension_( _name_extension ), - max_file_number_( _max_file_number ), - throw_on_error_( _throw_on_error ), - working_file_() -{ - // Set member here to avoid future trouble with initialization order. - working_file_ = get_working_log_file_name(); - rotate_if_necessary(); -} - - -file_logger::~file_logger() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void file_logger::log( const log_message& _log_message ) -{ - const std::string log_level = log_level_to_string( _log_message.log_level_ ); - std::stringstream log_message_stream; - log_message_stream << std::setw( LOG_LEVEL_BLOCK_WIDTH ) << std::setfill( ' ' ) << std::left << log_level << - " " << _log_message.time_stamp_ << " [" << _log_message.file_ << "@" << _log_message.line_ << - "]: " << _log_message.message_; - log_into_file( log_message_stream.str() ); - rotate_if_necessary(); -} - - -void file_logger::log_into_file( const std::string& _message ) const -{ - const bool append = does_file_exist( working_file_ ); - std::ios_base::openmode open_mode_flag; - if( append ) - { - open_mode_flag = std::ios::app; - } - else - { - open_mode_flag = std::ios::trunc; - } - -#ifndef SX_CPP03_BOOST - std::ofstream file( working_file_, open_mode_flag ); -#else - std::ofstream file( working_file_.c_str(), open_mode_flag ); -#endif - if( !file ) - { - const std::string error_message = sxe::sxprintf( "Failed to open file '%'.", working_file_ ); - if( throw_on_error_ ) - { - throw exception( error_message ); - } - else - { - std::cerr << error_message; - } - } - - file << _message << std::endl; - file.close(); -} - - -std::string file_logger::get_log_file_name_with_index( const unsigned _index ) const -{ - std::stringstream file_name_stream; - file_name_stream << log_files_directory_ << name_sufix_ << sxe::to_string( _index ) << "." << name_extension_; - return( file_name_stream.str() ); -} - - -std::string file_logger::get_working_log_file_name() const -{ - return( log_files_directory_ + name_sufix_ + "." + name_extension_ ); -} - - -void file_logger::rotate_if_necessary() const -{ - const size_t file_size = get_file_size( working_file_ ); - if( file_size > max_file_size_in_bytes_ ) - { - rename_files(); - } -} - - -void file_logger::rename_files() const -{ - for( unsigned i = max_file_number_ - 1; i > 0; --i ) - { - const std::string old_name = get_log_file_name_with_index( i - 1 ); - const std::string new_name = get_log_file_name_with_index( i ); - rename_file_if_exists( old_name, new_name ); - } - - // rename from foo.log to foo0.log - rename_file_if_exists( working_file_, get_log_file_name_with_index( 0 ) ); -} - - -void file_logger::rename_file_if_exists( const std::string& _old_name, const std::string& _new_name ) const -{ - if( does_file_exist( _old_name ) ) - { - if( does_file_exist( _new_name ) ) - { - delete_file( _new_name ); - } - - const int renamed = std::rename( _old_name.c_str(), _new_name.c_str() ); - if( renamed ) - { - const std::string error_message = sxe::sxprintf( "File '%' could not be renamed!", _old_name ); - if( throw_on_error_ ) - { - throw exception( error_message ); - } - else - { - std::cerr << error_message; - } - } - } -} - - -void file_logger::delete_file( const std::string& _file_name ) const -{ - const int removed = std::remove( _file_name.c_str() ); - if( removed > 0 ) - { - const std::string error_message = sxe::sxprintf( "File '%' could not be deleted!\n", _file_name ); - if( throw_on_error_ ) - { - throw exception( error_message ); - } - else - { - std::cerr << error_message; - } - } -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SX_NO_LOGGING + + +#include "hermes/file_logger.hpp" + +#include +#include +#include + +#include "essentials/conversion.hpp" + +#include "hermes/file_system.hpp" +#include "hermes/globals.hpp" +#include "hermes/log_message.hpp" + + +namespace hermes +{ + + +file_logger::file_logger( const size_t _max_file_size_in_bytes, const std::string& _log_files_directory, + const std::string& _name_suffix, const std::string& _name_extension, const unsigned _max_file_number, + const bool _throw_on_error ) : + max_file_size_in_bytes_( _max_file_size_in_bytes ), + log_files_directory_( add_trailing_slash_to_directory_path( _log_files_directory ) ), + name_sufix_( _name_suffix ), + name_extension_( _name_extension ), + max_file_number_( _max_file_number ), + throw_on_error_( _throw_on_error ), + working_file_() +{ + // Set member here to avoid future trouble with initialization order. + working_file_ = get_working_log_file_name(); + rotate_if_necessary(); +} + + +file_logger::~file_logger() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void file_logger::log( const log_message& _log_message ) +{ + const std::string log_level = log_level_to_string( _log_message.log_level_ ); + std::stringstream log_message_stream; + log_message_stream << std::setw( LOG_LEVEL_BLOCK_WIDTH ) << std::setfill( ' ' ) << std::left << log_level << + " " << _log_message.time_stamp_ << " [" << _log_message.file_ << "@" << _log_message.line_ << + "]: " << _log_message.message_; + log_into_file( log_message_stream.str() ); + rotate_if_necessary(); +} + + +void file_logger::log_into_file( const std::string& _message ) const +{ + const bool append = does_file_exist( working_file_ ); + std::ios_base::openmode open_mode_flag; + if( append ) + { + open_mode_flag = std::ios::app; + } + else + { + open_mode_flag = std::ios::trunc; + } + +#ifndef SX_CPP03_BOOST + std::ofstream file( working_file_, open_mode_flag ); +#else + std::ofstream file( working_file_.c_str(), open_mode_flag ); +#endif + if( !file ) + { + const std::string error_message = sxe::sxprintf( "Failed to open file '%'.", working_file_ ); + if( throw_on_error_ ) + { + throw exception( error_message ); + } + else + { + std::cerr << error_message; + } + } + + file << _message << std::endl; + file.close(); +} + + +std::string file_logger::get_log_file_name_with_index( const unsigned _index ) const +{ + std::stringstream file_name_stream; + file_name_stream << log_files_directory_ << name_sufix_ << sxe::to_string( _index ) << "." << name_extension_; + return( file_name_stream.str() ); +} + + +std::string file_logger::get_working_log_file_name() const +{ + return( log_files_directory_ + name_sufix_ + "." + name_extension_ ); +} + + +void file_logger::rotate_if_necessary() const +{ + const size_t file_size = get_file_size( working_file_ ); + if( file_size > max_file_size_in_bytes_ ) + { + rename_files(); + } +} + + +void file_logger::rename_files() const +{ + for( unsigned i = max_file_number_ - 1; i > 0; --i ) + { + const std::string old_name = get_log_file_name_with_index( i - 1 ); + const std::string new_name = get_log_file_name_with_index( i ); + rename_file_if_exists( old_name, new_name ); + } + + // rename from foo.log to foo0.log + rename_file_if_exists( working_file_, get_log_file_name_with_index( 0 ) ); +} + + +void file_logger::rename_file_if_exists( const std::string& _old_name, const std::string& _new_name ) const +{ + if( does_file_exist( _old_name ) ) + { + if( does_file_exist( _new_name ) ) + { + delete_file( _new_name ); + } + + const int renamed = std::rename( _old_name.c_str(), _new_name.c_str() ); + if( renamed ) + { + const std::string error_message = sxe::sxprintf( "File '%' could not be renamed!", _old_name ); + if( throw_on_error_ ) + { + throw exception( error_message ); + } + else + { + std::cerr << error_message; + } + } + } +} + + +void file_logger::delete_file( const std::string& _file_name ) const +{ + const int removed = std::remove( _file_name.c_str() ); + if( removed > 0 ) + { + const std::string error_message = sxe::sxprintf( "File '%' could not be deleted!\n", _file_name ); + if( throw_on_error_ ) + { + throw exception( error_message ); + } + else + { + std::cerr << error_message; + } + } +} + + +} + + +#endif diff --git a/externals/hermes/source/file_system.cpp b/externals/hermes/source/hermes/source/file_system.cpp similarity index 96% rename from externals/hermes/source/file_system.cpp rename to externals/hermes/source/hermes/source/file_system.cpp index 2e0022e..d4017f3 100644 --- a/externals/hermes/source/file_system.cpp +++ b/externals/hermes/source/hermes/source/file_system.cpp @@ -1,70 +1,70 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#include "hermes/file_system.hpp" - - -namespace hermes -{ - - -size_t get_file_size( const std::string& _file_name ) -{ -#ifndef SX_CPP03_BOOST - std::ifstream in( _file_name, std::ios::binary | std::ios::ate ); -#else - std::ifstream in( _file_name.c_str(), std::ios::binary | std::ios::ate ); -#endif - return( static_cast< size_t >( in.tellg() ) ); -} - - -bool does_file_exist( const std::string& _file_name ) -{ - bool file_exists = false; -#ifndef SX_CPP03_BOOST - std::ifstream in( _file_name ); -#else - std::ifstream in( _file_name.c_str() ); -#endif - if( in ) - { - file_exists = true; - in.close(); - } - - return( file_exists ); -} - - -std::string add_trailing_slash_to_directory_path( const std::string& _path ) -{ - std::string log_file_directory_with_trailing_slash = _path; - if( !log_file_directory_with_trailing_slash.empty() && ( *log_file_directory_with_trailing_slash.rbegin() != '/' ) && - ( *log_file_directory_with_trailing_slash.rbegin() != '\\' ) ) - { - log_file_directory_with_trailing_slash += '/'; - } - - if( !log_file_directory_with_trailing_slash.empty() && ( *log_file_directory_with_trailing_slash.rbegin() != '\\' ) ) - { - *log_file_directory_with_trailing_slash.rbegin() = '/'; - } - - if( log_file_directory_with_trailing_slash.empty() ) - { - log_file_directory_with_trailing_slash = "./"; - } - - return( log_file_directory_with_trailing_slash ); -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "hermes/file_system.hpp" + + +namespace hermes +{ + + +size_t get_file_size( const std::string& _file_name ) +{ +#ifndef SX_CPP03_BOOST + std::ifstream in( _file_name, std::ios::binary | std::ios::ate ); +#else + std::ifstream in( _file_name.c_str(), std::ios::binary | std::ios::ate ); +#endif + return( static_cast< size_t >( in.tellg() ) ); +} + + +bool does_file_exist( const std::string& _file_name ) +{ + bool file_exists = false; +#ifndef SX_CPP03_BOOST + std::ifstream in( _file_name ); +#else + std::ifstream in( _file_name.c_str() ); +#endif + if( in ) + { + file_exists = true; + in.close(); + } + + return( file_exists ); +} + + +std::string add_trailing_slash_to_directory_path( const std::string& _path ) +{ + std::string log_file_directory_with_trailing_slash = _path; + if( !log_file_directory_with_trailing_slash.empty() && ( *log_file_directory_with_trailing_slash.rbegin() != '/' ) && + ( *log_file_directory_with_trailing_slash.rbegin() != '\\' ) ) + { + log_file_directory_with_trailing_slash += '/'; + } + + if( !log_file_directory_with_trailing_slash.empty() && ( *log_file_directory_with_trailing_slash.rbegin() != '\\' ) ) + { + *log_file_directory_with_trailing_slash.rbegin() = '/'; + } + + if( log_file_directory_with_trailing_slash.empty() ) + { + log_file_directory_with_trailing_slash = "./"; + } + + return( log_file_directory_with_trailing_slash ); +} + + +} diff --git a/externals/hermes/source/globals.cpp b/externals/hermes/source/hermes/source/globals.cpp similarity index 97% rename from externals/hermes/source/globals.cpp rename to externals/hermes/source/hermes/source/globals.cpp index fe75321..927f891 100644 --- a/externals/hermes/source/globals.cpp +++ b/externals/hermes/source/hermes/source/globals.cpp @@ -1,21 +1,21 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#include "hermes/globals.hpp" - - -namespace hermes -{ - - -const int LOG_LEVEL_BLOCK_WIDTH = 7; - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "hermes/globals.hpp" + + +namespace hermes +{ + + +const int LOG_LEVEL_BLOCK_WIDTH = 7; + + +} diff --git a/externals/hermes/source/hermes_version.cpp b/externals/hermes/source/hermes/source/hermes_version.cpp similarity index 91% rename from externals/hermes/source/hermes_version.cpp rename to externals/hermes/source/hermes/source/hermes_version.cpp index e699fa3..61a6770 100644 --- a/externals/hermes/source/hermes_version.cpp +++ b/externals/hermes/source/hermes/source/hermes_version.cpp @@ -1,76 +1,76 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#include - -#include "essentials/compatibility/compatibility.hpp" -#include "essentials/sxprintf.hpp" - -#include "hermes/hermes_version.hpp" -#include "hermes/build_number.hpp" - - -namespace hermes -{ - - -namespace version -{ - - -namespace -{ - - -const sxe::uint16_t VERSION_MAJOR( 1 ); -const sxe::uint16_t VERSION_MINOR( 1 ); -const sxe::uint16_t VERSION_PATCH( 2 ); - - -} - - -// cppcheck-suppress unusedFunction -void log_version() -{ - std::cout << sxe::sxprintf( "hermes library version %.%.%.%.", hermes::version::get_major_version(), - hermes::version::get_minor_version(), hermes::version::get_patch_version(), hermes::version::get_build_number() ) - << std::endl; -} - - -sxe::uint16_t get_major_version() -{ - return( VERSION_MAJOR ); -} - - -sxe::uint16_t get_minor_version() -{ - return( VERSION_MINOR ); -} - - -sxe::uint16_t get_patch_version() -{ - return( VERSION_PATCH ); -} - - -sxe::uint16_t get_build_number() -{ - return( hermes::version::BUILD_NUMBER ); -} - - -} - - -} +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include + +#include "essentials/compatibility/compatibility.hpp" +#include "essentials/sxprintf.hpp" + +#include "hermes/hermes_version.hpp" +#include "hermes/build_number.hpp" + + +namespace hermes +{ + + +namespace version +{ + + +namespace +{ + + +const sxe::uint16_t VERSION_MAJOR( 1 ); +const sxe::uint16_t VERSION_MINOR( 2 ); +const sxe::uint16_t VERSION_PATCH( 0 ); + + +} + + +// cppcheck-suppress unusedFunction +void log_version() +{ + std::cout << sxe::sxprintf( "hermes library version %.%.%.%.", hermes::version::get_major_version(), + hermes::version::get_minor_version(), hermes::version::get_patch_version(), hermes::version::get_build_number() ) + << std::endl; +} + + +sxe::uint16_t get_major_version() +{ + return( VERSION_MAJOR ); +} + + +sxe::uint16_t get_minor_version() +{ + return( VERSION_MINOR ); +} + + +sxe::uint16_t get_patch_version() +{ + return( VERSION_PATCH ); +} + + +sxe::uint16_t get_build_number() +{ + return( hermes::version::BUILD_NUMBER ); +} + + +} + + +} diff --git a/externals/hermes/source/log_and_throw_helper.cpp b/externals/hermes/source/hermes/source/log_and_throw_helper.cpp similarity index 97% rename from externals/hermes/source/log_and_throw_helper.cpp rename to externals/hermes/source/hermes/source/log_and_throw_helper.cpp index 5ead8a2..c7ee22d 100644 --- a/externals/hermes/source/log_and_throw_helper.cpp +++ b/externals/hermes/source/hermes/source/log_and_throw_helper.cpp @@ -1,50 +1,50 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -#ifdef SX_CPP03_BOOST - - -#include "hermes/log_and_throw_helper.hpp" - -#include "essentials/sxprintf.hpp" - - -namespace hermes -{ - - - log_and_throw_helper::log_and_throw_helper( const std::string& _file_name, const int _line ) - : file_name_( _file_name ), - line_( _line ) - { - // Nothing to do... - } - - - log_and_throw_helper::~log_and_throw_helper() SX_NOEXCEPT - { - // Nothing to do... - } - - - void log_and_throw_helper::log( const log_level& _level, const std::string& _message ) const - { - hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, hermes::log_manager::get_instance().get_timestamp(), file_name_, line_, _message ); - } - throw sxe::exception( _message ); - } - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#ifdef SX_CPP03_BOOST + + +#include "hermes/log_and_throw_helper.hpp" + +#include "essentials/sxprintf.hpp" + + +namespace hermes +{ + + + log_and_throw_helper::log_and_throw_helper( const std::string& _file_name, const int _line ) + : file_name_( _file_name ), + line_( _line ) + { + // Nothing to do... + } + + + log_and_throw_helper::~log_and_throw_helper() SX_NOEXCEPT + { + // Nothing to do... + } + + + void log_and_throw_helper::log( const log_level& _level, const std::string& _message ) const + { + hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, hermes::log_manager::get_instance().get_timestamp(), file_name_, line_, _message ); + } + throw sxe::exception( _message ); + } + +} + + +#endif diff --git a/externals/hermes/source/log_helper.cpp b/externals/hermes/source/hermes/source/log_helper.cpp similarity index 97% rename from externals/hermes/source/log_helper.cpp rename to externals/hermes/source/hermes/source/log_helper.cpp index 79c86e3..ee95df0 100644 --- a/externals/hermes/source/log_helper.cpp +++ b/externals/hermes/source/hermes/source/log_helper.cpp @@ -1,47 +1,47 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifdef SX_CPP03_BOOST - -#include "hermes/log_helper.hpp" - -#include "essentials/sxprintf.hpp" - - -namespace hermes -{ - - - log_helper::log_helper( const std::string& _file_name, const int _line ) - : file_name_(_file_name), - line_(_line) - { - // Nothing to do... - } - - - log_helper::~log_helper() SX_NOEXCEPT - { - // Nothing to do... - } - - - void log_helper::log( const log_level& _level, const std::string& _message ) const - { - hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); - if( _level <= l_log_manager.get_log_level() ) - { - l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message ); - } - } - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef SX_CPP03_BOOST + +#include "hermes/log_helper.hpp" + +#include "essentials/sxprintf.hpp" + + +namespace hermes +{ + + + log_helper::log_helper( const std::string& _file_name, const int _line ) + : file_name_(_file_name), + line_(_line) + { + // Nothing to do... + } + + + log_helper::~log_helper() SX_NOEXCEPT + { + // Nothing to do... + } + + + void log_helper::log( const log_level& _level, const std::string& _message ) const + { + hermes::log_manager_template& l_log_manager = hermes::log_manager::get_instance(); + if( _level <= l_log_manager.get_log_level() ) + { + l_log_manager.log( _level, log_manager::get_instance().get_timestamp(), file_name_, line_, _message ); + } + } + +} + + +#endif diff --git a/externals/hermes/source/log_level.cpp b/externals/hermes/source/hermes/source/log_level.cpp similarity index 95% rename from externals/hermes/source/log_level.cpp rename to externals/hermes/source/hermes/source/log_level.cpp index 854b7db..4e50ed9 100644 --- a/externals/hermes/source/log_level.cpp +++ b/externals/hermes/source/hermes/source/log_level.cpp @@ -1,126 +1,126 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SX_NO_LOGGING - - -#include "hermes/log_level.hpp" - -#include "essentials/base.hpp" - - -namespace hermes -{ - - -std::string log_level_to_string( const log_level _log_level ) -{ - std::string log_level_string = "???"; - -#ifndef SX_CPP03_BOOST - switch( _log_level ) -#else - switch (_log_level.value_) -#endif - { - case ( log_level::LL_FATAL ): - { - log_level_string = "FATAL"; - } - break; - - case ( log_level::LL_ERROR ): - { - log_level_string = "ERROR"; - } - break; - - case ( log_level::LL_ASSERT ): - { - log_level_string = "ASSERT"; - } - break; - - case ( log_level::LL_WARN ): - { - log_level_string = "WARN"; - } - break; - - case ( log_level::LL_INFO ): - { - log_level_string = "INFO"; - } - break; - - case ( log_level::LL_DEBUG ): - { - log_level_string = "DEBUG"; - } - break; - - case ( log_level::LL_TRACE ): - { - log_level_string = "TRACE"; - } - break; - - case ( log_level::LL_SPAM ): - { - log_level_string = "SPAM"; - } - break; - - default: - SX_ASSERT( false, "Unknown log level!" ); - break; - } - - - return( log_level_string ); -} - - -#ifdef SX_CPP03_BOOST - - -// cppcheck-suppress unusedFunction -bool operator==(const hermes::log_level& _lhs, const hermes::log_level::inner _rhs) -{ - return( _lhs.value_ == _rhs ); -} - - -bool operator==(const hermes::log_level::inner _lhs, const hermes::log_level& _rhs) -{ - return( _lhs == _rhs.value_ ); -} - - -// cppcheck-suppress unusedFunction -bool operator<(const hermes::log_level _lhs, const hermes::log_level _rhs) -{ - return ( _lhs.value_ < _rhs.value_ ); -} - - -// cppcheck-suppress unusedFunction -bool operator<=( const hermes::log_level _lhs, const hermes::log_level _rhs ) -{ - return ( _lhs.value_ <= _rhs.value_ ); -} - - -#endif - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SX_NO_LOGGING + + +#include "hermes/log_level.hpp" + +#include "essentials/base.hpp" + + +namespace hermes +{ + + +std::string log_level_to_string( const log_level _log_level ) +{ + std::string log_level_string = "???"; + +#ifndef SX_CPP03_BOOST + switch( _log_level ) +#else + switch (_log_level.value_) +#endif + { + case ( log_level::LL_FATAL ): + { + log_level_string = "FATAL"; + } + break; + + case ( log_level::LL_ERROR ): + { + log_level_string = "ERROR"; + } + break; + + case ( log_level::LL_ASSERT ): + { + log_level_string = "ASSERT"; + } + break; + + case ( log_level::LL_WARN ): + { + log_level_string = "WARN"; + } + break; + + case ( log_level::LL_INFO ): + { + log_level_string = "INFO"; + } + break; + + case ( log_level::LL_DEBUG ): + { + log_level_string = "DEBUG"; + } + break; + + case ( log_level::LL_TRACE ): + { + log_level_string = "TRACE"; + } + break; + + case ( log_level::LL_SPAM ): + { + log_level_string = "SPAM"; + } + break; + + default: + SX_ASSERT( false, "Unknown log level!" ); + break; + } + + + return( log_level_string ); +} + + +#ifdef SX_CPP03_BOOST + + +// cppcheck-suppress unusedFunction +bool operator==(const hermes::log_level& _lhs, const hermes::log_level::inner _rhs) +{ + return( _lhs.value_ == _rhs ); +} + + +bool operator==(const hermes::log_level::inner _lhs, const hermes::log_level& _rhs) +{ + return( _lhs == _rhs.value_ ); +} + + +// cppcheck-suppress unusedFunction +bool operator<(const hermes::log_level _lhs, const hermes::log_level _rhs) +{ + return ( _lhs.value_ < _rhs.value_ ); +} + + +// cppcheck-suppress unusedFunction +bool operator<=( const hermes::log_level _lhs, const hermes::log_level _rhs ) +{ + return ( _lhs.value_ <= _rhs.value_ ); +} + + +#endif + + +} + + +#endif diff --git a/externals/hermes/source/log_message.cpp b/externals/hermes/source/hermes/source/log_message.cpp similarity index 96% rename from externals/hermes/source/log_message.cpp rename to externals/hermes/source/hermes/source/log_message.cpp index 9c859b6..cb3ef45 100644 --- a/externals/hermes/source/log_message.cpp +++ b/externals/hermes/source/hermes/source/log_message.cpp @@ -1,58 +1,58 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SX_NO_LOGGING - - -#include "hermes/log_message.hpp" -#include "hermes/log_callback.hpp" - - -namespace hermes -{ - - -log_message::log_message() - : log_level_(), - time_stamp_(), - file_(), - line_(), - message_(), - log_callback_() -{ - // Nothing to do... -} - - -log_message::log_message( log_callback* _log_callback, const log_level _log_level, const std::string& _time_stamp, - const std::string& _file, const int _line, const std::string& _message ) - : log_level_( _log_level ), - time_stamp_( _time_stamp ), - file_( _file ), - line_( _line ), - message_( _message ), - log_callback_( _log_callback ) -{ - // Nothing to do... -} - - -void log_message::done() -{ - if( log_callback_ ) - { - log_callback_->done(); - } -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SX_NO_LOGGING + + +#include "hermes/log_message.hpp" +#include "hermes/log_callback.hpp" + + +namespace hermes +{ + + +log_message::log_message() + : log_level_(), + time_stamp_(), + file_(), + line_(), + message_(), + log_callback_() +{ + // Nothing to do... +} + + +log_message::log_message( log_callback* _log_callback, const log_level _log_level, const std::string& _time_stamp, + const std::string& _file, const int _line, const std::string& _message ) + : log_level_( _log_level ), + time_stamp_( _time_stamp ), + file_( _file ), + line_( _line ), + message_( _message ), + log_callback_( _log_callback ) +{ + // Nothing to do... +} + + +void log_message::done() +{ + if( log_callback_ ) + { + log_callback_->done(); + } +} + + +} + + +#endif diff --git a/externals/hermes/source/std_timestamp_policy.cpp b/externals/hermes/source/hermes/source/std_timestamp_policy.cpp similarity index 97% rename from externals/hermes/source/std_timestamp_policy.cpp rename to externals/hermes/source/hermes/source/std_timestamp_policy.cpp index 001eec9..439d959 100644 --- a/externals/hermes/source/std_timestamp_policy.cpp +++ b/externals/hermes/source/hermes/source/std_timestamp_policy.cpp @@ -1,60 +1,60 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SX_NO_LOGGING - - -#include "hermes/std_timestamp_policy.hpp" - -#include -#include - -#include - - -namespace hermes -{ - - -namespace -{ - - -const unsigned int WIDTH_YEAR( 4 ); -const unsigned int WIDTH_CLOCK( 2 ); -const char FILL_VALUE( '0' ); -const unsigned int YEAR_1900( 1900 ); -const char DATE_DELIMITER( '/' ); -const char TIME_DELIMITER( ':' ); -const char SPACE_SEPARATOR( ' ' ); - - -} - - -std::string std_timestamp_policy::get_timestamp() -{ - std::stringstream date_time_stream; - time_t rawtime; - time( &rawtime ); - tm timeinfo = *localtime( &rawtime ); - date_time_stream << std::setfill( FILL_VALUE ) << std::setw( WIDTH_YEAR ) << ( YEAR_1900 + timeinfo.tm_year ) << - DATE_DELIMITER << std::setfill( FILL_VALUE ) << std::setw( WIDTH_CLOCK ) << ++timeinfo.tm_mon << DATE_DELIMITER << - std::setfill( FILL_VALUE ) << std::setw( WIDTH_CLOCK ) << timeinfo.tm_mday << SPACE_SEPARATOR << std::setfill( FILL_VALUE ) << - std::setw( WIDTH_CLOCK ) << timeinfo.tm_hour << TIME_DELIMITER << std::setfill( FILL_VALUE ) << - std::setw( WIDTH_CLOCK ) << timeinfo.tm_min << TIME_DELIMITER << std::setfill( FILL_VALUE ) << - std::setw( WIDTH_CLOCK ) << timeinfo.tm_sec; - return( date_time_stream.str() ); -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SX_NO_LOGGING + + +#include "hermes/std_timestamp_policy.hpp" + +#include +#include + +#include + + +namespace hermes +{ + + +namespace +{ + + +const unsigned int WIDTH_YEAR( 4 ); +const unsigned int WIDTH_CLOCK( 2 ); +const char FILL_VALUE( '0' ); +const unsigned int YEAR_1900( 1900 ); +const char DATE_DELIMITER( '/' ); +const char TIME_DELIMITER( ':' ); +const char SPACE_SEPARATOR( ' ' ); + + +} + + +std::string std_timestamp_policy::get_timestamp() +{ + std::stringstream date_time_stream; + time_t rawtime; + time( &rawtime ); + tm timeinfo = *localtime( &rawtime ); + date_time_stream << std::setfill( FILL_VALUE ) << std::setw( WIDTH_YEAR ) << ( YEAR_1900 + timeinfo.tm_year ) << + DATE_DELIMITER << std::setfill( FILL_VALUE ) << std::setw( WIDTH_CLOCK ) << ++timeinfo.tm_mon << DATE_DELIMITER << + std::setfill( FILL_VALUE ) << std::setw( WIDTH_CLOCK ) << timeinfo.tm_mday << SPACE_SEPARATOR << std::setfill( FILL_VALUE ) << + std::setw( WIDTH_CLOCK ) << timeinfo.tm_hour << TIME_DELIMITER << std::setfill( FILL_VALUE ) << + std::setw( WIDTH_CLOCK ) << timeinfo.tm_min << TIME_DELIMITER << std::setfill( FILL_VALUE ) << + std::setw( WIDTH_CLOCK ) << timeinfo.tm_sec; + return( date_time_stream.str() ); +} + + +} + + +#endif diff --git a/externals/hermes/source/waiter.cpp b/externals/hermes/source/hermes/source/waiter.cpp similarity index 96% rename from externals/hermes/source/waiter.cpp rename to externals/hermes/source/hermes/source/waiter.cpp index ebd8498..9f519a8 100644 --- a/externals/hermes/source/waiter.cpp +++ b/externals/hermes/source/hermes/source/waiter.cpp @@ -1,59 +1,59 @@ -////////////////////////////////////////////////////////////////////////////////////////////////////// -// // -// This file is part of the Seadex hermes library (http://hermes.seadex.de). // -// Copyright( C ) 2017 Seadex GmbH // -// Licensing information is available in the folder "license" which is part of this distribution. // -// The same information is available on the www @ http://hermes.seadex.de/License.html. // -// // -////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef SX_NO_LOGGING - - -#include "hermes/waiter.hpp" - - -namespace hermes -{ - - -waiter::waiter() - : done_mutex_(), - done_condition_variable_(), - done_() -{ - // Nothing to do... -} - - -waiter::~waiter() SX_NOEXCEPT -{ - // Nothing to do... -} - - -void waiter::wait() -{ - sxe::unique_lock lock( done_mutex_ ); - done_condition_variable_.wait( lock, sxe::bind( &waiter::is_done, this ) ); -} - - -void waiter::done() -{ - sxe::lock_guard lock( done_mutex_ ); - done_ = true; -} - - -bool waiter::is_done() -{ - // no locking necessary, only used within wait of condition variable - return( done_ ); -} - - -} - - -#endif +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex hermes library (http://hermes.seadex.de). // +// Copyright( C ) 2017 Seadex GmbH // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://hermes.seadex.de/License.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef SX_NO_LOGGING + + +#include "hermes/waiter.hpp" + + +namespace hermes +{ + + +waiter::waiter() + : done_mutex_(), + done_condition_variable_(), + done_() +{ + // Nothing to do... +} + + +waiter::~waiter() SX_NOEXCEPT +{ + // Nothing to do... +} + + +void waiter::wait() +{ + sxe::unique_lock lock( done_mutex_ ); + done_condition_variable_.wait( lock, sxe::bind( &waiter::is_done, this ) ); +} + + +void waiter::done() +{ + sxe::lock_guard lock( done_mutex_ ); + done_ = true; +} + + +bool waiter::is_done() +{ + // no locking necessary, only used within wait of condition variable + return( done_ ); +} + + +} + + +#endif diff --git a/genesis/changelog.txt b/genesis/changelog.txt deleted file mode 100644 index e46c774..0000000 --- a/genesis/changelog.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Change log -All notable changes to this project are documented in this file. - - -##[0.3.0] - 2017-09-21 - -### Added -• Support for Visual Studio 2017 builds - -### Fixed -• added missing override specifier to template_block::create method - - -##[0.2.0] - 2017-04-24 - -### Added -• C++03 compatibility - - -##[0.1.0] - 2017-04-24 - -• The very first release version of genesis diff --git a/libyasmine/CMakeLists.txt b/libyasmine/CMakeLists.txt index ec87305..d01545d 100644 --- a/libyasmine/CMakeLists.txt +++ b/libyasmine/CMakeLists.txt @@ -8,13 +8,15 @@ if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() -file(GLOB yasmine_SRC "include/*.hpp" "include_impl/*.hpp" "source/*.cpp" "../externals/essentials/include/essentials/*.hpp" "../externals/essentials/include/essentials/compatibility/*.hpp" "../externals/hermes/include/hermes/*.hpp" "../externals/essentials/source/*.cpp" "../externals/hermes/source/*.cpp") +file(GLOB yasmine_SRC "include/*.hpp" "include_impl/*.hpp" "source/*.cpp") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -include_directories("./include" "./include_impl" "../externals/essentials/include" "../externals/hermes/include") +include_directories("./include" "./include_impl") +include_directories("./../externals/essentials" "./../externals/essentials/source/essentials/include") +include_directories("./../externals/hermes" "./../externals/hermes/source/hermes/include") include(./../CMakeHelpers/addSpecificFlags.cmake) include(./../CMakeHelpers/addYasmineOptions.cmake) @@ -27,6 +29,18 @@ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") add_library(libyasmine STATIC ${yasmine_SRC}) endif() +set(link_libraries_list "") +use_pthread(link_libraries_list) +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library_for_linking(link_libraries_list libessentials) + add_library_for_linking(link_libraries_list libhermes) +else() + add_library_for_linking(link_libraries_list essentials) + add_library_for_linking(link_libraries_list hermes) +endif() +message(STATUS "libyasmine linking to libraries: ${link_libraries_list}" ) +target_link_libraries(libyasmine LINK_PUBLIC ${link_libraries_list}) + SET_TARGET_PROPERTIES ( libyasmine PROPERTIES VERSION 1.3.1 SOVERSION 1.3 ) diff --git a/libyasmine/changelog.txt b/libyasmine/changelog.txt index 4fb16ec..b90ecfe 100644 --- a/libyasmine/changelog.txt +++ b/libyasmine/changelog.txt @@ -1,6 +1,19 @@ # Change log All notable changes to this project are documented in this file. +##[1.3.4] - 2017-12-18 + +### Added +• (C++03) BOOST_BIND_OVER_9 - removes the limit of 7 methods/free functions as parameters for creating behaviors/guards using the assembly macros. The limit is because of boost::bind limitation to 9 arguments. +• (C++11) Y_BEHAVIOR_FREE_ACTION macro for using a free function as a behavior +• (C++11) Y_GUARD_FREE_ACTION macro for using a free function as guard + +### Changed +• Y_INVALID_EVENT_CREATION_REQUEST_HANDLE is now „external“ +• use essentials and hermes as libraries +• CMake: Adapt to use essentials and hermes as libraries. Applies to examples as well. + + ##[1.3.3] - 2017-11-10 ### Added @@ -357,4 +370,4 @@ and Y_EVENT_1PARAM_WITH_ID_PRIORITY to Y_EVENT_10PARAM_WITH_ID_PRIORITY) ##[0.1.0] - 2016-06-20 -• The very first released version of yasmine \ No newline at end of file +• The very first released version of yasmine diff --git a/libyasmine/include/assembly_common.hpp b/libyasmine/include/assembly_common.hpp index 1d2500a..024e831 100644 --- a/libyasmine/include/assembly_common.hpp +++ b/libyasmine/include/assembly_common.hpp @@ -34,9 +34,18 @@ #define Y_BEHAVIOR_METHOD2_SELECT_5( _object, _method1, _method2, _method3, _method4, _method5 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ) ) #define Y_BEHAVIOR_METHOD2_SELECT_6( _object, _method1, _method2, _method3, _method4, _method5, _method6 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ) ) #define Y_BEHAVIOR_METHOD2_SELECT_7( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ) ) -#define Y_BEHAVIOR_METHOD2_SELECT_8( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ) ) -#define Y_BEHAVIOR_METHOD2_SELECT_9( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ) ) -#define Y_BEHAVIOR_METHOD2_SELECT_10( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9, _method10 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ), sxy::adapt( _object, _method10 ) ) + +#ifndef SX_CPP03_BOOST + #define Y_BEHAVIOR_METHOD2_SELECT_8( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ) ) + #define Y_BEHAVIOR_METHOD2_SELECT_9( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ) ) + #define Y_BEHAVIOR_METHOD2_SELECT_10( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9, _method10 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ), sxy::adapt( _object, _method10 ) ) +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_BEHAVIOR_METHOD2_SELECT_8( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ) ) + #define Y_BEHAVIOR_METHOD2_SELECT_9( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ) ) + #define Y_BEHAVIOR_METHOD2_SELECT_10( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9, _method10 ) sxy::create_behavior_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ), sxy::adapt( _object, _method10 ) ) + #endif +#endif #define Y_GUARD_METHOD2_SELECT_1( _object, _method ) sxy::create_guard_function( sxy::adapt( _object, _method ) ) @@ -46,9 +55,17 @@ #define Y_GUARD_METHOD2_SELECT_5( _object, _method1, _method2, _method3, _method4, _method5 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ) ) #define Y_GUARD_METHOD2_SELECT_6( _object, _method1, _method2, _method3, _method4, _method5, _method6 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ) ) #define Y_GUARD_METHOD2_SELECT_7( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ) ) -#define Y_GUARD_METHOD2_SELECT_8( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ) ) -#define Y_GUARD_METHOD2_SELECT_9( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ) ) -#define Y_GUARD_METHOD2_SELECT_10( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9, _method10 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ), sxy::adapt( _object, _method10 ) ) +#ifndef SX_CPP03_BOOST + #define Y_GUARD_METHOD2_SELECT_8( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ) ) + #define Y_GUARD_METHOD2_SELECT_9( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ) ) + #define Y_GUARD_METHOD2_SELECT_10( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9, _method10 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ), sxy::adapt( _object, _method10 ) ) +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_GUARD_METHOD2_SELECT_8( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ) ) + #define Y_GUARD_METHOD2_SELECT_9( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ) ) + #define Y_GUARD_METHOD2_SELECT_10( _object, _method1, _method2, _method3, _method4, _method5, _method6, _method7, _method8, _method9, _method10 ) sxy::create_guard_function( sxy::adapt( _object, _method1 ), sxy::adapt( _object, _method2 ), sxy::adapt( _object, _method3 ), sxy::adapt( _object, _method4 ), sxy::adapt( _object, _method5 ), sxy::adapt( _object, _method6 ), sxy::adapt( _object, _method7 ), sxy::adapt( _object, _method8 ), sxy::adapt( _object, _method9 ), sxy::adapt( _object, _method10 ) ) + #endif +#endif #define Y_BEHAVIOR_FUNCTION2_SELECT_1( _function ) sxy::create_behavior_function( sxy::adapt_function( _function ) ) @@ -58,9 +75,17 @@ #define Y_BEHAVIOR_FUNCTION2_SELECT_5( _function1, _function2, _function3, _function4, _function5 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ) ) #define Y_BEHAVIOR_FUNCTION2_SELECT_6( _function1, _function2, _function3, _function4, _function5, _function6 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ) ) #define Y_BEHAVIOR_FUNCTION2_SELECT_7( _function1, _function2, _function3, _function4, _function5, _function6, _function7 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ) ) -#define Y_BEHAVIOR_FUNCTION2_SELECT_8( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ) ) -#define Y_BEHAVIOR_FUNCTION2_SELECT_9( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ) ) -#define Y_BEHAVIOR_FUNCTION2_SELECT_10( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9, _function10 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ), sxy::adapt_function( _function10 ) ) +#ifndef SX_CPP03_BOOST + #define Y_BEHAVIOR_FUNCTION2_SELECT_8( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ) ) + #define Y_BEHAVIOR_FUNCTION2_SELECT_9( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ) ) + #define Y_BEHAVIOR_FUNCTION2_SELECT_10( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9, _function10 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ), sxy::adapt_function( _function10 ) ) +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_BEHAVIOR_FUNCTION2_SELECT_8( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ) ) + #define Y_BEHAVIOR_FUNCTION2_SELECT_9( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ) ) + #define Y_BEHAVIOR_FUNCTION2_SELECT_10( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9, _function10 ) sxy::create_behavior_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ), sxy::adapt_function( _function10 ) ) + #endif +#endif #define Y_GUARD_FUNCTION2_SELECT_1( _function ) sxy::create_guard_function( sxy::adapt_function( _function ) ) @@ -70,9 +95,17 @@ #define Y_GUARD_FUNCTION2_SELECT_5( _function1, _function2, _function3, _function4, _function5 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ) ) #define Y_GUARD_FUNCTION2_SELECT_6( _function1, _function2, _function3, _function4, _function5, _function6 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ) ) #define Y_GUARD_FUNCTION2_SELECT_7( _function1, _function2, _function3, _function4, _function5, _function6, _function7 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ) ) -#define Y_GUARD_FUNCTION2_SELECT_8( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ) ) -#define Y_GUARD_FUNCTION2_SELECT_9( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ) ) -#define Y_GUARD_FUNCTION2_SELECT_10( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9, _function10 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ), sxy::adapt_function( _function10 ) ) +#ifndef SX_CPP03_BOOST + #define Y_GUARD_FUNCTION2_SELECT_8( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ) ) + #define Y_GUARD_FUNCTION2_SELECT_9( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ) ) + #define Y_GUARD_FUNCTION2_SELECT_10( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9, _function10 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ), sxy::adapt_function( _function10 ) ) +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_GUARD_FUNCTION2_SELECT_8( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ) ) + #define Y_GUARD_FUNCTION2_SELECT_9( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ) ) + #define Y_GUARD_FUNCTION2_SELECT_10( _function1, _function2, _function3, _function4, _function5, _function6, _function7, _function8, _function9, _function10 ) sxy::create_guard_function( sxy::adapt_function( _function1 ), sxy::adapt_function( _function2 ), sxy::adapt_function( _function3 ), sxy::adapt_function( _function4 ), sxy::adapt_function( _function5 ), sxy::adapt_function( _function6 ), sxy::adapt_function( _function7 ), sxy::adapt_function( _function8 ), sxy::adapt_function( _function9 ), sxy::adapt_function( _function10 ) ) + #endif +#endif #define Y_BEHAVIOR_METHOD2_1 Y_BEHAVIOR_METHOD2_SELECT_1 @@ -82,9 +115,17 @@ #define Y_BEHAVIOR_METHOD2_5 Y_BEHAVIOR_METHOD2_SELECT_5 #define Y_BEHAVIOR_METHOD2_6 Y_BEHAVIOR_METHOD2_SELECT_6 #define Y_BEHAVIOR_METHOD2_7 Y_BEHAVIOR_METHOD2_SELECT_7 -#define Y_BEHAVIOR_METHOD2_8 Y_BEHAVIOR_METHOD2_SELECT_8 -#define Y_BEHAVIOR_METHOD2_9 Y_BEHAVIOR_METHOD2_SELECT_9 -#define Y_BEHAVIOR_METHOD2_10 Y_BEHAVIOR_METHOD2_SELECT_10 +#ifndef SX_CPP03_BOOST + #define Y_BEHAVIOR_METHOD2_8 Y_BEHAVIOR_METHOD2_SELECT_8 + #define Y_BEHAVIOR_METHOD2_9 Y_BEHAVIOR_METHOD2_SELECT_9 + #define Y_BEHAVIOR_METHOD2_10 Y_BEHAVIOR_METHOD2_SELECT_10 +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_BEHAVIOR_METHOD2_8 Y_BEHAVIOR_METHOD2_SELECT_8 + #define Y_BEHAVIOR_METHOD2_9 Y_BEHAVIOR_METHOD2_SELECT_9 + #define Y_BEHAVIOR_METHOD2_10 Y_BEHAVIOR_METHOD2_SELECT_10 + #endif +#endif #define Y_GUARD_METHOD2_1 Y_GUARD_METHOD2_SELECT_1 @@ -94,9 +135,17 @@ #define Y_GUARD_METHOD2_5 Y_GUARD_METHOD2_SELECT_5 #define Y_GUARD_METHOD2_6 Y_GUARD_METHOD2_SELECT_6 #define Y_GUARD_METHOD2_7 Y_GUARD_METHOD2_SELECT_7 -#define Y_GUARD_METHOD2_8 Y_GUARD_METHOD2_SELECT_8 -#define Y_GUARD_METHOD2_9 Y_GUARD_METHOD2_SELECT_9 -#define Y_GUARD_METHOD2_10 Y_GUARD_METHOD2_SELECT_10 +#ifndef SX_CPP03_BOOST + #define Y_GUARD_METHOD2_8 Y_GUARD_METHOD2_SELECT_8 + #define Y_GUARD_METHOD2_9 Y_GUARD_METHOD2_SELECT_9 + #define Y_GUARD_METHOD2_10 Y_GUARD_METHOD2_SELECT_10 +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_GUARD_METHOD2_8 Y_GUARD_METHOD2_SELECT_8 + #define Y_GUARD_METHOD2_9 Y_GUARD_METHOD2_SELECT_9 + #define Y_GUARD_METHOD2_10 Y_GUARD_METHOD2_SELECT_10 + #endif +#endif #define Y_BEHAVIOR_FUNCTION2_1 Y_BEHAVIOR_FUNCTION2_SELECT_1 @@ -106,9 +155,17 @@ #define Y_BEHAVIOR_FUNCTION2_5 Y_BEHAVIOR_FUNCTION2_SELECT_5 #define Y_BEHAVIOR_FUNCTION2_6 Y_BEHAVIOR_FUNCTION2_SELECT_6 #define Y_BEHAVIOR_FUNCTION2_7 Y_BEHAVIOR_FUNCTION2_SELECT_7 -#define Y_BEHAVIOR_FUNCTION2_8 Y_BEHAVIOR_FUNCTION2_SELECT_8 -#define Y_BEHAVIOR_FUNCTION2_9 Y_BEHAVIOR_FUNCTION2_SELECT_9 -#define Y_BEHAVIOR_FUNCTION2_10 Y_BEHAVIOR_FUNCTION2_SELECT_10 +#ifndef SX_CPP03_BOOST + #define Y_BEHAVIOR_FUNCTION2_8 Y_BEHAVIOR_FUNCTION2_SELECT_8 + #define Y_BEHAVIOR_FUNCTION2_9 Y_BEHAVIOR_FUNCTION2_SELECT_9 + #define Y_BEHAVIOR_FUNCTION2_10 Y_BEHAVIOR_FUNCTION2_SELECT_10 +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_BEHAVIOR_FUNCTION2_8 Y_BEHAVIOR_FUNCTION2_SELECT_8 + #define Y_BEHAVIOR_FUNCTION2_9 Y_BEHAVIOR_FUNCTION2_SELECT_9 + #define Y_BEHAVIOR_FUNCTION2_10 Y_BEHAVIOR_FUNCTION2_SELECT_10 + #endif +#endif #define Y_GUARD_FUNCTION2_1 Y_GUARD_FUNCTION2_SELECT_1 @@ -118,9 +175,17 @@ #define Y_GUARD_FUNCTION2_5 Y_GUARD_FUNCTION2_SELECT_5 #define Y_GUARD_FUNCTION2_6 Y_GUARD_FUNCTION2_SELECT_6 #define Y_GUARD_FUNCTION2_7 Y_GUARD_FUNCTION2_SELECT_7 -#define Y_GUARD_FUNCTION2_8 Y_GUARD_FUNCTION2_SELECT_8 -#define Y_GUARD_FUNCTION2_9 Y_GUARD_FUNCTION2_SELECT_9 -#define Y_GUARD_FUNCTION2_10 Y_GUARD_FUNCTION2_SELECT_10 +#ifndef SX_CPP03_BOOST + #define Y_GUARD_FUNCTION2_8 Y_GUARD_FUNCTION2_SELECT_8 + #define Y_GUARD_FUNCTION2_9 Y_GUARD_FUNCTION2_SELECT_9 + #define Y_GUARD_FUNCTION2_10 Y_GUARD_FUNCTION2_SELECT_10 +#else + #ifdef BOOST_BIND_OVER_9 + #define Y_GUARD_FUNCTION2_8 Y_GUARD_FUNCTION2_SELECT_8 + #define Y_GUARD_FUNCTION2_9 Y_GUARD_FUNCTION2_SELECT_9 + #define Y_GUARD_FUNCTION2_10 Y_GUARD_FUNCTION2_SELECT_10 + #endif +#endif #endif // include guard diff --git a/libyasmine/include/assembly_cpp11.hpp b/libyasmine/include/assembly_cpp11.hpp index 394406e..b9dbfd8 100644 --- a/libyasmine/include/assembly_cpp11.hpp +++ b/libyasmine/include/assembly_cpp11.hpp @@ -21,27 +21,21 @@ #include "essentials/macro_helpers.hpp" -//!\brief Macro for using any type of action as a behavior. -#define Y_BEHAVIOR_ACTION( ... ) EXPAND( VA_SELECT( Y_BEHAVIOR_ACTION_SELECT, __VA_ARGS__ ) ) +//!\brief Macro for using a method as a behavior. +#define Y_BEHAVIOR_ACTION( _action ) \ + sxy::behavior_function( [this]( const sxy::event& _event, sxy::event_collector& _event_collector ){ SX_UNUSED_PARAMETER( _event ); SX_UNUSED_PARAMETER( _event_collector ); _action } ) -//!\brief Macro for using any type of action returning bool as a guard. -#define Y_GUARD_ACTION( ... ) EXPAND( VA_SELECT( Y_GUARD_ACTION_SELECT, __VA_ARGS__ ) ) - -//!\brief Macro for using any type of action as a behavior. -#define Y_BEHAVIOR_ACTION_SELECT_1( _action ) \ - sxy::behavior_function( [ this ]( const sxy::event& _event ){ SX_UNUSED_PARAMETER(_event); _action } ) - -//!\brief Macro for using any type of action as a behavior. -#define Y_BEHAVIOR_ACTION_SELECT_2( _class_name, _action ) \ - sxy::behavior_function( [ this ]( const sxy::event& _event ){ SX_UNUSED_PARAMETER(_event); _action } ) +//!\brief Macro for using a free function as a behavior. +#define Y_BEHAVIOR_FREE_ACTION( _action ) \ + sxy::behavior_function( []( const sxy::event& _event, sxy::event_collector& _event_collector ){ SX_UNUSED_PARAMETER( _event ); SX_UNUSED_PARAMETER( _event_collector ); _action } ) -//!\brief Macro for using any type of action returning bool as a guard. -#define Y_GUARD_ACTION_SELECT_1( _action ) \ - sxy::constraint_function( [ this ]( const sxy::event& _event ){ SX_UNUSED_PARAMETER(_event); _action } ) +//!\brief Macro for using a method as a guard. +#define Y_GUARD_ACTION( _action ) \ + sxy::constraint_function( [ this ]( const sxy::event& _event, sxy::event_collector& _event_collector ){ SX_UNUSED_PARAMETER(_event); SX_UNUSED_PARAMETER( _event_collector ); _action } ) -//!\brief Macro for using any type of action returning bool as a guard. -#define Y_GUARD_ACTION_SELECT_2( _class_name, _action ) \ - sxy::constraint_function( [ this ]( const sxy::event& _event ){ SX_UNUSED_PARAMETER(_event); _action } ) +//!\brief Macro for using a free function as a guard. +#define Y_GUARD_FREE_ACTION( _action ) \ + sxy::constraint_function( []( const sxy::event& _event, sxy::event_collector& _event_collector ){ SX_UNUSED_PARAMETER(_event); SX_UNUSED_PARAMETER( _event_collector ); _action } ) // Macros for passing handlers as behavior diff --git a/libyasmine/include/async_state_machine.hpp b/libyasmine/include/async_state_machine.hpp index e2f892b..aa06975 100644 --- a/libyasmine/include/async_state_machine.hpp +++ b/libyasmine/include/async_state_machine.hpp @@ -38,7 +38,7 @@ class async_state_machine SX_FINAL: //!\param _name Name of the state machine. //!\param _event_processing_callback Event processing callback interface pointer. It can be a nullptr if no callback //!interface should be used. - explicit async_state_machine( const std::string& _name, + explicit async_state_machine( const std::string& _name, event_processing_callback* const _event_processing_callback = SX_NULLPTR ); virtual ~async_state_machine() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY(async_state_machine) @@ -50,7 +50,7 @@ class async_state_machine SX_FINAL: //!Firing the event enqueues the event for being processed. virtual bool fire_event( const event_sptr& _event ) SX_OVERRIDE; - //!\brief Starts the state machine. When starting the state machine, the initial transitions are searched and + //!\brief Starts the state machine. When starting the state machine, the initial transitions are searched and //!executed. Without running the state machine, it is not possible to fire events. //!\return If the state machine reaches a terminate pseudostate after starting (on calling run), returns false. Else //!if the state machine is started and running, returns true. @@ -60,7 +60,7 @@ class async_state_machine SX_FINAL: //!\brief Stops and joins the state machine. When stopping the state machine, all the events remaining in the queue //!of events will be processed and the event processing thread will be then stopped and joined. The state machine //!will also check for active asynchronous simple states and will stop the do behavior for all of them. - //!\return void + //!\return void //!\sa halt, join, run void halt_and_join(); @@ -80,16 +80,16 @@ class async_state_machine SX_FINAL: //!\brief Waiting given amount of time for the state machine to terminate (or to stop). //!\param _timeoutInMs Time in milliseconds to wait for the state machine to terminate. //!\return bool true if the state machine is terminated or stopped, false otherwise. - //!\sa halt_and_join, halt, run, wait + //!\sa halt_and_join, halt, run, wait bool wait( const sxe::milliseconds _timeoutInMs ) const; - //!\brief Wait for the machine to terminate (or to stop). + //!\brief Wait for the machine to terminate (or to stop). //!\return void //!\sa halt_and_join, halt, run, wait void wait() const; //!\brief Check if the state machine is terminated or stopped. - //!\return bool true if the state machine is terminated or stopped, false otherwise. + //!\return bool true if the state machine is terminated or stopped, false otherwise. //!\sa halt_and_join, halt, run, wait bool terminated() const; @@ -106,17 +106,16 @@ class async_state_machine SX_FINAL: void start_state_machine(); -private: - bool insert( const event_sptr& _event ); +private: + bool insert( const event_sptr& _event ); void insert_impl( const event_sptr& _event ); bool wait_predicate() const; bool wait_stop_condition() const; - void work(); - + void work(); + //!\brief Sends a priority (internal) event and add it in the front of the event list, so it will be processed before other events. //!\return void virtual void on_event( const event_sptr& _event ) SX_OVERRIDE; - virtual void interrupt_impl() SX_OVERRIDE; diff --git a/libyasmine/include/event_handle.hpp b/libyasmine/include/event_handle.hpp index 3f2e0b2..bb55577 100644 --- a/libyasmine/include/event_handle.hpp +++ b/libyasmine/include/event_handle.hpp @@ -22,16 +22,11 @@ namespace sxy { - //!\brief The type alias for yasmine's event handle. - typedef sxe::uint32_t handle_type; +//!\brief The type alias for yasmine's event handle. +typedef sxe::uint32_t handle_type; -#ifndef SX_CPP03_BOOST - extern const handle_type Y_INVALID_EVENT_CREATION_REQUEST_HANDLE; -#else - #define Y_INVALID_EVENT_CREATION_REQUEST_HANDLE UINT_MAX -#endif - - extern const handle_type Y_DEFAULT_HANDLE; +extern const handle_type Y_INVALID_EVENT_CREATION_REQUEST_HANDLE; +extern const handle_type Y_DEFAULT_HANDLE; } diff --git a/libyasmine/include/event_template.hpp b/libyasmine/include/event_template.hpp index dcf70fc..b4a1467 100644 --- a/libyasmine/include/event_template.hpp +++ b/libyasmine/include/event_template.hpp @@ -104,7 +104,7 @@ public: \ //!\param _class_name Name of the event class. //!\param _event_id Event's id. #define Y_EVENT_WITH_ID( _class_name, _event_id ) Y_EVENT_WITH_ID_PRIORITY( _class_name, _event_id, Y_AUX_DEFAULT_EVENT_PRIORITY ) - + //!\brief Macro for creating an event class that inherits the specialized_event. The event has an ID, a priority and a given type parameter. //!\param _class_name Name of the event class. diff --git a/libyasmine/include/simple_state_base.hpp b/libyasmine/include/simple_state_base.hpp index 2b9ab90..46b77f8 100644 --- a/libyasmine/include/simple_state_base.hpp +++ b/libyasmine/include/simple_state_base.hpp @@ -27,7 +27,7 @@ class simple_state_base: public: - simple_state_base( const std::string& _name, behavior_uptr _entry_action, behavior_uptr _exit_action, + simple_state_base( const std::string& _name, behavior_uptr _entry_action, behavior_uptr _exit_action, const event_ids& _deferred_events, event_sptr _error_event ); virtual ~simple_state_base() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY(simple_state_base) @@ -36,7 +36,7 @@ class simple_state_base: virtual void accept_vertex_visitor( const_vertex_visitor& _visitor ) const SX_OVERRIDE; virtual void accept_vertex_visitor( vertex_visitor& _visitor ) SX_OVERRIDE; virtual void accept_complex_state_visitor( complex_state_visitor& _visitor ) const SX_OVERRIDE; - virtual void accept_state_visitor( state_visitor& _visitor ) const SX_OVERRIDE; + virtual void accept_state_visitor( state_visitor& _visitor ) const SX_OVERRIDE; virtual bool check( state_machine_defects& _defects ) const SX_OVERRIDE; virtual bool has_error_event() const SX_OVERRIDE; virtual event_sptr get_error_event() const SX_OVERRIDE; diff --git a/libyasmine/include/state_machine_base.hpp b/libyasmine/include/state_machine_base.hpp index 76c9b66..d6c47f1 100644 --- a/libyasmine/include/state_machine_base.hpp +++ b/libyasmine/include/state_machine_base.hpp @@ -166,7 +166,6 @@ namespace sxy //!\return A reference to the newly created transition. virtual transition& add_transition( const event_ids& _event_ids, vertex& _source, vertex& _target, const behavior_function& _behavior, const sxy::transition_kind _kind = transition_kind::EXTERNAL ); - virtual bool fire_event( const event_sptr& _event ) = 0; //!\brief Check the state machine for defects by checking the constraints of each component. @@ -211,9 +210,7 @@ namespace sxy private: virtual const events& get_deferred_events() const SX_OVERRIDE; - public: virtual raw_const_states get_active_state_configuration() const SX_OVERRIDE; - private: void get_active_states_from_region( raw_const_states& _active_state_configuration, const region& _region ) const; void check_regions_for_active_states( raw_const_states& _active_state_configuration, const state& _state ) const; void add_deferred_event( const event_sptr& _event_id ); diff --git a/libyasmine/include_impl/build_number.hpp b/libyasmine/include_impl/build_number.hpp index 24beab9..8b7c2da 100644 --- a/libyasmine/include_impl/build_number.hpp +++ b/libyasmine/include_impl/build_number.hpp @@ -24,7 +24,7 @@ namespace version { -const sxe::uint16_t BUILD_NUMBER( 810 ); +const sxe::uint16_t BUILD_NUMBER( 850 ); } diff --git a/libyasmine/libyasmine.vcxproj b/libyasmine/libyasmine.vcxproj index d2c78c2..51ddbab 100644 --- a/libyasmine/libyasmine.vcxproj +++ b/libyasmine/libyasmine.vcxproj @@ -83,42 +83,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -298,23 +262,6 @@ - - - - - - - - - - - - - - - - - diff --git a/libyasmine/libyasmine.vcxproj.filters b/libyasmine/libyasmine.vcxproj.filters index 42712f3..b43a800 100644 --- a/libyasmine/libyasmine.vcxproj.filters +++ b/libyasmine/libyasmine.vcxproj.filters @@ -121,27 +121,6 @@ {300a4103-75a9-433d-8fb0-a35791d8b2f5} - - {89ff470c-dd9c-4284-bc52-275caa35c0d5} - - - {0dc53fda-1061-474b-8825-e13872f8ddca} - - - {913833e0-01d4-48dd-8653-e64e51a760ab} - - - {19cda7e2-3e79-406b-b75f-5317e322840d} - - - {545fa18b-8716-46ed-a927-815ac91d2529} - - - {7ac2a40a-81b8-48a6-aeca-8d3c40566748} - - - {fc016843-b9e5-4795-bd00-2638aa1487cf} - {313d08d9-3c57-469d-918d-6dd8155e00e9} @@ -582,117 +561,9 @@ Headerdateien\infrastructure - - Headerdateien\external\essentials\compatibility - - - Headerdateien\external\essentials\compatibility - - - Headerdateien\external\essentials\compatibility - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - Headerdateien\infrastructure - - Headerdateien\external\essentials - - - Headerdateien\external\essentials - - - Headerdateien\external\hermes - - - Headerdateien\external\hermes - - - Headerdateien\external\essentials - - - Headerdateien\external\essentials\compatibility - - - Headerdateien\external\hermes - Headerdateien\infrastructure @@ -914,57 +785,6 @@ Quelldateien\core\state machine - - Quelldateien\external\essentials - - - Quelldateien\external\essentials - - - Quelldateien\external\essentials - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\hermes - - - Quelldateien\external\essentials - - - Quelldateien\external\hermes - - - Quelldateien\external\essentials - Quelldateien\core\state machine diff --git a/libyasmine/source/event_handle.cpp b/libyasmine/source/event_handle.cpp index 572d962..5ed3976 100644 --- a/libyasmine/source/event_handle.cpp +++ b/libyasmine/source/event_handle.cpp @@ -14,11 +14,15 @@ namespace sxy { - -#ifndef SX_CPP03_BOOST + + +#ifdef SX_CPP03_BOOST + const handle_type Y_INVALID_EVENT_CREATION_REQUEST_HANDLE = UINT_MAX; +#else const handle_type Y_INVALID_EVENT_CREATION_REQUEST_HANDLE = std::numeric_limits< handle_type >::max(); #endif - const handle_type Y_DEFAULT_HANDLE = 0; +const handle_type Y_DEFAULT_HANDLE = 0; + } diff --git a/libyasmine/source/version.cpp b/libyasmine/source/version.cpp index a4f4822..1233df1 100644 --- a/libyasmine/source/version.cpp +++ b/libyasmine/source/version.cpp @@ -28,7 +28,7 @@ namespace const sxe::uint16_t VERSION_MAJOR( 1 ); const sxe::uint16_t VERSION_MINOR( 3 ); -const sxe::uint16_t VERSION_PATCH( 3 ); +const sxe::uint16_t VERSION_PATCH( 4 ); } @@ -37,6 +37,7 @@ const sxe::uint16_t VERSION_PATCH( 3 ); #ifndef SX_NO_LOGGING +// cppcheck-suppress unusedFunction void log_version() { SX_LOG( hermes::log_level::LL_INFO, "yasmine library version %.%.%.%.", get_major_version(), diff --git a/libygen/CMakeLists.txt b/libygen/CMakeLists.txt index bddd971..bc73b4d 100644 --- a/libygen/CMakeLists.txt +++ b/libygen/CMakeLists.txt @@ -20,10 +20,10 @@ include(./../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") include_directories("./include") -include_directories("./../libyasmine" "./../genesis" "./../yasmine_model") -include_directories("./../libyasmine/include" "./../genesis/include" "./../yasmine_model/include") -include_directories("./../externals/essentials/include") - +include_directories("./../libyasmine/include") +include_directories("./../yasmine_model/include") +include_directories("./../externals/essentials/source/essentials/include") +include_directories("./../externals/genesis/source/genesis/include") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") @@ -39,9 +39,19 @@ if("${CPP_VERSION}" STREQUAL "03") endif() use_pthread(link_libraries_list) + add_library_for_linking(link_libraries_list libyasmine) -add_library_for_linking(link_libraries_list libgenesis) -add_library_for_linking(link_libraries_list libyasmine_model) + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library_for_linking(link_libraries_list libessentials) + add_library_for_linking(link_libraries_list libgenesis) + add_library_for_linking(link_libraries_list libyasmine_model) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library_for_linking(link_libraries_list essentials) + add_library_for_linking(link_libraries_list genesis) + add_library_for_linking(link_libraries_list yasmine_model) +endif() + message(STATUS "libygen linking to libraries: ${link_libraries_list}" ) target_link_libraries(libygen LINK_PUBLIC ${link_libraries_list}) diff --git a/libygen/changelog.txt b/libygen/changelog.txt index 526b851..7cc076e 100644 --- a/libygen/changelog.txt +++ b/libygen/changelog.txt @@ -1,6 +1,14 @@ # Change log All notable changes to this project are documented in this file. +##[0.1.3] - 2017-12-18 + +### Changed +• use essentials as library +• CMake: use external CMakeHelpers files +• CMake: refactoring of build scripts + + ##[0.1.0] - 2017-04-24 -• The very first released version of libygen \ No newline at end of file +• The very first released version of libygen diff --git a/libygen/include/libygen_build_number.hpp b/libygen/include/libygen_build_number.hpp index 8b1863c..9bcfefa 100644 --- a/libygen/include/libygen_build_number.hpp +++ b/libygen/include/libygen_build_number.hpp @@ -24,7 +24,7 @@ namespace version { - const sxe::uint16_t BUILD_NUMBER( 810 ); + const sxe::uint16_t BUILD_NUMBER( 850 ); } diff --git a/libygen/source/libygen_version.cpp b/libygen/source/libygen_version.cpp index de9d145..70f8472 100644 --- a/libygen/source/libygen_version.cpp +++ b/libygen/source/libygen_version.cpp @@ -31,8 +31,8 @@ namespace const sxe::uint16_t VERSION_MAJOR( 0 ); -const sxe::uint16_t VERSION_MINOR( 2 ); -const sxe::uint16_t VERSION_PATCH( 1 ); +const sxe::uint16_t VERSION_MINOR( 1 ); +const sxe::uint16_t VERSION_PATCH( 3 ); } diff --git a/libygen/source/recipe_callback_impl.cpp b/libygen/source/recipe_callback_impl.cpp index 2b076ff..8fe72e9 100644 --- a/libygen/source/recipe_callback_impl.cpp +++ b/libygen/source/recipe_callback_impl.cpp @@ -24,7 +24,7 @@ #include "composite_state_model_impl.hpp" #include "region_model.hpp" #include "state_model_impl.hpp" -#include "pseudostate_model.hpp" +#include "pseudostate_model_impl.hpp" namespace sxy @@ -534,7 +534,7 @@ std::string recipe_callback_impl::get_pseudostate_property( const std::string& _ { std::string result( "" ); const sxy::model::region_model* region_to_check = regions_stack_.top(); - const sxy::model::pseudostate_model* pseudostate = region_to_check->get_pseudostates()[pseudostate_index_]; + const sxy::model::pseudostate_model_impl* pseudostate = region_to_check->get_pseudostates()[pseudostate_index_]; if( pseudostate_index_ < region_to_check->get_pseudostates().size() ) { if( _property == VARIABLE_PSEUDOSTATE_NAME ) @@ -589,20 +589,18 @@ std::string recipe_callback_impl::get_event_property( const std::string& _proper std::string result( "" ); if( event_index_ < state_machine_model_.get_events().size() ) { - //const sxy::model::state_machine_model::events& events_ = state_machine_model_.get_events(); - //const auto ev = events_[event_index_]; - sxy::model::event_model event = state_machine_model_.get_events()[event_index_]; + sxy::model::event_sptr event = state_machine_model_.get_events()[event_index_]; if( _property == VARIABLE_EVENT_ID ) { - result = sxe::to_string( event.id ); + result = sxe::to_string( event->get_id() ); } else if( _property == VARIABLE_EVENT_NAME ) { - result = event.name; + result = event->get_name(); } else if( _property == VARIABLE_EVENT_PRIORITY ) { - result = sxe::to_string( event.priority ); + result = sxe::to_string( event->get_priority() ); } else { diff --git a/version.txt b/version.txt index a4689ae..765b833 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,15 @@ Versions +• yasmine 1.5.0 released 2017-12-18 + • libyasmine 1.3.4 + • essentials 1.3.2 + • hermes 1.2.0 + • genesis 0.3.2 + • yasmine_model 0.2.0 + • libygen 0.1.3 + • ygen 0.1.5 + + • yasmine 1.4.3 released 2017-11-10 • libyasmine 1.3.3 • essentials 1.3.1 diff --git a/yasmine.sln b/yasmine.sln index c957089..cd88e38 100644 --- a/yasmine.sln +++ b/yasmine.sln @@ -1,9 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.16 +VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libyasmine", "libyasmine\libyasmine.vcxproj", "{A728DDFB-BE51-49B5-8593-4E89E024A500}" + ProjectSection(ProjectDependencies) = postProject + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} = {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hello_yasmine", "examples\hello_yasmine\hello_yasmine.vcxproj", "{C231C585-F237-4F08-8BF5-8DC7106599D4}" ProjectSection(ProjectDependencies) = postProject @@ -74,8 +78,10 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "model", "model", "{68F3A738-05B2-48AE-AF75-B8E9FE63660E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yasmine_model", "yasmine_model\yasmine_model.vcxproj", "{2069AE83-AE26-484A-A6E7-E872E0045020}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genesis", "genesis\genesis.vcxproj", "{466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}" + ProjectSection(ProjectDependencies) = postProject + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} = {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libygen", "libygen\libygen.vcxproj", "{CED23388-105D-46FA-9EC3-AD923C209AED}" ProjectSection(ProjectDependencies) = postProject @@ -85,6 +91,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libygen", "libygen\libygen. EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ygen", "ygen\ygen.vcxproj", "{E70CC0C5-256B-41E2-A852-B1904C2D84D3}" ProjectSection(ProjectDependencies) = postProject + {2069AE83-AE26-484A-A6E7-E872E0045020} = {2069AE83-AE26-484A-A6E7-E872E0045020} {CED23388-105D-46FA-9EC3-AD923C209AED} = {CED23388-105D-46FA-9EC3-AD923C209AED} EndProjectSection EndProject @@ -114,6 +121,21 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unhandled_event_handler_exa {A728DDFB-BE51-49B5-8593-4E89E024A500} = {A728DDFB-BE51-49B5-8593-4E89E024A500} EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "externals", "externals", "{102C094E-DCBA-46DF-ABCC-7A29380154D4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "essentials", "externals\essentials\source\essentials\essentials.vcxproj", "{132F81F8-46DA-49D0-9071-D70BC087B38C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hermes", "externals\hermes\source\hermes\hermes.vcxproj", "{392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}" + ProjectSection(ProjectDependencies) = postProject + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genesis", "externals\genesis\source\genesis\genesis.vcxproj", "{466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}" + ProjectSection(ProjectDependencies) = postProject + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} = {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {132F81F8-46DA-49D0-9071-D70BC087B38C} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug - C++ 03|Win32 = Debug - C++ 03|Win32 @@ -197,6 +219,7 @@ Global {C231C585-F237-4F08-8BF5-8DC7106599D4}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 {C231C585-F237-4F08-8BF5-8DC7106599D4}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 {C231C585-F237-4F08-8BF5-8DC7106599D4}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {C231C585-F237-4F08-8BF5-8DC7106599D4}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 {C231C585-F237-4F08-8BF5-8DC7106599D4}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 {C231C585-F237-4F08-8BF5-8DC7106599D4}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 {C231C585-F237-4F08-8BF5-8DC7106599D4}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 @@ -457,46 +480,6 @@ Global {2069AE83-AE26-484A-A6E7-E872E0045020}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 {2069AE83-AE26-484A-A6E7-E872E0045020}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 {2069AE83-AE26-484A-A6E7-E872E0045020}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|Win32.ActiveCfg = Debug - Clang|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|Win32.Build.0 = Debug - Clang|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|x64.ActiveCfg = Debug - Clang|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|x64.Build.0 = Debug - Clang|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|Win32.ActiveCfg = Debug - VS 2013|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|Win32.Build.0 = Debug - VS 2013|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|x64.ActiveCfg = Debug - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|x64.Build.0 = Debug - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|Win32.ActiveCfg = Release - Clang|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|Win32.Build.0 = Release - Clang|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|x64.ActiveCfg = Release - Clang|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|x64.Build.0 = Release - Clang|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|Win32.ActiveCfg = Release - VS 2013|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|Win32.Build.0 = Release - VS 2013|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|x64.ActiveCfg = Release - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|x64.Build.0 = Release - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 {CED23388-105D-46FA-9EC3-AD923C209AED}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 {CED23388-105D-46FA-9EC3-AD923C209AED}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 {CED23388-105D-46FA-9EC3-AD923C209AED}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 @@ -653,6 +636,126 @@ Global {AE8A7631-2145-4356-B430-FD40416B9523}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 {AE8A7631-2145-4356-B430-FD40416B9523}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 {AE8A7631-2145-4356-B430-FD40416B9523}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - Clang|Win32.ActiveCfg = Debug - Clang|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - Clang|Win32.Build.0 = Debug - Clang|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - Clang|x64.ActiveCfg = Debug - Clang|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - Clang|x64.Build.0 = Debug - Clang|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2013|Win32.ActiveCfg = Debug - VS 2013|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2013|Win32.Build.0 = Debug - VS 2013|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2013|x64.ActiveCfg = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2013|x64.Build.0 = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - Clang|Win32.ActiveCfg = Release - Clang|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - Clang|Win32.Build.0 = Release - Clang|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - Clang|x64.ActiveCfg = Release - Clang|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - Clang|x64.Build.0 = Release - Clang|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2013|Win32.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2013|Win32.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2013|x64.ActiveCfg = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2013|x64.Build.0 = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {132F81F8-46DA-49D0-9071-D70BC087B38C}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - Clang|Win32.ActiveCfg = Debug - Clang|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - Clang|Win32.Build.0 = Debug - Clang|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - Clang|x64.ActiveCfg = Debug - Clang|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - Clang|x64.Build.0 = Debug - Clang|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2013|Win32.ActiveCfg = Debug - VS 2013|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2013|Win32.Build.0 = Debug - VS 2013|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2013|x64.ActiveCfg = Debug - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2013|x64.Build.0 = Debug - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - Clang|Win32.ActiveCfg = Release - Clang|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - Clang|Win32.Build.0 = Release - Clang|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - Clang|x64.ActiveCfg = Release - Clang|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - Clang|x64.Build.0 = Release - Clang|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2013|Win32.ActiveCfg = Release - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2013|Win32.Build.0 = Release - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2013|x64.ActiveCfg = Release - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2013|x64.Build.0 = Release - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|Win32.ActiveCfg = Debug - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|Win32.Build.0 = Debug - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|x64.ActiveCfg = Debug - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - C++ 03|x64.Build.0 = Debug - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|Win32.ActiveCfg = Debug - Clang|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|Win32.Build.0 = Debug - Clang|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|x64.ActiveCfg = Debug - Clang|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - Clang|x64.Build.0 = Debug - Clang|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|Win32.ActiveCfg = Debug - VS 2013|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|Win32.Build.0 = Debug - VS 2013|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|x64.ActiveCfg = Debug - VS 2013|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2013|x64.Build.0 = Debug - VS 2013|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|Win32.ActiveCfg = Debug - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|Win32.Build.0 = Debug - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|x64.ActiveCfg = Debug - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2015|x64.Build.0 = Debug - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|Win32.ActiveCfg = Debug - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|Win32.Build.0 = Debug - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|x64.ActiveCfg = Debug - VS 2017|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Debug - VS 2017|x64.Build.0 = Debug - VS 2017|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|Win32.ActiveCfg = Release - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|Win32.Build.0 = Release - C++ 03|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|x64.ActiveCfg = Release - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - C++ 03|x64.Build.0 = Release - C++ 03|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|Win32.ActiveCfg = Release - Clang|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|Win32.Build.0 = Release - Clang|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|x64.ActiveCfg = Release - Clang|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - Clang|x64.Build.0 = Release - Clang|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|Win32.ActiveCfg = Release - VS 2013|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|Win32.Build.0 = Release - VS 2013|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|x64.ActiveCfg = Release - VS 2013|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2013|x64.Build.0 = Release - VS 2013|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|Win32.ActiveCfg = Release - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|Win32.Build.0 = Release - VS 2015|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|x64.ActiveCfg = Release - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2015|x64.Build.0 = Release - VS 2015|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|Win32.ActiveCfg = Release - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|Win32.Build.0 = Release - VS 2017|Win32 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|x64.ActiveCfg = Release - VS 2017|x64 + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357}.Release - VS 2017|x64.Build.0 = Release - VS 2017|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -670,13 +773,15 @@ Global {47973C26-88C1-4C07-8B31-6D448D7BD387} = {FBC833F8-033B-4400-8CBA-C71A32CF62B4} {790287FF-8ECB-440C-8D3D-343AF0951E7B} = {FBC833F8-033B-4400-8CBA-C71A32CF62B4} {2069AE83-AE26-484A-A6E7-E872E0045020} = {68F3A738-05B2-48AE-AF75-B8E9FE63660E} - {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357} = {AF9A9587-13D2-4D16-9C3A-AB3061E3FEF3} {CED23388-105D-46FA-9EC3-AD923C209AED} = {AF9A9587-13D2-4D16-9C3A-AB3061E3FEF3} {E70CC0C5-256B-41E2-A852-B1904C2D84D3} = {AF9A9587-13D2-4D16-9C3A-AB3061E3FEF3} {B883C29E-485C-4C8F-ACB1-A1602378BF5C} = {AF9A9587-13D2-4D16-9C3A-AB3061E3FEF3} {CA16ABEE-C6DE-4BD4-9DE4-5C2F1D149A68} = {B883C29E-485C-4C8F-ACB1-A1602378BF5C} {A23DCF32-F7CB-450B-B4A0-59AD7BACFDD4} = {FBC833F8-033B-4400-8CBA-C71A32CF62B4} {AE8A7631-2145-4356-B430-FD40416B9523} = {B7DF480E-DC38-410F-86E7-330696F7D5AB} + {132F81F8-46DA-49D0-9071-D70BC087B38C} = {102C094E-DCBA-46DF-ABCC-7A29380154D4} + {392D14A1-D26A-4A7F-80F5-9CE9EA3171C9} = {102C094E-DCBA-46DF-ABCC-7A29380154D4} + {466B53F7-FF2E-4A0D-94C1-48E1ACC7D357} = {102C094E-DCBA-46DF-ABCC-7A29380154D4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {08130CC8-A1F0-4919-A481-F79DED03E207} diff --git a/yasmine_model/CMakeLists.txt b/yasmine_model/CMakeLists.txt index e221ef5..419aa24 100644 --- a/yasmine_model/CMakeLists.txt +++ b/yasmine_model/CMakeLists.txt @@ -20,7 +20,7 @@ include(./../CMakeHelpers/addYasmineOptions.cmake) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${extra_flags}") include_directories("./../yasmine_model/include") -include_directories("./../externals/essentials/include") +include_directories("./../externals/essentials" "./../externals/essentials/source/essentials/include") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_library(libyasmine_model ${LINK_TYPE} ${yasmine_model_SRC}) @@ -31,6 +31,12 @@ endif() set(link_libraries_list "") use_pthread(link_libraries_list) +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_library_for_linking(link_libraries_list libessentials) +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + add_library_for_linking(link_libraries_list essentials) +endif() + if("${CPP_VERSION}" STREQUAL "03") use_boost_libraries(link_libraries_list) endif() diff --git a/yasmine_model/changelog.txt b/yasmine_model/changelog.txt index ec19aad..c8482d8 100644 --- a/yasmine_model/changelog.txt +++ b/yasmine_model/changelog.txt @@ -1,6 +1,30 @@ # Change log All notable changes to this project are documented in this file. +##[0.2.0] - 2017-12-18 + +### Added +• new methods to interact with the elements (e.g. get_child, set_parent, ...) +• new methods to interact with the state machine (e.g. remove_event, get_event, remove_transition, get_transition, ...) +• rapidjson_document.hpp as a wrapper for rapidjson/document.h and rapidjson/prettywriter.h +• delete_visitor for deleting elements +• has_error_event to simple state model +• add_deferred_event and remove_deferred_event to state model +• constuctor to easily construct an async simple state model +• setters in transition_model for behavior, guard, triggers, target, source, and kind +• methods to get the element that deferes an event and to check if an element deferes an event +• list of external vertices + +### Changed +• internally use rapidjson_document.hpp instead of document.h +• event_model is now a class and has getters and setters for its properties +• use essentials as a library +• CMake: use external CMakeHelpers files + +### Fixed +• read/write error event from/to model file +• read/write region from/to model file: 'pseudostates' list is read for backward compatibility. Just 'vertices' is written. + ##[0.1.5] - 2017-11-10 diff --git a/yasmine_model/include/build_number.hpp b/yasmine_model/include/build_number.hpp index 5dd6fa1..f823114 100644 --- a/yasmine_model/include/build_number.hpp +++ b/yasmine_model/include/build_number.hpp @@ -24,7 +24,7 @@ namespace version { - const sxe::uint16_t BUILD_NUMBER( 810 ); + const sxe::uint16_t BUILD_NUMBER( 850 ); } diff --git a/yasmine_model/include/choice_model_fwd.hpp b/yasmine_model/include/choice_model_fwd.hpp index afa4166..23deabc 100644 --- a/yasmine_model/include/choice_model_fwd.hpp +++ b/yasmine_model/include/choice_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class choice_model; +class choice_model_impl; -typedef sxe::SX_UNIQUE_PTR choice_model_uptr; +typedef sxe::SX_UNIQUE_PTR choice_model_uptr; } diff --git a/yasmine_model/include/choice_model_impl.hpp b/yasmine_model/include/choice_model_impl.hpp index f6eb94c..3853613 100644 --- a/yasmine_model/include/choice_model_impl.hpp +++ b/yasmine_model/include/choice_model_impl.hpp @@ -36,6 +36,7 @@ class choice_model_impl SX_FINAL: virtual ~choice_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( choice_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/composite_state_model.hpp b/yasmine_model/include/composite_state_model.hpp index a05a8ec..a5775e1 100644 --- a/yasmine_model/include/composite_state_model.hpp +++ b/yasmine_model/include/composite_state_model.hpp @@ -48,8 +48,13 @@ class composite_state_model: SX_NO_COPY( composite_state_model ) virtual void add_region( region_model_uptr _region ) = 0; + virtual region_model& get_region( const size_t _index ) = 0; + virtual void remove_region( const size_t _index ) = 0; virtual raw_const_pseduostate_models get_state_pseudostates() const = 0; + virtual const size_t get_state_pseudostates_count() const = 0; + virtual pseudostate_model& get_state_pseudostate( const size_t _index ) = 0; virtual void add_state_pseudostate( pseudostate_model_uptr _pseudostate ) = 0; + virtual void remove_state_pseudostate( const size_t _index ) = 0; }; diff --git a/yasmine_model/include/composite_state_model_impl.hpp b/yasmine_model/include/composite_state_model_impl.hpp index eab43eb..0164ee7 100644 --- a/yasmine_model/include/composite_state_model_impl.hpp +++ b/yasmine_model/include/composite_state_model_impl.hpp @@ -43,23 +43,63 @@ class composite_state_model_impl SX_FINAL: SX_NO_COPY( composite_state_model_impl ) virtual const std::string& get_do_behavior() const SX_OVERRIDE; virtual void set_do_behavior( const std::string& _do_behavior ) SX_OVERRIDE; + //!\brief Get the entry behavior of the composite state. virtual const std::string& get_enter_behavior() const SX_OVERRIDE; + //!\brief Set the entry behavior of the composite state. void set_enter_behavior( const std::string& _enter_behavior ) SX_OVERRIDE; + //!\brief Get the exit behavior of the composite state. virtual const std::string& get_exit_behavior() const SX_OVERRIDE; + //!\brief Set the exit behavior of the composite state. void set_exit_behavior( const std::string& _exit_behavior ) SX_OVERRIDE; + //!\brief Get the regions of the composite state. virtual const raw_const_region_models get_regions() const SX_OVERRIDE; + + //!\brief Get the number of regions in the composite state. + virtual const size_t get_regions_count() const SX_OVERRIDE; + + //!\brief Get the region of the composite state with the given index. + virtual region_model& get_region( const size_t _index ) SX_OVERRIDE; + //!\brief Add a region to the list of regions of the composite state. virtual void add_region( region_model_uptr _region ) SX_OVERRIDE; + + //!\brief Remove the region with the given index. + virtual void remove_region( const size_t _index ) SX_OVERRIDE; + //!\brief Get the state pseudostates of the composite state. virtual raw_const_pseduostate_models get_state_pseudostates() const SX_OVERRIDE; + + //!\brief Get the number of state pseudostates of the composite state. + virtual const size_t get_state_pseudostates_count() const SX_OVERRIDE; + + //!\brief Get the state pseudostate with the given index. + virtual pseudostate_model& get_state_pseudostate( const size_t _index ) SX_OVERRIDE; + //!\brief Add a state pseudostate to the list of the state pseudostates of the composite state. virtual void add_state_pseudostate( pseudostate_model_uptr _pseudostate ) SX_OVERRIDE; + + //!\brief Remove the state pseudostate with the given index. + virtual void remove_state_pseudostate( const size_t _index ) SX_OVERRIDE; + + //!\brief Get the child element with the given uri. + //!\param _uri Uri of the requested element. + //!\return Pointer to the requested element. + //!\exception Throws sxy::model::exception if the element does not exists. + virtual state_machine_element_model* get_child( const sxe::uri& _uri ) SX_OVERRIDE; + + //!\brief Get list of that defer the given event. + //!\param _elements List of elements to be filled. + //!\param _event Deferred event. + virtual void get_event_references( std::vector& _elements, + const event_sptr _event ) SX_OVERRIDE; + virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; private: diff --git a/yasmine_model/include/consts.hpp b/yasmine_model/include/consts.hpp index 1547e41..8f9d69d 100644 --- a/yasmine_model/include/consts.hpp +++ b/yasmine_model/include/consts.hpp @@ -50,6 +50,7 @@ extern const char* const JSON_EVENT_PRIORITY; extern const char* const JSON_VERSION; extern const char* const JSON_CURRENT_VERSION_VALUE; extern const char* const JSON_VERSION_1; +extern const char* const JSON_EXTERNALS; extern const std::string TYPE_TRANSITION; diff --git a/yasmine_model/include/deep_history_model.hpp b/yasmine_model/include/deep_history_model.hpp index d5cbe92..6a86481 100644 --- a/yasmine_model/include/deep_history_model.hpp +++ b/yasmine_model/include/deep_history_model.hpp @@ -13,6 +13,7 @@ #include "pseudostate_model.hpp" +#include "deep_history_model_fwd.hpp" namespace sxy diff --git a/yasmine_model/include/deep_history_model_fwd.hpp b/yasmine_model/include/deep_history_model_fwd.hpp index 580d5b9..636f5d5 100644 --- a/yasmine_model/include/deep_history_model_fwd.hpp +++ b/yasmine_model/include/deep_history_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class deep_history_model; +class deep_history_model_impl; -typedef sxe::SX_UNIQUE_PTR deep_history_model_uptr; +typedef sxe::SX_UNIQUE_PTR deep_history_model_uptr; } diff --git a/yasmine_model/include/deep_history_model_impl.hpp b/yasmine_model/include/deep_history_model_impl.hpp index 987fbe6..5ec52cf 100644 --- a/yasmine_model/include/deep_history_model_impl.hpp +++ b/yasmine_model/include/deep_history_model_impl.hpp @@ -38,6 +38,7 @@ class deep_history_model_impl SX_FINAL: virtual ~deep_history_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( deep_history_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/delete_visitor.hpp b/yasmine_model/include/delete_visitor.hpp new file mode 100644 index 0000000..e91165e --- /dev/null +++ b/yasmine_model/include/delete_visitor.hpp @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////// +//// // +//// This file is part of the Seadex yasmine ecosystem (http://yasmine.seadex.de). // +//// Copyright (C) 2016-2017 Seadex GmbH // +//// // +//// Licensing information is available in the folder "license" which is part of this distribution. // +//// The same information is available on the www @ http://yasmine.seadex.de/Licenses.html. // +//// // +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef DELETE_VISITOR_3A02D550_C734_420C_B0D0_8720A701212B +#define DELETE_VISITOR_3A02D550_C734_420C_B0D0_8720A701212B + +#include "essentials/non_copyable.hpp" + + +namespace sxy +{ + + +namespace model +{ + + +class simple_state_model; +class composite_state_model; +class final_state_model; +class initial_pseudostate_model_impl; +class terminate_pseudostate_model_impl; +class join_model_impl; +class fork_model_impl; +class choice_model_impl; +class junction_model_impl; +class entry_point_model_impl; +class exit_point_model_impl; +class shallow_history_model_impl; +class deep_history_model_impl; +class transition_model; +class region_model; +class state_model; +class pseudostate_model_impl; + + +class delete_visitor SX_FINAL +{ +public: + explicit delete_visitor(); + ~delete_visitor() SX_NOEXCEPT; + SX_NO_COPY( delete_visitor ) + void visit( simple_state_model& _simple_state ); + void visit( composite_state_model& _composite_state ); + void visit( final_state_model& _final_state ); + void visit( initial_pseudostate_model_impl& _initial_pseudostate ); + void visit( terminate_pseudostate_model_impl& _terminate_pseudostate ); + void visit( join_model_impl& _join ); + void visit( fork_model_impl& _fork ); + void visit( choice_model_impl& _choice ); + void visit( junction_model_impl& _junction ); + void visit( entry_point_model_impl& _entry_point ); + void visit( exit_point_model_impl& _exit_point ); + void visit( shallow_history_model_impl& _shallow_history ); + void visit( deep_history_model_impl& _deep_history ); + void visit( transition_model& _transition ); + void visit( region_model& _region ); + + +private: + void delete_state( state_model* _state ); + void delete_pseudostate( pseudostate_model_impl* _pseudostate ); + void delete_state_pseudostate( pseudostate_model_impl* _state_pseudostate ); +}; + + +} + + +} + + +#endif diff --git a/yasmine_model/include/entry_point_model.hpp b/yasmine_model/include/entry_point_model.hpp index 4a80f35..70f81a7 100644 --- a/yasmine_model/include/entry_point_model.hpp +++ b/yasmine_model/include/entry_point_model.hpp @@ -13,6 +13,7 @@ #include "pseudostate_model.hpp" +#include "entry_point_model_fwd.hpp" namespace sxy diff --git a/yasmine_model/include/entry_point_model_fwd.hpp b/yasmine_model/include/entry_point_model_fwd.hpp index d305b63..b9340e9 100644 --- a/yasmine_model/include/entry_point_model_fwd.hpp +++ b/yasmine_model/include/entry_point_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class entry_point_model; +class entry_point_model_impl; -typedef sxe::SX_UNIQUE_PTR entry_point_model_uptr; +typedef sxe::SX_UNIQUE_PTR entry_point_model_uptr; } diff --git a/yasmine_model/include/entry_point_model_impl.hpp b/yasmine_model/include/entry_point_model_impl.hpp index c61c70f..9482855 100644 --- a/yasmine_model/include/entry_point_model_impl.hpp +++ b/yasmine_model/include/entry_point_model_impl.hpp @@ -36,6 +36,7 @@ class entry_point_model_impl SX_FINAL: virtual ~entry_point_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( entry_point_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/event_model.hpp b/yasmine_model/include/event_model.hpp index 6b98ab6..b1db54a 100644 --- a/yasmine_model/include/event_model.hpp +++ b/yasmine_model/include/event_model.hpp @@ -8,8 +8,8 @@ // // ////////////////////////////////////////////////////////////////////////////////////////////////////// -#ifndef EVENT_3677D50A_2158_4FCD_BB50_308B5C537D87 -#define EVENT_3677D50A_2158_4FCD_BB50_308B5C537D87 +#ifndef EVENT_MODEL_1280B0B7_E85B_4EFF_BF3D_D5548D88D0D8 +#define EVENT_MODEL_1280B0B7_E85B_4EFF_BF3D_D5548D88D0D8 #include "essentials/non_copyable.hpp" @@ -26,25 +26,29 @@ namespace model { -//!\struct event_model +//!\class event_model //!\brief An event in the model. -struct event_model +class event_model { public: - //!\brief Constructor. - event_model(); - //!\brief Constructor. //!\param _name Name of the event. - //!\param _id Id of the event. + //!\param _id ID of the event. //!\param _priority Priority of the event. - event_model( const std::string _name, const event_id _id, const event_priority _priority ); + explicit event_model( const std::string _name, const event_id _id, const event_priority _priority = 0 ); ~event_model() SX_NOEXCEPT; - - - std::string name; - event_id id; - event_priority priority; + const std::string& get_name() const; + void set_name( const std::string& _name ); + const event_id get_id() const; + void set_id( const event_id _id ); + const event_priority get_priority() const; + void set_priority( const event_priority _priority); + + +private: + std::string name_; + event_id id_; + event_priority priority_; }; diff --git a/yasmine_model/include/event_model_id.hpp b/yasmine_model/include/event_model_id.hpp index f9bba19..d2d8bd1 100644 --- a/yasmine_model/include/event_model_id.hpp +++ b/yasmine_model/include/event_model_id.hpp @@ -26,7 +26,7 @@ namespace model { -struct event_model; +class event_model; //!\brief The type alias for yasmine model's event IDs. @@ -34,17 +34,8 @@ typedef sxe::uint32_t event_id; //!\brief The type alias for yasmine model's event ID list. typedef std::vector< event_id > event_ids; -#if defined( SX_CPP03_BOOST ) || ( defined(_MSC_VER) && _MSC_VER <=1800 ) - -extern const event_id Y_MODEL_COMPLETION_EVENT_ID; - -#else - extern const event_id Y_MODEL_COMPLETION_EVENT_ID; -#endif - - typedef sxe::shared_ptr< event_model > event_sptr; diff --git a/yasmine_model/include/exit_point_model_fwd.hpp b/yasmine_model/include/exit_point_model_fwd.hpp index e182db6..774c2ac 100644 --- a/yasmine_model/include/exit_point_model_fwd.hpp +++ b/yasmine_model/include/exit_point_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class exit_point_model; +class exit_point_model_impl; -typedef sxe::SX_UNIQUE_PTR exit_point_model_uptr; +typedef sxe::SX_UNIQUE_PTR exit_point_model_uptr; } diff --git a/yasmine_model/include/exit_point_model_impl.hpp b/yasmine_model/include/exit_point_model_impl.hpp index 12b7d57..ff0fe72 100644 --- a/yasmine_model/include/exit_point_model_impl.hpp +++ b/yasmine_model/include/exit_point_model_impl.hpp @@ -38,6 +38,7 @@ class exit_point_model_impl SX_FINAL : virtual ~exit_point_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( exit_point_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/externals_fwd.hpp b/yasmine_model/include/externals_fwd.hpp new file mode 100644 index 0000000..032abb0 --- /dev/null +++ b/yasmine_model/include/externals_fwd.hpp @@ -0,0 +1,37 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex yasmine ecosystem (http://yasmine.seadex.de). // +// Copyright (C) 2016-2017 Seadex GmbH // +// // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://yasmine.seadex.de/Licenses.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef EXTERNALS_FWD_0272FF1D_FEB5_48EB_BDD8_A094BAD8D12F +#define EXTERNALS_FWD_0272FF1D_FEB5_48EB_BDD8_A094BAD8D12F + +#include + +#include "essentials/compatibility/compatibility.hpp" + + +namespace sxy +{ + + +namespace model +{ + +class state_machine_external_element; +typedef sxe::SX_UNIQUE_PTR external_uptr; +typedef std::vector< external_uptr > external_vertices; + +} + + +} + + +#endif + diff --git a/yasmine_model/include/final_state_model_fwd.hpp b/yasmine_model/include/final_state_model_fwd.hpp index 6769933..c17ba13 100644 --- a/yasmine_model/include/final_state_model_fwd.hpp +++ b/yasmine_model/include/final_state_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class final_state_model; +class final_state_model_impl; -typedef sxe::SX_UNIQUE_PTR< final_state_model > final_state_model_uptr; +typedef sxe::SX_UNIQUE_PTR< final_state_model_impl > final_state_model_uptr; } diff --git a/yasmine_model/include/final_state_model_impl.hpp b/yasmine_model/include/final_state_model_impl.hpp index b7c926f..a540285 100644 --- a/yasmine_model/include/final_state_model_impl.hpp +++ b/yasmine_model/include/final_state_model_impl.hpp @@ -14,7 +14,7 @@ #include "final_state_model.hpp" #include "state_model_impl.hpp" -#include "region_model_fwd.hpp" +#include "region_model.hpp" namespace sxy @@ -46,6 +46,7 @@ class final_state_model_impl SX_FINAL: virtual const std::string& get_exit_behavior() const SX_OVERRIDE; virtual void set_exit_behavior( const std::string& _exit_behavior ) SX_OVERRIDE; virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; private: diff --git a/yasmine_model/include/fork_model_fwd.hpp b/yasmine_model/include/fork_model_fwd.hpp index ee44e85..b693c04 100644 --- a/yasmine_model/include/fork_model_fwd.hpp +++ b/yasmine_model/include/fork_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class fork_model; +class fork_model_impl; -typedef sxe::SX_UNIQUE_PTR fork_model_uptr; +typedef sxe::SX_UNIQUE_PTR fork_model_uptr; } diff --git a/yasmine_model/include/fork_model_impl.hpp b/yasmine_model/include/fork_model_impl.hpp index 55b76ae..73fa923 100644 --- a/yasmine_model/include/fork_model_impl.hpp +++ b/yasmine_model/include/fork_model_impl.hpp @@ -38,6 +38,7 @@ class fork_model_impl SX_FINAL: virtual ~fork_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( fork_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/initial_pseudostate_model_fwd.hpp b/yasmine_model/include/initial_pseudostate_model_fwd.hpp index a41c00a..4882f07 100644 --- a/yasmine_model/include/initial_pseudostate_model_fwd.hpp +++ b/yasmine_model/include/initial_pseudostate_model_fwd.hpp @@ -22,10 +22,10 @@ namespace sxy namespace model { -class initial_pseudostate_model; +class initial_pseudostate_model_impl; -typedef sxe::SX_UNIQUE_PTR< initial_pseudostate_model > initial_pseudostate_model_uptr; +typedef sxe::SX_UNIQUE_PTR< initial_pseudostate_model_impl > initial_pseudostate_model_uptr; } diff --git a/yasmine_model/include/initial_pseudostate_model_impl.hpp b/yasmine_model/include/initial_pseudostate_model_impl.hpp index 8755f2c..7ee4ed5 100644 --- a/yasmine_model/include/initial_pseudostate_model_impl.hpp +++ b/yasmine_model/include/initial_pseudostate_model_impl.hpp @@ -41,6 +41,7 @@ class initial_pseudostate_model_impl SX_FINAL: virtual ~initial_pseudostate_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( initial_pseudostate_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/join_model_fwd.hpp b/yasmine_model/include/join_model_fwd.hpp index 6cfe25a..5fd6b84 100644 --- a/yasmine_model/include/join_model_fwd.hpp +++ b/yasmine_model/include/join_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class join_model; +class join_model_impl; -typedef sxe::SX_UNIQUE_PTR join_model_uptr; +typedef sxe::SX_UNIQUE_PTR join_model_uptr; } diff --git a/yasmine_model/include/join_model_impl.hpp b/yasmine_model/include/join_model_impl.hpp index 8a30bee..f488562 100644 --- a/yasmine_model/include/join_model_impl.hpp +++ b/yasmine_model/include/join_model_impl.hpp @@ -24,8 +24,8 @@ namespace model { - //!\class join_model_impl - //!\brief A join pseudostate in the model. +//!\class join_model_impl +//!\brief A join pseudostate in the model. class join_model_impl SX_FINAL: public virtual join_model, public pseudostate_model_impl { @@ -38,6 +38,7 @@ class join_model_impl SX_FINAL: virtual ~join_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( join_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/json_reader.hpp b/yasmine_model/include/json_reader.hpp index 81b79c2..96c9884 100644 --- a/yasmine_model/include/json_reader.hpp +++ b/yasmine_model/include/json_reader.hpp @@ -11,10 +11,14 @@ #ifndef JSON_READER_B84EDCFB_85B6_4060_971F_96D6FB6D87B7 #define JSON_READER_B84EDCFB_85B6_4060_971F_96D6FB6D87B7 +#include + #include "essentials/non_copyable.hpp" #include "essentials/uri.hpp" #include "rapidjson_document.hpp" + +#include "consts.hpp" #include "transition_model_kind.hpp" #include "region_model_fwd.hpp" #include "pseudostate_model_fwd.hpp" @@ -23,26 +27,32 @@ #include "composite_state_model_fwd.hpp" #include "simple_state_model_fwd.hpp" #include "final_state_model_fwd.hpp" -#include "entry_point_model_fwd.hpp" -#include "exit_point_model_fwd.hpp" -#include "deep_history_model_fwd.hpp" -#include "shallow_history_model_fwd.hpp" #include "initial_pseudostate_model_fwd.hpp" +#include "terminate_pseudostate_model_fwd.hpp" #include "join_model_fwd.hpp" -#include "junction_model_fwd.hpp" #include "fork_model_fwd.hpp" -#include "terminate_pseudostate_model_fwd.hpp" #include "choice_model_fwd.hpp" +#include "junction_model_fwd.hpp" +#include "entry_point_model_fwd.hpp" +#include "exit_point_model_fwd.hpp" +#include "deep_history_model_fwd.hpp" +#include "shallow_history_model_fwd.hpp" #include "transition_model_fwd.hpp" -#include "consts.hpp" -#include "model_element_type.hpp" #include "json_parser_helper.hpp" #include "event_model.hpp" +#include "externals_fwd.hpp" namespace sxy { + +namespace model +{ + class state_machine_element_model_impl; +} + + //!\class json_reader //!\brief Provides the ability to read an yasmine model from a JSON file (.ym). class json_reader SX_FINAL @@ -56,12 +66,15 @@ class json_reader SX_FINAL //!\brief Retrieve the read model. //!\return Pointer to the model. model::state_machine_model_ptr get_model_ptr(); + const model::external_vertices& get_external_vertices(); private: + void read_externals(); void read_json_file( const std::string& _file ); model::state_machine_model_ptr read_into_model(); sxy::model::event_ids read_deferred_events( const rapidjson::Value& _state ) const; + sxy::model::event_ids read_error_events( const rapidjson::Value& _state ) const; model::composite_state_model_uptr read_composite_state( const rapidjson::Value& _root ); model::simple_state_model_uptr read_simple_state( const rapidjson::Value& _state, bool _is_async = false ); model::final_state_model_uptr read_final_state( const rapidjson::Value& _state ); @@ -82,6 +95,7 @@ class json_reader SX_FINAL model::transition_model_uptr read_transition( const rapidjson::Value& _transition ); static sxy::model::transition_model_kind get_transition_kind( sxe::int64_t _kind ); sxe::int32_t get_event_id_by_name( const std::string& _name ) const; + std::string get_event_name( const sxe::int32_t _event_id ) const; sxe::int8_t get_event_priority_by_name( const std::string& _name ) const; void get_event_list( model::state_machine_model_ptr& _model ); void check_document() const; @@ -92,7 +106,7 @@ class json_reader SX_FINAL const std::string pseudostate_name = get_object_member_string( sxe::ref( _pseudostate ), model::JSON_NAME_NODE ); sxe::SX_UNIQUE_PTR< pseudostate_impl > new_pseudostate = SX_MAKE_UNIQUE< pseudostate_impl >( pseudostate_name ); - return( sxe::move( new_pseudostate ) ); + return( new_pseudostate ); } diff --git a/yasmine_model/include/json_writer.hpp b/yasmine_model/include/json_writer.hpp index 41ab84e..ff13578 100644 --- a/yasmine_model/include/json_writer.hpp +++ b/yasmine_model/include/json_writer.hpp @@ -14,22 +14,8 @@ #include -#define RAPIDJSON_NO_SIZETYPEDEFINE - - -namespace rapidjson -{ - - -typedef std::size_t SizeType; - - -} - - -#include "state_machine_model.hpp" - #include "rapidjson_document.hpp" +#include "state_machine_model.hpp" namespace sxy @@ -77,15 +63,17 @@ class json_writer SX_FINAL static void add_transitions_from_model( const model::state_machine_model& _state_machine_model, rapidjson::Value& _transitions, rapidjson::MemoryPoolAllocator< >& _allocator ); static void add_regions_from_model( const model::composite_state_model& _composite_state_model, - rapidjson::Value& _regions, rapidjson::MemoryPoolAllocator< >& _allocator ); + rapidjson::Value& _regions, rapidjson::MemoryPoolAllocator< >& _allocator, + const model::state_machine_model& _state_machine_model ); static void fill_region_object( const model::region_model& _region_model, rapidjson::Value& _region, - rapidjson::MemoryPoolAllocator< >& _allocator ); + rapidjson::MemoryPoolAllocator< >& _allocator, const model::state_machine_model& _state_machine_model ); static void fill_pseudostate_object( const model::pseudostate_model& _pseudostate_model, rapidjson::Value& _pseudostate, rapidjson::MemoryPoolAllocator< >& _allocator ); static void fill_simple_state_object( const model::simple_state_model& _simple_state_model, rapidjson::Value& _simple_state, - rapidjson::MemoryPoolAllocator< >& _allocator ); + rapidjson::MemoryPoolAllocator< >& _allocator, const model::state_machine_model& _state_machine_model ); static void fill_composite_state_object( const model::composite_state_model& _composite_state_model, - rapidjson::Value& _composite_state, rapidjson::MemoryPoolAllocator< >& _allocator ); + rapidjson::Value& _composite_state, rapidjson::MemoryPoolAllocator< >& _allocator, + const model::state_machine_model& _state_machine_model ); static void fill_final_state_object( const model::final_state_model& _final_state_model, rapidjson::Value& _final_state, rapidjson::MemoryPoolAllocator< >& _allocator ); static void add_state_pseudostates_from_model( const model::composite_state_model& _composite_state_model, @@ -96,6 +84,10 @@ class json_writer SX_FINAL rapidjson::MemoryPoolAllocator< >& _allocator ); static const std::string get_event_name_by_id( const sxy::model::event_id& _event_id, const model::state_machine_model& _state_machine_model ); + static const size_t get_event_index_by_id( const sxy::model::event_id& _event_id, + const model::state_machine_model& _state_machine_model ); + void add_externals( const model::state_machine_model& _state_machine_model, rapidjson::Value& _document, + rapidjson::MemoryPoolAllocator< >& _allocator ); }; diff --git a/yasmine_model/include/junction_model_fwd.hpp b/yasmine_model/include/junction_model_fwd.hpp index 1fc1163..729023b 100644 --- a/yasmine_model/include/junction_model_fwd.hpp +++ b/yasmine_model/include/junction_model_fwd.hpp @@ -22,10 +22,10 @@ namespace sxy namespace model { -class junction_model; +class junction_model_impl; -typedef sxe::SX_UNIQUE_PTR junction_model_uptr; +typedef sxe::SX_UNIQUE_PTR junction_model_uptr; } diff --git a/yasmine_model/include/junction_model_impl.hpp b/yasmine_model/include/junction_model_impl.hpp index a4e835f..738e088 100644 --- a/yasmine_model/include/junction_model_impl.hpp +++ b/yasmine_model/include/junction_model_impl.hpp @@ -38,6 +38,7 @@ class junction_model_impl SX_FINAL: virtual ~junction_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( junction_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/model.hpp b/yasmine_model/include/model.hpp index 78cd019..98ae7bb 100644 --- a/yasmine_model/include/model.hpp +++ b/yasmine_model/include/model.hpp @@ -11,7 +11,6 @@ #ifndef MODEL_70A5CEB1_6704_4CA7_B205_65579AFDC215 #define MODEL_70A5CEB1_6704_4CA7_B205_65579AFDC215 - #include "json_reader.hpp" #include "json_writer.hpp" @@ -21,7 +20,21 @@ #include "simple_state_model_impl.hpp" #include "composite_state_model_impl.hpp" #include "final_state_model_impl.hpp" + #include "pseudostate_model_impl.hpp" +#include "initial_pseudostate_model.hpp" +#include "terminate_pseudostate_model.hpp" +#include "join_model.hpp" +#include "fork_model.hpp" +#include "choice_model.hpp" +#include "junction_model.hpp" + +#include "entry_point_model.hpp" +#include "exit_point_model.hpp" +#include "shallow_history_model.hpp" +#include "deep_history_model.hpp" + +#include "delete_visitor.hpp" #include "model_exception.hpp" diff --git a/yasmine_model/include/pseudostate_model_fwd.hpp b/yasmine_model/include/pseudostate_model_fwd.hpp index e80ccaf..95e0a7e 100644 --- a/yasmine_model/include/pseudostate_model_fwd.hpp +++ b/yasmine_model/include/pseudostate_model_fwd.hpp @@ -25,12 +25,13 @@ namespace model { +class pseudostate_model_impl; class pseudostate_model; -typedef sxe::SX_UNIQUE_PTR pseudostate_model_uptr; +typedef sxe::SX_UNIQUE_PTR pseudostate_model_uptr; typedef std::vector pseudostate_models_uptr; -typedef std::vector< const pseudostate_model*> raw_const_pseduostate_models; +typedef std::vector< const pseudostate_model_impl*> raw_const_pseduostate_models; } diff --git a/yasmine_model/include/pseudostate_model_impl.hpp b/yasmine_model/include/pseudostate_model_impl.hpp index 57d2dce..2b1d1e1 100644 --- a/yasmine_model/include/pseudostate_model_impl.hpp +++ b/yasmine_model/include/pseudostate_model_impl.hpp @@ -38,15 +38,20 @@ class pseudostate_model_impl: pseudostate_model_impl( const std::string& _name, const model_element_type& _type ); virtual ~pseudostate_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( pseudostate_model_impl ) + //!\brief Get the list of the incoming transitions of the pseudostate. virtual raw_const_transition_models get_incoming_transitions() const SX_OVERRIDE; + //!\brief Add an incoming transition to the list of the incoming transitions of the pseudostate. virtual void add_incoming_transition( transition_models _incoming_transition ) SX_OVERRIDE; + //!\brief Get the list of the outgoing transitions of the pseudostate. virtual raw_const_transition_models get_outgoing_transitions() const SX_OVERRIDE; + //!\brief Add a outgoing transition to the list of the outgoing transitions of the pseudostate. virtual void add_outgoing_transition( transition_models _outgoing_transition ) SX_OVERRIDE; + virtual state_machine_element_model* get_child( const sxe::uri& _uri ) SX_OVERRIDE; private: transition_models incoming_transitions_; diff --git a/yasmine_model/include/rapidjson_document.hpp b/yasmine_model/include/rapidjson_document.hpp index 2e9a65e..a45e0d3 100644 --- a/yasmine_model/include/rapidjson_document.hpp +++ b/yasmine_model/include/rapidjson_document.hpp @@ -19,13 +19,14 @@ namespace rapidjson { -typedef std::size_t SizeType; +typedef ::std::size_t SizeType; } #include +#include #endif diff --git a/yasmine_model/include/region_model.hpp b/yasmine_model/include/region_model.hpp index 3700eb1..844cc1b 100644 --- a/yasmine_model/include/region_model.hpp +++ b/yasmine_model/include/region_model.hpp @@ -46,9 +46,15 @@ class region_model: SX_NO_COPY( region_model ) virtual row_const_state_models get_states() const = 0; + virtual const size_t get_states_count() const = 0; + virtual state_model& get_state( const size_t _index ) = 0; virtual void add_state( state_model_uptr _state ) = 0; + virtual void remove_state( const size_t _index ) = 0; virtual raw_const_pseduostate_models get_pseudostates() const = 0; + virtual const size_t get_pseudostates_count() const = 0; + virtual pseudostate_model& get_pseudostate( const size_t _index ) = 0; virtual void add_pseudostate( pseudostate_model_uptr _region_pseudostate ) = 0; + virtual void remove_pseudostate( const size_t _index ) = 0; }; diff --git a/yasmine_model/include/region_model_impl.hpp b/yasmine_model/include/region_model_impl.hpp index 1aca840..386fce8 100644 --- a/yasmine_model/include/region_model_impl.hpp +++ b/yasmine_model/include/region_model_impl.hpp @@ -35,15 +35,45 @@ class region_model_impl SX_FINAL: explicit region_model_impl( const std::string& _name ); virtual ~region_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( region_model_impl ) + //!\brief Get the list of the states of the region. row_const_state_models get_states() const SX_OVERRIDE; + + //!\brief Get the number of states in the region. + virtual const size_t get_states_count() const SX_OVERRIDE; + + //!\brief Get the state with the given index. + virtual state_model& get_state( const size_t _index ) SX_OVERRIDE; + //!\brief Add a state to the region. - void add_state( state_model_uptr _state ) SX_OVERRIDE; - //!\brief Get the list of pseudostates of the region. - raw_const_pseduostate_models get_pseudostates() const SX_OVERRIDE; + virtual void add_state( state_model_uptr _state ) SX_OVERRIDE; + + //!\brief Remove the state with the given index from the region. + virtual void remove_state( const size_t _index ) SX_OVERRIDE; + + //!\brief Get the list of pseudostates in the region. + virtual raw_const_pseduostate_models get_pseudostates() const SX_OVERRIDE; + + //!\brief Get the number of pseudostates in the region. + virtual const size_t get_pseudostates_count() const SX_OVERRIDE; + + //!\brief Get the pseudostate in the region with the given index. + virtual pseudostate_model& get_pseudostate( const size_t _index ) SX_OVERRIDE; + //!\brief Add a pseudostate to the region. void add_pseudostate( pseudostate_model_uptr _region_pseudostate ) SX_OVERRIDE; + //!\brief Remove the pseudostate with the given index from the region. + virtual void remove_pseudostate( const size_t _index ) SX_OVERRIDE; + + //!\brief Get the child element with the given uri. + //!\param _uri Uri of the searched element. + //!\return Pointer to the searched element. + //!\exception Throws sxy::model::exception if the element does not exists. + virtual state_machine_element_model* get_child( const sxe::uri& _uri ) SX_OVERRIDE; + + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; + private: state_models_uptr states_; diff --git a/yasmine_model/include/shallow_history_model_fwd.hpp b/yasmine_model/include/shallow_history_model_fwd.hpp index a2db7eb..624454f 100644 --- a/yasmine_model/include/shallow_history_model_fwd.hpp +++ b/yasmine_model/include/shallow_history_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class shallow_history_model; +class shallow_history_model_impl; -typedef sxe::SX_UNIQUE_PTR shallow_history_model_uptr; +typedef sxe::SX_UNIQUE_PTR shallow_history_model_uptr; } diff --git a/yasmine_model/include/shallow_history_model_impl.hpp b/yasmine_model/include/shallow_history_model_impl.hpp index a303ce2..87bf518 100644 --- a/yasmine_model/include/shallow_history_model_impl.hpp +++ b/yasmine_model/include/shallow_history_model_impl.hpp @@ -38,6 +38,7 @@ class shallow_history_model_impl SX_FINAL: virtual ~shallow_history_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( shallow_history_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/simple_state_model.hpp b/yasmine_model/include/simple_state_model.hpp index 25918a0..0e3697e 100644 --- a/yasmine_model/include/simple_state_model.hpp +++ b/yasmine_model/include/simple_state_model.hpp @@ -42,6 +42,7 @@ class simple_state_model : public virtual state_model SX_NO_COPY( simple_state_model ) + virtual bool has_error_event() const = 0; virtual event_sptr get_error_event() const = 0; virtual void set_error_event( event_sptr _error_event ) = 0; virtual bool is_async() const = 0; diff --git a/yasmine_model/include/simple_state_model_fwd.hpp b/yasmine_model/include/simple_state_model_fwd.hpp index a4c16ed..07d8932 100644 --- a/yasmine_model/include/simple_state_model_fwd.hpp +++ b/yasmine_model/include/simple_state_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class simple_state_model; +class simple_state_model_impl; -typedef sxe::SX_UNIQUE_PTR< simple_state_model > simple_state_model_uptr; +typedef sxe::SX_UNIQUE_PTR< simple_state_model_impl > simple_state_model_uptr; } diff --git a/yasmine_model/include/simple_state_model_impl.hpp b/yasmine_model/include/simple_state_model_impl.hpp index 922b26e..6722550 100644 --- a/yasmine_model/include/simple_state_model_impl.hpp +++ b/yasmine_model/include/simple_state_model_impl.hpp @@ -14,7 +14,7 @@ #include "simple_state_model.hpp" #include "state_model_impl.hpp" -#include "region_model_fwd.hpp" +#include "region_model.hpp" namespace sxy @@ -42,33 +42,67 @@ class simple_state_model_impl SX_FINAL: explicit simple_state_model_impl( const std::string& _name, const std::string& _enter_behavior = "", const std::string& _do_behavior = "", const std::string& _exit_behavior = "", const event_ids& _deferred_events = event_ids(), event_sptr _error_event = event_sptr(), bool _is_async = false ); + + //!\brief Constructor. + //!\param _name Name of the simple state. + //!\param _is_async Specify if the simple state is sync or async. + //!\param _enter_behavior Entry behavior of the simple state. + //!\param _do_behavior Do behavior of the simple state. + //!\param _exit_bahvior Exit behavior of the simple state. + //!\param _deferred_events List of IDs of deferred events. + //!\param _error_event Event that is fired in case an exception occurs. + explicit simple_state_model_impl( const std::string& _name, bool _is_async, const std::string& _enter_behavior = "", + const std::string& _do_behavior = "", const std::string& _exit_behavior = "", + const event_ids& _deferred_events = event_ids(), event_sptr _error_event = event_sptr() ); virtual ~simple_state_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( simple_state_model_impl ) + //!\brief Get the enter behavior of the simple state. virtual const std::string& get_enter_behavior() const SX_OVERRIDE; + //!\brief Set the enter behavior of the simple state. virtual void set_enter_behavior( const std::string& _enter_behavior ) SX_OVERRIDE; + //!\brief Get the do behavior of the simple state. virtual const std::string& get_do_behavior() const SX_OVERRIDE; + //!\brief Set the do behavior of the simple state. virtual void set_do_behavior( const std::string& _do_behavior ) SX_OVERRIDE; + //!\brief Get the exit behavior of the simple state. virtual const std::string& get_exit_behavior() const SX_OVERRIDE; + //!\brief Set the exit behavior of the simple state. virtual void set_exit_behavior( const std::string& _exit_behavior ) SX_OVERRIDE; virtual const raw_const_region_models get_regions() const SX_OVERRIDE; virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + + //!\brief Check if an error event is stored by the simple state. + //!\return True if an event is stored by the simple state, false otherwise. + virtual bool has_error_event() const SX_OVERRIDE; + //!\brief Get the error event stored by the simple state. - //!\return Pointer to the event stored by the simple state. + //!\return Event stored by the simple state. virtual event_sptr get_error_event() const SX_OVERRIDE; + //!\brief Set the error event stored by the simple state. virtual void set_error_event( event_sptr _error_event ) SX_OVERRIDE; + //!\brief Check if the simple state is asynchronous. //!\return True for async, false otherwise. virtual bool is_async() const SX_OVERRIDE; + //!\brief Set the simple state to be asynchronous or synchronous. + //!\param _is_async Switches the type of the simple state between asynchronous - on true - and synchronous - on false. virtual void set_is_async( bool _is_async ) SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; + + //!\brief Fill the given list with the elements that defer the given event. + //!\param _elements List of elements that defer the given event. + //!\param _event Deferred event. + virtual void get_event_references( std::vector& _elements, + const event_sptr _event ) SX_OVERRIDE; private: std::string enter_behavior_; diff --git a/yasmine_model/include/state_machine_element_model.hpp b/yasmine_model/include/state_machine_element_model.hpp index 725c794..681f7c3 100644 --- a/yasmine_model/include/state_machine_element_model.hpp +++ b/yasmine_model/include/state_machine_element_model.hpp @@ -31,6 +31,9 @@ namespace model { +class delete_visitor; + + //!\interface state_machine_element_model //!\brief Interface for an element in the state machine model. class state_machine_element_model @@ -50,10 +53,19 @@ class state_machine_element_model SX_NO_COPY( state_machine_element_model ) virtual const std::string & get_name() const = 0; + virtual void set_name( const std::string& _name ) = 0; virtual const sxe::uri get_uri() const = 0; virtual model::model_element_type get_type() const = 0; virtual const state_machine_element_model* get_parent() const = 0; - virtual void set_parent( const state_machine_element_model* _parent ) = 0; + virtual state_machine_element_model* get_parent() = 0; + virtual void set_parent( state_machine_element_model* _parent ) = 0; + + //!\brief Get the child element with the given uri. + //!\param _uri Uri of the requested element. + //!\return Pointer to the requested element. + //!\exception Throws sxy::model::exception if the element does not exists. + virtual state_machine_element_model* get_child( const sxe::uri& _uri ) = 0; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) = 0; }; diff --git a/yasmine_model/include/state_machine_element_model_impl.hpp b/yasmine_model/include/state_machine_element_model_impl.hpp index 892b998..a881388 100644 --- a/yasmine_model/include/state_machine_element_model_impl.hpp +++ b/yasmine_model/include/state_machine_element_model_impl.hpp @@ -37,21 +37,31 @@ class state_machine_element_model_impl: state_machine_element_model_impl( const std::string& _name, const model_element_type& _type ); virtual ~state_machine_element_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( state_machine_element_model_impl ) + //!\brief Get the name of the element. //!\return Name of the element. virtual const std::string & get_name() const SX_OVERRIDE; + //!\brief Set the name of the element. //!\param _name Name of the element. - void set_name( const std::string& _name ); + void set_name( const std::string& _name ) SX_OVERRIDE; + //!\brief Get the parent of the element. //!\return Pointer to the parent element. virtual const state_machine_element_model* get_parent() const SX_OVERRIDE; + + //!\brief Get the parent of the element (non const). + //!\return Pointer to the parent element. + virtual state_machine_element_model* get_parent() SX_OVERRIDE; + //!\brief Set the parent of the element. //!\param _parent Parent of the element. - virtual void set_parent( const state_machine_element_model* _parent ) SX_OVERRIDE; + virtual void set_parent( state_machine_element_model* _parent ) SX_OVERRIDE; + //!\brief Get the uri of the element. //!\return Uri of the element. virtual const sxe::uri get_uri() const SX_OVERRIDE; + //!\brief Get the type of the element. //!\return Element's type. virtual model_element_type get_type() const SX_OVERRIDE; @@ -61,11 +71,15 @@ class state_machine_element_model_impl: void add_ancestor_uri( sxe::uri& _uri ) const; std::string name_; - const state_machine_element_model* parent_; + state_machine_element_model* parent_; const model_element_type type_; }; + +typedef sxe::SX_UNIQUE_PTR state_machine_element_model_uptr; + + } diff --git a/yasmine_model/include/state_machine_external_element.hpp b/yasmine_model/include/state_machine_external_element.hpp new file mode 100644 index 0000000..e6efc65 --- /dev/null +++ b/yasmine_model/include/state_machine_external_element.hpp @@ -0,0 +1,54 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// This file is part of the Seadex yasmine ecosystem (http://yasmine.seadex.de). // +// Copyright (C) 2016-2017 Seadex GmbH // +// // +// Licensing information is available in the folder "license" which is part of this distribution. // +// The same information is available on the www @ http://yasmine.seadex.de/Licenses.html. // +// // +////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef STATE_MACHINE_EXTERNAL_ELEMENT_AEC00D27_A69B_41EB_A235_C68063B7F121 +#define STATE_MACHINE_EXTERNAL_ELEMENT_AEC00D27_A69B_41EB_A235_C68063B7F121 + +#include "essentials/non_copyable.hpp" + +#include "externals_fwd.hpp" +#include "model_element_type.hpp" + + +namespace sxy +{ + + +namespace model +{ + + +class state_machine_external_element SX_FINAL +{ +public: + explicit state_machine_external_element( const std::string& _name, const model_element_type& _type ); + ~state_machine_external_element() SX_NOEXCEPT; + SX_NO_COPY( state_machine_external_element ) + const std::string& get_name() const; + const std::string& get_name(); + void set_name( const std::string& _name ); + const model_element_type get_type() const; + void set_type( const model_element_type& _type ); + + +private: + std::string name_; + model_element_type type_; +}; + + +} + + +} + + +#endif + diff --git a/yasmine_model/include/state_machine_model.hpp b/yasmine_model/include/state_machine_model.hpp index b946f72..a5d2a97 100644 --- a/yasmine_model/include/state_machine_model.hpp +++ b/yasmine_model/include/state_machine_model.hpp @@ -14,10 +14,14 @@ #include #include "essentials/non_copyable.hpp" +#include "essentials/compatibility/compatibility.hpp" +#include "state_machine_model_fwd.hpp" #include "transition_model_fwd.hpp" #include "composite_state_model_fwd.hpp" #include "event_model.hpp" +#include "state_machine_external_element.hpp" +#include "state_machine_element_model_impl.hpp" namespace sxy @@ -28,12 +32,15 @@ namespace model { +class state_machine_element_model; + + //!\class state_machine_model //!\brief Class representing a model of a complete state machine. class state_machine_model { public: - typedef std::vector< event_model > events; + typedef std::vector< event_sptr > events; state_machine_model(); ~state_machine_model() SX_NOEXCEPT; @@ -42,30 +49,72 @@ class state_machine_model //!\brief Add a transition to the state machine. void add_transition( transition_model_uptr _transition ); + //!\brief Remove transition with the given index from state machine. + void remove_transition( const size_t _index ); + //!\brief Get a list of transitions. //!\return List of transitions. raw_const_transition_models get_transitions() const; + //!\brief Get the transition with the given index. + //!\param _index The index of requested transition. + //!\return Requested transition. + transition_model& get_transition( const size_t _index ); + //!\brief Get a reference to the root state of the state machine. - //!\reference Reference to the root state of the state machine. + //!\return Root state of the state machine. composite_state_model_impl& get_root_state() const; //!\brief Add the root state to the state machine. void add_root_state( composite_state_model_uptr _root_state ); - //!\brief Get a list of events that was read from JSON file. This events are the events used in this state machine's scenario. + //!\brief Get a list of events that was read from a JSON file. These events are the events used in this state machine. events get_events() const; - - //!\brief Add an event to the list of the events. + + //!\brief Get the event with the given index. + event_model& get_event( const size_t _index ); + + //!\brief Get the event with the given index. + const event_model& get_event( const size_t _index ) const; + + //!\brief Get name of the event with the given ID. + std::string get_event_name( const sxy::model::event_id& _event_id ) const; + + //!\brief Add an event to the list of events. //!\param _event_name Name of the event. - //!\param _event_id Id of the event. + //!\param _event_id ID of the event. void add_event( const std::string& _event_name, const event_id& _event_id, const event_priority& _event_priority ); + //!\brief Remove an event from the list of events. + //!\param _index Index of the event to be deleted. + void remove_event( const size_t _index ); + + //!\brief Get a list of elements that have a reference to the given event. + //!\param _event Event for which referencing elements are searched. + //!\return List of elements that are referencing the given event. + std::vector get_event_references( const event_sptr _event ); + + //!\brief Get a list of elements that are not part of this state machine, but of another state machine. + // These elements can be used as source or target for transitions. + const external_vertices& get_externals() const; + + //!\brief Get a list of elements that are not part of this state machine, but of another state machine. + external_vertices& get_externals(); + + //!\brief Add a new external vertex. + //!\param _external_vertex The vertex that is added to the list of external vertices. + void add_external_vertex( external_uptr _external_vertex ); + + //!\brief Remove an element from the list of external vertices. + //!\param _index Index of the element to be deleted. + void remove_external_vertex( const size_t _index ); + private: transition_models transitions_; composite_state_model_uptr root_state_; events event_list_; + external_vertices externals_; }; diff --git a/yasmine_model/include/state_model.hpp b/yasmine_model/include/state_model.hpp index 7c555b8..ee32737 100644 --- a/yasmine_model/include/state_model.hpp +++ b/yasmine_model/include/state_model.hpp @@ -49,7 +49,11 @@ class state_model : public virtual state_machine_element_model SX_NO_COPY( state_model ) virtual raw_const_transition_models get_transitions() const = 0; virtual const event_ids& get_deferred_events() const = 0; + virtual void add_deferred_event( const event_id _deferred_event_id ) = 0; + virtual void remove_deferred_event( const event_id _deferred_event_id ) = 0; + virtual bool defers_event( const event_id _id ) const = 0; virtual const raw_const_region_models get_regions() const = 0; + virtual const size_t get_regions_count() const = 0; virtual const std::string& get_enter_behavior() const = 0; virtual void set_enter_behavior( const std::string& _enter_behavior ) = 0; virtual const std::string& get_do_behavior() const = 0; @@ -57,6 +61,8 @@ class state_model : public virtual state_machine_element_model virtual const std::string& get_exit_behavior() const = 0; virtual void set_exit_behavior( const std::string& _exit_behavior ) = 0; virtual void accept( model_vertex_visitor& _constructor_visitor ) const = 0; + virtual void get_event_references( std::vector& _elements, + const event_sptr _event ) = 0; }; diff --git a/yasmine_model/include/state_model_impl.hpp b/yasmine_model/include/state_model_impl.hpp index ba28f2e..b8623c5 100644 --- a/yasmine_model/include/state_model_impl.hpp +++ b/yasmine_model/include/state_model_impl.hpp @@ -39,11 +39,37 @@ class state_model_impl: const event_ids& _deferred_events = event_ids() ); virtual ~state_model_impl() SX_NOEXCEPT; SX_NO_COPY( state_model_impl ) + + //!\brief Get the number of regions of the state. + virtual const size_t get_regions_count() const SX_OVERRIDE; + //!\brief Get the list of transitions of the state. virtual raw_const_transition_models get_transitions() const SX_OVERRIDE; - //!\brief Get the list of IDs of deferred events. + + //!\brief Get list of IDs of deferred events. virtual const event_ids& get_deferred_events() const SX_OVERRIDE; + //!\brief Add a deferred event ID to the list of deferred events. + //!\param _deferred_event_id Event ID to add as deferred event. + virtual void add_deferred_event( const event_id _deferred_event_id ) SX_OVERRIDE; + + //!\brief Remove a deferred event ID from the list of deferred events. + //!\param _deferred_event_id Event ID to remove from deferred events. + virtual void remove_deferred_event( const event_id _deferred_event_id ) SX_OVERRIDE; + + //!\brief Check if the state defers the given event ID. + //!\param _id Event ID to check if it is deferred. + //!\return True if event ID is deferred, false otherwise. + virtual bool defers_event( const event_id _id ) const SX_OVERRIDE; + + virtual state_machine_element_model* get_child( const sxe::uri& _uri ) SX_OVERRIDE; + + //!\brief Fill the given list with the elements that defer the given event. + //!\param _elements List of elements that defer the given event. + //!\param _event Deferred event. + virtual void get_event_references( std::vector& _elements, + const event_sptr _event ) SX_OVERRIDE; + private: transition_models transitions_; diff --git a/yasmine_model/include/terminate_pseudostate_model_fwd.hpp b/yasmine_model/include/terminate_pseudostate_model_fwd.hpp index 8717a37..44080e3 100644 --- a/yasmine_model/include/terminate_pseudostate_model_fwd.hpp +++ b/yasmine_model/include/terminate_pseudostate_model_fwd.hpp @@ -23,10 +23,10 @@ namespace model { -class terminate_pseudostate_model; +class terminate_pseudostate_model_impl; -typedef sxe::SX_UNIQUE_PTR terminate_pseudostate_model_uptr; +typedef sxe::SX_UNIQUE_PTR terminate_pseudostate_model_uptr; } diff --git a/yasmine_model/include/terminate_pseudostate_model_impl.hpp b/yasmine_model/include/terminate_pseudostate_model_impl.hpp index 160f3f1..fcb4937 100644 --- a/yasmine_model/include/terminate_pseudostate_model_impl.hpp +++ b/yasmine_model/include/terminate_pseudostate_model_impl.hpp @@ -41,6 +41,7 @@ class terminate_pseudostate_model_impl SX_FINAL: virtual ~terminate_pseudostate_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( terminate_pseudostate_model_impl ) virtual void accept( model_vertex_visitor& _constructor_visitor ) const SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; }; diff --git a/yasmine_model/include/transition_model.hpp b/yasmine_model/include/transition_model.hpp index 4c1bc39..7a5b968 100644 --- a/yasmine_model/include/transition_model.hpp +++ b/yasmine_model/include/transition_model.hpp @@ -45,11 +45,20 @@ class transition_model: public virtual state_machine_element_model SX_NO_COPY( transition_model ) virtual transition_model_kind get_kind() const = 0; + virtual void set_kind( transition_model_kind _kind ) = 0; virtual const std::string& get_behavior() const = 0; + virtual void set_behavior( const std::string& _behavior ) = 0; virtual const std::string& get_guard() const = 0; + virtual void set_guard( const std::string& _guard ) = 0; virtual const sxe::uri& get_source() const = 0; + virtual void set_source( const std::string& _source ) = 0; virtual const sxe::uri& get_target() const = 0; + virtual void set_target( const std::string& _target ) = 0; virtual const event_ids& get_event_ids() const = 0; + virtual void set_event_ids( event_ids& _event_ids ) = 0; + virtual void add_event( const event_id _id ) = 0; + virtual void remove_event( const event_id _id ) = 0; + virtual bool has_trigger( const event_id _id ) const = 0; }; diff --git a/yasmine_model/include/transition_model_impl.hpp b/yasmine_model/include/transition_model_impl.hpp index 68769b1..59f81ad 100644 --- a/yasmine_model/include/transition_model_impl.hpp +++ b/yasmine_model/include/transition_model_impl.hpp @@ -46,29 +46,74 @@ class transition_model_impl: const event_ids& _events ); virtual ~transition_model_impl() SX_NOEXCEPT SX_OVERRIDE; SX_NO_COPY( transition_model_impl ) + + //!\brief Get the kind of the transition. + //!\return Kind of the transition. virtual transition_model_kind get_kind() const SX_OVERRIDE; + //!\brief Set the kind of the transition. + //!\param _kind Kind of the transition. + virtual void set_kind( transition_model_kind _kind ) SX_OVERRIDE; + //!\brief Get the behavior of the transition. //!\return String behavior of the transition. virtual const std::string& get_behavior() const SX_OVERRIDE; + + //!\brief Set the behavior of the transition. + //!\param _behavior Behavior of the transition. + virtual void set_behavior( const std::string& _behavior ) SX_OVERRIDE; + //!\brief Get the guard of the transition. //!\return String guard of the transition. virtual const std::string& get_guard() const SX_OVERRIDE; + + //!\brief Set the guard of the transition. + //!\param _guard Guard of the transition. + virtual void set_guard( const std::string& _guard ) SX_OVERRIDE; + //!\brief Get the URI of the transition's source vertex. virtual const sxe::uri& get_source() const SX_OVERRIDE; + + //!\brief Set the source of the transition. + //!\param _source Source of the transition. + virtual void set_source( const std::string& _source ) SX_OVERRIDE; + //!\brief Set the URI of the transition's source vertex. virtual const sxe::uri& get_target() const SX_OVERRIDE; + + //!\brief Set the target of the transition. + //!\param _target Target of the transition. + virtual void set_target( const std::string& _target ) SX_OVERRIDE; + //!\brief Get the List of IDs of transition's events. - const event_ids& get_event_ids() const SX_OVERRIDE; + virtual const event_ids& get_event_ids() const SX_OVERRIDE; + + //!\brief Set the triggers of the transition. + //!\param _event_ids Triggers of the transition. + virtual void set_event_ids( event_ids& _event_ids ) SX_OVERRIDE; + + //!\brief Adds a triggers for transition. + //!\param _id Triggers of the transition. + virtual void add_event( const event_id _id ) SX_OVERRIDE; + + //!\brief Removes a trigger from the transition. + //!\param _id Triggers to be removed from the transition. + virtual void remove_event( const event_id _id ) SX_OVERRIDE; + + //!\brief Check if transition is fired by the given trigger. + virtual bool has_trigger( const event_id _id ) const SX_OVERRIDE; + + virtual state_machine_element_model* get_child( const sxe::uri& _uri ) SX_OVERRIDE; + virtual void accept_delete_visitor( delete_visitor& _delete_visitor ) SX_OVERRIDE; private: - const sxe::uri source_; - const sxe::uri target_; - const transition_model_kind kind_; - const std::string behavior_; - const std::string guard_; - const event_ids events_; + sxe::uri source_; + sxe::uri target_; + transition_model_kind kind_; + std::string behavior_; + std::string guard_; + event_ids events_; }; diff --git a/yasmine_model/source/choice_model_impl.cpp b/yasmine_model/source/choice_model_impl.cpp index f7db37c..581f5e7 100644 --- a/yasmine_model/source/choice_model_impl.cpp +++ b/yasmine_model/source/choice_model_impl.cpp @@ -11,6 +11,7 @@ #include "choice_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void choice_model_impl::accept( model_vertex_visitor& _constructor_visitor ) con } +void choice_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/composite_state_model_impl.cpp b/yasmine_model/source/composite_state_model_impl.cpp index 6a1042e..d6c83a6 100644 --- a/yasmine_model/source/composite_state_model_impl.cpp +++ b/yasmine_model/source/composite_state_model_impl.cpp @@ -10,11 +10,16 @@ #include "composite_state_model_impl.hpp" -#include "pseudostate_model.hpp" +#include + +#include "essentials/base.hpp" + +#include "pseudostate_model_impl.hpp" #include "model_vertex_visitor.hpp" #include "model_element_type.hpp" #include "region_model.hpp" -#include "essentials/base.hpp" +#include "model_exception.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -95,6 +100,22 @@ const raw_const_region_models composite_state_model_impl::get_regions() const } +const size_t composite_state_model_impl::get_regions_count() const +{ + return( regions_.size() ); +} + + +region_model& composite_state_model_impl::get_region( const size_t _index ) +{ + if( _index >= regions_.size() ) + { + throw exception( "Index out of range!" ); + } + return( *regions_.at( _index ) ); +} + + void composite_state_model_impl::add_region( region_model_uptr _region ) { _region->set_parent( this ); @@ -102,6 +123,16 @@ void composite_state_model_impl::add_region( region_model_uptr _region ) } +void composite_state_model_impl::remove_region( const size_t _index ) +{ + if( _index >= regions_.size() ) + { + throw exception( "Index out of range!" ); + } + regions_.erase( std::remove( regions_.begin(), regions_.end(), regions_.at( _index ) ) ); +} + + raw_const_pseduostate_models composite_state_model_impl::get_state_pseudostates() const { raw_const_pseduostate_models pseudostates; @@ -113,6 +144,22 @@ raw_const_pseduostate_models composite_state_model_impl::get_state_pseudostates( } +const size_t composite_state_model_impl::get_state_pseudostates_count() const +{ + return( state_pseudostates_.size() ); +} + + +pseudostate_model& composite_state_model_impl::get_state_pseudostate( const size_t _index ) +{ + if( _index >= state_pseudostates_.size() ) + { + throw exception( "Index out of range!" ); + } + return( *state_pseudostates_.at( _index ) ); +} + + void composite_state_model_impl::add_state_pseudostate( pseudostate_model_uptr _pseudostate ) { _pseudostate->set_parent( this ); @@ -120,12 +167,101 @@ void composite_state_model_impl::add_state_pseudostate( pseudostate_model_uptr _ } +void composite_state_model_impl::remove_state_pseudostate( const size_t _index ) +{ + if( _index >= state_pseudostates_.size() ) + { + throw exception( "Index out of range!" ); + } + state_pseudostates_.erase( std::remove( state_pseudostates_.begin(), state_pseudostates_.end(), state_pseudostates_.at( _index ) ) ); +} + + +state_machine_element_model* composite_state_model_impl::get_child( const sxe::uri& _uri ) +{ + state_machine_element_model* found_child = SX_NULLPTR; + sxe::uri local_uri = _uri; + if( get_name() == local_uri.get_front() ) + { + if( local_uri.size() == 1 ) + { + found_child = this; + } + else + { + local_uri.pop_front(); + const std::string child_to_find = local_uri.get_front(); + + for( size_t i = 0; i < regions_.size() && !found_child; ++i ) + { + if( regions_.at( i )->get_name() == child_to_find ) + { + if( local_uri.size() == 1 ) + { + found_child = regions_.at( i ).get(); + } + else + { + found_child = regions_.at( i )->get_child( local_uri ); + } + } + } + + if( !found_child ) + { + for( size_t j = 0; j < state_pseudostates_.size() && !found_child; ++j ) + { + if( state_pseudostates_.at( j )->get_name() == child_to_find ) + { + if( local_uri.size() == 1 ) + { + found_child = state_pseudostates_.at( j ).get(); + } + else + { + throw sxy::model::exception( "A state pseudostate cannot have children!" ); + } + } + } + } + + if( !found_child ) + { + throw sxy::model::exception( "Composite state '%' has no child with name '%'!", get_name(), child_to_find ); + } + } + } + return( found_child ); +} + + +void composite_state_model_impl::get_event_references( std::vector& _elements, + const event_sptr _event ) +{ + state_model_impl::get_event_references( _elements, _event ); + for( size_t i = 0; i < get_regions_count(); ++i ) + { + region_model& region = get_region( i ); + for( size_t j = 0; j < region.get_states_count(); ++j ) + { + region.get_state( j ).get_event_references( _elements, _event ); + } + } +} + + void composite_state_model_impl::accept( model_vertex_visitor& _constructor_visitor ) const { _constructor_visitor.visit( *this ); } +void composite_state_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/consts.cpp b/yasmine_model/source/consts.cpp index 9409d3a..0beed90 100644 --- a/yasmine_model/source/consts.cpp +++ b/yasmine_model/source/consts.cpp @@ -46,6 +46,7 @@ const char* const JSON_EVENT_PRIORITY = "priority"; const char* const JSON_VERSION = "version"; const char* const JSON_CURRENT_VERSION_VALUE = "2.0"; const char* const JSON_VERSION_1 = "1.0"; +const char* const JSON_EXTERNALS = "externals"; const std::string TYPE_TRANSITION = "transition"; diff --git a/yasmine_model/source/deep_history_model_impl.cpp b/yasmine_model/source/deep_history_model_impl.cpp index 5a38334..ac5903f 100644 --- a/yasmine_model/source/deep_history_model_impl.cpp +++ b/yasmine_model/source/deep_history_model_impl.cpp @@ -11,6 +11,7 @@ #include "deep_history_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void deep_history_model_impl::accept( model_vertex_visitor& _constructor_visitor } +void deep_history_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/delete_visitor.cpp b/yasmine_model/source/delete_visitor.cpp new file mode 100644 index 0000000..6f655d2 --- /dev/null +++ b/yasmine_model/source/delete_visitor.cpp @@ -0,0 +1,219 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////// +//// // +//// This file is part of the Seadex yasmine ecosystem (http://yasmine.seadex.de). // +//// Copyright (C) 2016-2017 Seadex GmbH // +//// // +//// Licensing information is available in the folder "license" which is part of this distribution. // +//// The same information is available on the www @ http://yasmine.seadex.de/Licenses.html. // +//// // +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "delete_visitor.hpp" + +#include + +#include "state_machine_model.hpp" +#include "simple_state_model_impl.hpp" +#include "composite_state_model_impl.hpp" +#include "final_state_model_impl.hpp" +#include "initial_pseudostate_model_impl.hpp" +#include "terminate_pseudostate_model_impl.hpp" +#include "join_model_impl.hpp" +#include "fork_model_impl.hpp" +#include "choice_model_impl.hpp" +#include "junction_model_impl.hpp" +#include "entry_point_model_impl.hpp" +#include "exit_point_model_impl.hpp" +#include "shallow_history_model_impl.hpp" +#include "deep_history_model_impl.hpp" +#include "transition_model.hpp" +#include "region_model_impl.hpp" +#include "model_exception.hpp" + + +namespace sxy +{ + + +namespace model +{ + + +delete_visitor::delete_visitor() +{ + // nothing to do... +} + + +delete_visitor::~delete_visitor() SX_NOEXCEPT +{ + // nothing to do... +} + + + +void delete_visitor::visit( simple_state_model& _simple_state ) +{ + delete_state( &_simple_state ); +} + + +void delete_visitor::visit( composite_state_model& _composite_state ) +{ + delete_state( &_composite_state ); +} + + +void delete_visitor::visit( final_state_model& _final_state ) +{ + delete_state( &_final_state ); +} + + +void delete_visitor::visit( initial_pseudostate_model_impl& _initial_pseudostate ) +{ + delete_pseudostate( &_initial_pseudostate ); +} + + +void delete_visitor::visit( terminate_pseudostate_model_impl& _terminate_pseudostate ) +{ + delete_pseudostate( &_terminate_pseudostate ); +} + + +void delete_visitor::visit( join_model_impl& _join ) +{ + delete_pseudostate( &_join ); +} + + +void delete_visitor::visit( fork_model_impl& _fork ) +{ + delete_pseudostate( &_fork ); +} + + +void delete_visitor::visit( choice_model_impl& _choice ) +{ + delete_pseudostate( &_choice ); +} + + +void delete_visitor::visit( junction_model_impl& _junction ) +{ + delete_pseudostate( &_junction ); +} + + +void delete_visitor::visit( entry_point_model_impl& _entry_point ) +{ + delete_state_pseudostate( &_entry_point ); +} + + +void delete_visitor::visit( exit_point_model_impl& _exit_point ) +{ + delete_state_pseudostate( &_exit_point ); +} + + +void delete_visitor::visit( shallow_history_model_impl& _shallow_history ) +{ + delete_state_pseudostate( &_shallow_history ); +} + + +void delete_visitor::visit( deep_history_model_impl& _deep_history ) +{ + delete_state_pseudostate( &_deep_history ); +} + + +void delete_visitor::visit( transition_model& _transition ) +{ + state_machine_element_model* parent_of_transition = _transition.get_parent(); + if( parent_of_transition ) + { + sxy::model::state_machine_model* state_machine = + dynamic_cast< sxy::model::state_machine_model* >( parent_of_transition ); + if( state_machine ) + { + const raw_const_transition_models transitions = state_machine->get_transitions(); + const size_t idx = std::find( transitions.begin(), transitions.end(), &_transition ) - transitions.begin(); + state_machine->remove_transition( idx ); + } + } +} + + +void delete_visitor::visit( region_model& _region ) +{ + state_machine_element_model* parent_element = _region.get_parent(); + if( parent_element ) + { + sxy::model::composite_state_model* parent_state = + dynamic_cast< sxy::model::composite_state_model* >( parent_element ); + if( parent_state ) + { + const raw_const_region_models regions = parent_state->get_regions(); + const size_t idx = std::find( regions.begin(), regions.end(), &_region ) - regions.begin(); + parent_state->remove_region( idx ); + } + } +} + + +void delete_visitor::delete_state( state_model* _state ) +{ + state_machine_element_model* parent_element = _state->get_parent(); + if( parent_element ) + { + region_model* parent_region = dynamic_cast< region_model* >( parent_element ); + if( parent_region ) + { + const row_const_state_models states = parent_region->get_states(); + const size_t idx = std::find( states.begin(), states.end(), _state ) - states.begin(); + parent_region->remove_state( idx ); + } + } +} + + +void delete_visitor::delete_pseudostate( pseudostate_model_impl* _pseudostate ) +{ + state_machine_element_model* parent_element = _pseudostate->get_parent(); + if( parent_element ) + { + sxy::model::region_model* parent_region = dynamic_cast< sxy::model::region_model* >( parent_element ); + if( parent_region ) + { + const raw_const_pseduostate_models pseudostates = parent_region->get_pseudostates(); + const size_t idx = std::find( pseudostates.begin(), pseudostates.end(), _pseudostate ) - pseudostates.begin(); + parent_region->remove_pseudostate( idx ); + } + } +} + + +void delete_visitor::delete_state_pseudostate( pseudostate_model_impl* _state_pseudostate ) +{ + state_machine_element_model* parent_element = _state_pseudostate->get_parent(); + if( parent_element ) + { + sxy::model::composite_state_model* parent_state = + dynamic_cast< sxy::model::composite_state_model* >( parent_element ); + if( parent_state ) + { + const raw_const_pseduostate_models state_pseudostates = parent_state->get_state_pseudostates(); + const size_t idx = std::find( state_pseudostates.begin(), state_pseudostates.end(), _state_pseudostate ) - state_pseudostates.begin(); + parent_state->remove_state_pseudostate( idx ); + } + } +} + + +} + + +} diff --git a/yasmine_model/source/entry_point_model_impl.cpp b/yasmine_model/source/entry_point_model_impl.cpp index 1d41a22..13afd6f 100644 --- a/yasmine_model/source/entry_point_model_impl.cpp +++ b/yasmine_model/source/entry_point_model_impl.cpp @@ -11,6 +11,7 @@ #include "entry_point_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void entry_point_model_impl::accept( model_vertex_visitor& _constructor_visitor } +void entry_point_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/event_model.cpp b/yasmine_model/source/event_model.cpp index 4aa5a26..3f00bbc 100644 --- a/yasmine_model/source/event_model.cpp +++ b/yasmine_model/source/event_model.cpp @@ -19,28 +19,56 @@ namespace model { - event_model::event_model() - : name(), - id(), - priority() - { - // Nothing to do... - } - - - event_model::event_model( const std::string _name, const event_id _id, const event_priority _priority ) - : name( _name ), - id( _id ), - priority( _priority ) - { - // Nothing to do... - } - - - event_model::~event_model() SX_NOEXCEPT - { - // Nothing to do... - } + +event_model::event_model( const std::string _name, const event_id _id, const event_priority _priority ) + : name_( _name ), + id_( _id ), + priority_( _priority ) +{ + // Nothing to do... +} + + +event_model::~event_model() SX_NOEXCEPT +{ + // Nothing to do... +} + + +const std::string& event_model::get_name() const +{ + return( name_ ); +} + + +void event_model::set_name( const std::string& _name ) +{ + name_ = _name; +} + + +const event_id event_model::get_id() const +{ + return( id_ ); +} + + +void event_model::set_id( const event_id _id ) +{ + id_ = _id; +} + + +const event_priority event_model::get_priority() const +{ + return( priority_ ); +} + + +void event_model::set_priority( const event_priority _priority ) +{ + priority_ = _priority; +} } diff --git a/yasmine_model/source/event_model_id.cpp b/yasmine_model/source/event_model_id.cpp index c5d9bd9..f5997b0 100644 --- a/yasmine_model/source/event_model_id.cpp +++ b/yasmine_model/source/event_model_id.cpp @@ -8,10 +8,6 @@ // // ////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifdef SX_CPP03_BOOST - - #include "event_model_id.hpp" namespace sxy @@ -27,25 +23,3 @@ namespace model } - -#else - - -#include "event_model_id.hpp" - -namespace sxy -{ - - - namespace model - { - - const event_id Y_MODEL_COMPLETION_EVENT_ID = std::numeric_limits::max(); - - } - - -} - - -#endif diff --git a/yasmine_model/source/exit_point_model_impl.cpp b/yasmine_model/source/exit_point_model_impl.cpp index a377ffb..8568cfc 100644 --- a/yasmine_model/source/exit_point_model_impl.cpp +++ b/yasmine_model/source/exit_point_model_impl.cpp @@ -11,6 +11,7 @@ #include "exit_point_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void exit_point_model_impl::accept( model_vertex_visitor& _constructor_visitor ) } +void exit_point_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/final_state_model_impl.cpp b/yasmine_model/source/final_state_model_impl.cpp index b3d87f6..90882e5 100644 --- a/yasmine_model/source/final_state_model_impl.cpp +++ b/yasmine_model/source/final_state_model_impl.cpp @@ -14,6 +14,7 @@ #include "model_vertex_visitor.hpp" #include "model_element_type.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -86,6 +87,11 @@ void final_state_model_impl::accept( model_vertex_visitor& _constructor_visitor } +void final_state_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + } diff --git a/yasmine_model/source/fork_model_impl.cpp b/yasmine_model/source/fork_model_impl.cpp index 89bcea5..57979b9 100644 --- a/yasmine_model/source/fork_model_impl.cpp +++ b/yasmine_model/source/fork_model_impl.cpp @@ -11,6 +11,7 @@ #include "fork_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void fork_model_impl::accept( model_vertex_visitor& _constructor_visitor ) const } +void fork_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/initial_pseudostate_model_impl.cpp b/yasmine_model/source/initial_pseudostate_model_impl.cpp index 9a08602..0a49a5e 100644 --- a/yasmine_model/source/initial_pseudostate_model_impl.cpp +++ b/yasmine_model/source/initial_pseudostate_model_impl.cpp @@ -11,6 +11,7 @@ #include "initial_pseudostate_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void initial_pseudostate_model_impl::accept( model_vertex_visitor& _constructor_ } +void initial_pseudostate_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/join_model_impl.cpp b/yasmine_model/source/join_model_impl.cpp index 1341114..c9efbeb 100644 --- a/yasmine_model/source/join_model_impl.cpp +++ b/yasmine_model/source/join_model_impl.cpp @@ -11,6 +11,7 @@ #include "join_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void join_model_impl::accept( model_vertex_visitor& _constructor_visitor ) const } +void join_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/json_reader.cpp b/yasmine_model/source/json_reader.cpp index c447f64..7520093 100644 --- a/yasmine_model/source/json_reader.cpp +++ b/yasmine_model/source/json_reader.cpp @@ -26,16 +26,16 @@ #include "state_machine_model.hpp" #include "region_model_impl.hpp" #include "pseudostate_model_impl.hpp" -#include "entry_point_model_impl.hpp" -#include "exit_point_model_impl.hpp" -#include "deep_history_model_impl.hpp" -#include "shallow_history_model_impl.hpp" #include "initial_pseudostate_model_impl.hpp" +#include "terminate_pseudostate_model_impl.hpp" #include "join_model_impl.hpp" -#include "junction_model_impl.hpp" #include "fork_model_impl.hpp" -#include "terminate_pseudostate_model_impl.hpp" #include "choice_model_impl.hpp" +#include "junction_model_impl.hpp" +#include "entry_point_model_impl.hpp" +#include "exit_point_model_impl.hpp" +#include "deep_history_model_impl.hpp" +#include "shallow_history_model_impl.hpp" #include "transition_model_impl.hpp" #include "model_exception.hpp" @@ -46,11 +46,12 @@ namespace sxy json_reader::json_reader( const std::string& _file ) : document_(), - model_() + model_() { read_json_file( _file ); check_document(); model_ = read_into_model(); + read_externals(); } @@ -66,9 +67,38 @@ model::state_machine_model_ptr json_reader::get_model_ptr() } -void json_reader::read_json_file( const std::string& _file ) +const model::external_vertices& json_reader::get_external_vertices() { + return( model_->get_externals() ); +} + + +void json_reader::read_externals() +{ + try{ + std::vector externals_list = + extract_members_from_array( get_object_member_array( document_, model::JSON_EXTERNALS ) ); + + SX_FOR( const rapidjson::Value* json_external, externals_list ) + { + sxy::model::model_element_type vertex_type = + model::model_element_type_from_string( get_object_member_string( sxe::ref( *json_external ), model::JSON_TYPE_NODE ) ); + const std::string name = get_object_member_string( sxe::ref( *json_external ), model::JSON_NAME_NODE ); + model_->add_external_vertex( SX_MAKE_UNIQUE( name, vertex_type ) ); + } + } + catch( const sxy::model::exception& _e ) + { + if( std::strcmp( _e.what(), "Member externals was not found!" ) != 0 ) + { + throw; + } + } +} + +void json_reader::read_json_file( const std::string& _file ) +{ #ifndef SX_CPP03_BOOST std::ifstream infile( _file, std::ios::in ); #else @@ -126,6 +156,22 @@ sxy::model::event_ids json_reader::read_deferred_events( const rapidjson::Value& } +sxy::model::event_ids json_reader::read_error_events( const rapidjson::Value& _state ) const +{ + std::vector error_event_list = + extract_members_from_array( get_object_member_array( _state, model::JSON_ERROR_EVENT ) ); + + sxy::model::event_ids error_events; + SX_FOR( const rapidjson::Value* const an_event, error_event_list ) + { + const std::string event_name = get_object_member_string( sxe::ref( *an_event ), model::JSON_EVENT_NAME ); + sxy::model::event_id event_id = get_event_id_by_name( event_name ); + error_events.push_back( event_id ); + } + return( error_events ); +} + + model::composite_state_model_uptr json_reader::read_composite_state( const rapidjson::Value& _root ) { std::string name = get_object_member_string( sxe::ref(_root), model::JSON_NAME_NODE ); @@ -177,7 +223,21 @@ model::simple_state_model_uptr json_reader::read_simple_state( const rapidjson:: } catch ( ... ) { - // Nothing to do... + // try to read error event as a list of error event objects + try + { + sxy::model::event_ids error_events = read_error_events( _state ); + if( !error_events.empty() ) + { + const std::string event_name = get_event_name( error_events.at( 0 ) ); + error_event = SX_MAKE_SHARED( event_name, error_events.at( 0 ), + get_event_priority_by_name( event_name ) ); + } + } + catch( ... ) + { + // Nothing to do... + } } sxe::SX_UNIQUE_PTR< model::simple_state_model_impl > simple_state = SX_MAKE_UNIQUE< model::simple_state_model_impl >( name, enter_behavior, @@ -197,21 +257,21 @@ model::final_state_model_uptr json_reader::read_final_state( const rapidjson::Va model::region_model_impl_uptr json_reader::read_region( const rapidjson::Value& _region ) { - const std::string name = get_object_member_string( sxe::ref( _region), model::JSON_NAME_NODE ); + const std::string name = get_object_member_string( sxe::ref( _region ), model::JSON_NAME_NODE ); sxe::SX_UNIQUE_PTR< model::region_model_impl > region = SX_MAKE_UNIQUE< model::region_model_impl >( name ); - std::vector vertices = + std::vector vertices = extract_members_from_array( get_object_member_array( _region, model::JSON_VERTICES_NODE ) ); SX_FOR( const rapidjson::Value* vertice, vertices ) { - sxy::model::model_element_type vertice_type = model::model_element_type_from_string( get_object_member_string( sxe::ref( *vertice ), + sxy::model::model_element_type vertex_type = model::model_element_type_from_string( get_object_member_string( sxe::ref( *vertice ), model::JSON_TYPE_NODE ) ); - if( vertice_type == sxy::model::model_element_type::TYE_SIMPLE_STATE || - vertice_type == sxy::model::model_element_type::TYE_ASYNC_SIMPLE_STATE || - vertice_type == sxy::model::model_element_type::TYE_COMPOSITE_STATE || - vertice_type == sxy::model::model_element_type::TYE_FINAL_STATE ) + if( vertex_type == sxy::model::model_element_type::TYE_SIMPLE_STATE || + vertex_type == sxy::model::model_element_type::TYE_ASYNC_SIMPLE_STATE || + vertex_type == sxy::model::model_element_type::TYE_COMPOSITE_STATE || + vertex_type == sxy::model::model_element_type::TYE_FINAL_STATE ) { sxy::model::state_model_uptr state = read_state( *vertice ); region->add_state( sxe::move( state ) ); @@ -223,6 +283,37 @@ model::region_model_impl_uptr json_reader::read_region( const rapidjson::Value& } } + // backward compatibility -> in the region there is one list : 'vertices'. Before there were two: 'states' and 'pseudostates'. + try{ + std::vector pseudostates_vertices = + extract_members_from_array( get_object_member_array( _region, model::JSON_PSEUDOSTATES_NODE ) ); + SX_FOR( const rapidjson::Value* pseudostate_vertex, pseudostates_vertices ) + { + sxy::model::model_element_type vertex_type = model::model_element_type_from_string( get_object_member_string( sxe::ref( *pseudostate_vertex ), + model::JSON_TYPE_NODE ) ); + + if( vertex_type == sxy::model::model_element_type::TYE_SIMPLE_STATE || + vertex_type == sxy::model::model_element_type::TYE_ASYNC_SIMPLE_STATE || + vertex_type == sxy::model::model_element_type::TYE_COMPOSITE_STATE || + vertex_type == sxy::model::model_element_type::TYE_FINAL_STATE ) + { + // Nothing to do... + } + else + { + sxy::model::pseudostate_model_uptr pseudostate = read_pseudostate( *pseudostate_vertex ); + region->add_pseudostate( sxe::move( pseudostate ) ); + } + } + } + catch( const model::exception& _e ) + { + if( ::std::strcmp( _e.what(), "Member pseudostates was not found!" ) != 0 ) + { + throw; + } + } + return( region ); } @@ -515,6 +606,26 @@ sxe::int32_t json_reader::get_event_id_by_name( const std::string& _name ) const } +std::string json_reader::get_event_name( const sxe::int32_t _event_id ) const +{ + std::string event_name = ""; + std::vector event_list = + extract_members_from_array( get_object_member_array( document_, model::JSON_EVENT_LIST_NODE ) ); + + SX_FOR( const rapidjson::Value* const an_event, event_list ) + { + // FixME: safe cast + sxe::int32_t event_id = static_cast< sxe::int32_t >( get_object_member_int( sxe::ref( *an_event ), model::JSON_EVENT_ID ) ); + if( event_id == _event_id ) + { + event_name = get_object_member_string( sxe::ref( *an_event ), model::JSON_EVENT_NAME ); + break; + } + } + return( event_name ); +} + + sxe::int8_t json_reader::get_event_priority_by_name( const std::string& _name ) const { #ifdef SX_CPP03_BOOST diff --git a/yasmine_model/source/json_writer.cpp b/yasmine_model/source/json_writer.cpp index 865b808..3adaa03 100644 --- a/yasmine_model/source/json_writer.cpp +++ b/yasmine_model/source/json_writer.cpp @@ -12,8 +12,6 @@ #include -#include - #include "essentials/exception.hpp" #include "essentials/base.hpp" @@ -62,10 +60,13 @@ void json_writer::write_json_to_file( const std::string& _json_file, const model rapidjson::Value root( rapidjson::kObjectType ); sxy::model::composite_state_model_impl& root_state = _state_machine_model.get_root_state(); - fill_composite_state_object( root_state, root, doc.GetAllocator() ); + fill_composite_state_object( root_state, root, doc.GetAllocator(), _state_machine_model ); json_state_machine.AddMember( rapidjson::StringRef( model::JSON_ROOT_NODE ), root, doc.GetAllocator() ); doc.AddMember( rapidjson::StringRef( model::JSON_STATE_MACHINE_NODE ), json_state_machine, doc.GetAllocator() ); + + add_externals( _state_machine_model, doc, doc.GetAllocator() ); + rapidjson::StringBuffer string_buffer; rapidjson::PrettyWriter< rapidjson::StringBuffer > writer( string_buffer ); doc.Accept( writer ); @@ -104,11 +105,11 @@ void json_writer::add_version( rapidjson::Value& _document, rapidjson::MemoryPoo void json_writer::add_events_from_model( const model::state_machine_model& _state_machine_model, rapidjson::Value& _events, rapidjson::MemoryPoolAllocator< >& _allocator ) { - SX_FOR( const sxy::model::event_model& an_event, _state_machine_model.get_events() ) + SX_FOR( model::event_sptr an_event, _state_machine_model.get_events() ) { - const std::string name = an_event.name; - sxy::model::event_id id = an_event.id; - sxy::model::event_priority priority = an_event.priority; + const std::string name = an_event->get_name(); + sxy::model::event_id id = an_event->get_id(); + sxy::model::event_priority priority = an_event->get_priority(); rapidjson::Value json_event( rapidjson::kObjectType ); rapidjson::Value name_val; @@ -168,12 +169,13 @@ void json_writer::add_transitions_from_model( const model::state_machine_model& void json_writer::add_regions_from_model( const model::composite_state_model& _composite_state_model, - rapidjson::Value& _regions, rapidjson::MemoryPoolAllocator< >& _allocator ) + rapidjson::Value& _regions, rapidjson::MemoryPoolAllocator< >& _allocator, + const model::state_machine_model& _state_machine_model ) { SX_FOR( const sxy::model::region_model* const region, _composite_state_model.get_regions() ) { rapidjson::Value json_region( rapidjson::kObjectType ); - fill_region_object( *region, json_region, _allocator ); + fill_region_object( *region, json_region, _allocator, _state_machine_model ); if( json_region.IsObject() ) { _regions.PushBack( json_region.Move(), _allocator ); @@ -183,12 +185,12 @@ void json_writer::add_regions_from_model( const model::composite_state_model& _c void json_writer::fill_region_object( const model::region_model& _region_model, rapidjson::Value& _region, - rapidjson::MemoryPoolAllocator< >& _allocator ) + rapidjson::MemoryPoolAllocator< >& _allocator, const model::state_machine_model& _state_machine_model ) { rapidjson::Value name_node; _region.AddMember( rapidjson::StringRef( model::JSON_NAME_NODE ), create_rapidjson_string_value( _region_model.get_name(), name_node ).Move(), _allocator ); - rapidjson::Value json_states( rapidjson::kArrayType ); + rapidjson::Value json_vertices( rapidjson::kArrayType ); SX_FOR( const sxy::model::state_model* const one_state_model, _region_model.get_states() ) { @@ -201,13 +203,14 @@ void json_writer::fill_region_object( const model::region_model& _region_model, #endif { case model::model_element_type::TYE_SIMPLE_STATE: + case model::model_element_type::TYE_ASYNC_SIMPLE_STATE: { const model::simple_state_model_impl* simple_state_model = dynamic_cast< const model::simple_state_model_impl* >( one_state_model ); SX_ASSERT( simple_state_model, "Simple state cannot be written to json file!" ); rapidjson::Value json_state( rapidjson::kObjectType ); - fill_simple_state_object( *simple_state_model, json_state, _allocator ); - json_states.PushBack( json_state, _allocator ); + fill_simple_state_object( *simple_state_model, json_state, _allocator, _state_machine_model ); + json_vertices.PushBack( json_state, _allocator ); break; } @@ -217,8 +220,8 @@ void json_writer::fill_region_object( const model::region_model& _region_model, dynamic_cast< const model::composite_state_model_impl* >( one_state_model ); SX_ASSERT( composite_state_state_model, "Composite state cannot be written to json file!" ); rapidjson::Value json_state( rapidjson::kObjectType ); - fill_composite_state_object( *composite_state_state_model, json_state, _allocator ); - json_states.PushBack( json_state, _allocator ); + fill_composite_state_object( *composite_state_state_model, json_state, _allocator, _state_machine_model ); + json_vertices.PushBack( json_state, _allocator ); break; } @@ -229,7 +232,7 @@ void json_writer::fill_region_object( const model::region_model& _region_model, SX_ASSERT( final_state_model, "Final state cannot be written to json file!" ); rapidjson::Value json_state( rapidjson::kObjectType ); fill_final_state_object( *final_state_model, json_state, _allocator ); - json_states.PushBack( json_state, _allocator ); + json_vertices.PushBack( json_state, _allocator ); break; } @@ -238,17 +241,15 @@ void json_writer::fill_region_object( const model::region_model& _region_model, } } - _region.AddMember( rapidjson::StringRef( model::JSON_VERTICES_NODE ), json_states, _allocator ); - rapidjson::Value json_pseudostates( rapidjson::kArrayType ); - SX_FOR( const sxy::model::pseudostate_model* const pseudostate, _region_model.get_pseudostates() ) { rapidjson::Value json_pseudostate( rapidjson::kObjectType ); fill_pseudostate_object( *pseudostate, json_pseudostate, _allocator ); - json_pseudostates.PushBack( json_pseudostate, _allocator ); + json_vertices.PushBack( json_pseudostate, _allocator ); } - _region.AddMember( rapidjson::StringRef( model::JSON_PSEUDOSTATES_NODE ), json_pseudostates, _allocator ); + _region.AddMember( rapidjson::StringRef( model::JSON_VERTICES_NODE ), json_vertices, _allocator ); + rapidjson::Value json_pseudostates( rapidjson::kArrayType ); } @@ -260,7 +261,8 @@ void json_writer::fill_pseudostate_object( const model::pseudostate_model& _pseu void json_writer::fill_simple_state_object( const model::simple_state_model& _simple_state_model, - rapidjson::Value& _simple_state, rapidjson::MemoryPoolAllocator< >& _allocator ) + rapidjson::Value& _simple_state, rapidjson::MemoryPoolAllocator< >& _allocator, + const model::state_machine_model& _state_machine_model ) { if( _simple_state_model.is_async() ) { @@ -286,18 +288,39 @@ void json_writer::fill_simple_state_object( const model::simple_state_model& _si _simple_state.AddMember( rapidjson::StringRef( model::JSON_EXIT_BEHAVIOR_NODE ), create_rapidjson_string_value( _simple_state_model.get_exit_behavior(), transition_exit_behavior ).Move(), _allocator ); rapidjson::Value deferred_events( rapidjson::kArrayType ); + SX_FOR( const sxy::model::event_id event_ID, _simple_state_model.get_deferred_events() ) + { + rapidjson::Value json_deferred_event( rapidjson::kObjectType ); + rapidjson::Value json_event_name; + const size_t deferred_event_index = get_event_index_by_id( event_ID, _state_machine_model ); + json_deferred_event.AddMember( rapidjson::StringRef( model::JSON_NAME_NODE ), + create_rapidjson_string_value( _state_machine_model.get_event( deferred_event_index ).get_name(), json_event_name ).Move(), _allocator ); + deferred_events.PushBack( json_deferred_event.Move(), _allocator ); + } _simple_state.AddMember( rapidjson::StringRef( model::JSON_DEFERRED_EVENTS ), deferred_events, _allocator ); + + rapidjson::Value error_events( rapidjson::kArrayType ); + if( _simple_state_model.has_error_event() ) + { + rapidjson::Value json_error_event( rapidjson::kObjectType ); + rapidjson::Value json_event_name; + json_error_event.AddMember( rapidjson::StringRef( model::JSON_NAME_NODE ), + create_rapidjson_string_value( _simple_state_model.get_error_event()->get_name(), json_event_name ).Move(), _allocator ); + error_events.PushBack( json_error_event.Move(), _allocator ); + } + _simple_state.AddMember( rapidjson::StringRef( model::JSON_ERROR_EVENT ), error_events, _allocator ); } void json_writer::fill_composite_state_object( const model::composite_state_model& _composite_state_model, - rapidjson::Value& _composite_state, rapidjson::MemoryPoolAllocator< >& _allocator ) + rapidjson::Value& _composite_state, rapidjson::MemoryPoolAllocator< >& _allocator, + const model::state_machine_model& _state_machine_model ) { fill_base_info( _composite_state, _composite_state_model, _allocator ); // regions rapidjson::Value json_regions( rapidjson::kArrayType ); - add_regions_from_model( _composite_state_model, json_regions, _allocator ); + add_regions_from_model( _composite_state_model, json_regions, _allocator, _state_machine_model ); _composite_state.AddMember( rapidjson::StringRef( model::JSON_REGIONS_NODE ), json_regions, _allocator ); // state_pseudostates @@ -312,6 +335,18 @@ void json_writer::fill_composite_state_object( const model::composite_state_mode rapidjson::Value transition_exit_behavior; _composite_state.AddMember( rapidjson::StringRef( model::JSON_EXIT_BEHAVIOR_NODE ), create_rapidjson_string_value( _composite_state_model.get_exit_behavior(), transition_exit_behavior ).Move(), _allocator ); + + rapidjson::Value deferred_events( rapidjson::kArrayType ); + SX_FOR( const sxy::model::event_id event_ID, _composite_state_model.get_deferred_events() ) + { + rapidjson::Value json_deferred_event( rapidjson::kObjectType ); + rapidjson::Value json_event_name; + const size_t deferred_event_index = get_event_index_by_id( event_ID, _state_machine_model ); + json_deferred_event.AddMember( rapidjson::StringRef( model::JSON_NAME_NODE ), + create_rapidjson_string_value( _state_machine_model.get_event( deferred_event_index ).get_name(), json_event_name ).Move(), _allocator ); + deferred_events.PushBack( json_deferred_event.Move(), _allocator ); + } + _composite_state.AddMember( rapidjson::StringRef( model::JSON_DEFERRED_EVENTS ), deferred_events, _allocator ); } @@ -359,11 +394,11 @@ const std::string json_writer::get_event_name_by_id( const sxy::model::event_id& const model::state_machine_model& _state_machine_model ) { std::string event_name = ""; - SX_FOR( const sxy::model::event_model& an_event , _state_machine_model.get_events() ) + SX_FOR( model::event_sptr an_event, _state_machine_model.get_events() ) { - if( _event_id == an_event.id ) + if( _event_id == an_event->get_id() ) { - event_name = an_event.name; + event_name = an_event->get_name(); break; } } @@ -372,4 +407,46 @@ const std::string json_writer::get_event_name_by_id( const sxy::model::event_id& } +const size_t json_writer::get_event_index_by_id( const sxy::model::event_id& _event_id, + const model::state_machine_model& _state_machine_model ) +{ + size_t index = _state_machine_model.get_transitions().size(); + for( size_t i = 0; i < _state_machine_model.get_transitions().size(); ++i ) + { + if( _state_machine_model.get_events().at( i )->get_id() == _event_id ) + { + index = i; + break; + } + } + return( index ); +} + + +void json_writer::add_externals( const model::state_machine_model& _state_machine_model, rapidjson::Value& _document, + rapidjson::MemoryPoolAllocator< >& _allocator ) +{ + rapidjson::Value json_externals( rapidjson::kArrayType ); + SX_FOR( const model::external_uptr& vertex, _state_machine_model.get_externals() ) + { + rapidjson::Value json_vertex( rapidjson::kObjectType ); + + // name + rapidjson::Value name_node; + json_vertex.AddMember( rapidjson::StringRef( model::JSON_NAME_NODE ), + create_rapidjson_string_value( vertex->get_name(), name_node ).Move(), _allocator ); + + // type + rapidjson::Value type_node; + const std::string node_type = model_element_type_to_string( vertex->get_type() ); + type_node.SetString( node_type.c_str(), node_type.length(), _allocator ); + json_vertex.AddMember( rapidjson::StringRef( model::JSON_TYPE_NODE ), type_node.Move(), _allocator ); + + json_externals.PushBack( json_vertex, _allocator ); + } + + _document.AddMember( rapidjson::StringRef( model::JSON_EXTERNALS ), json_externals, _allocator ); +} + + } diff --git a/yasmine_model/source/junction_model_impl.cpp b/yasmine_model/source/junction_model_impl.cpp index 5038a28..5f06298 100644 --- a/yasmine_model/source/junction_model_impl.cpp +++ b/yasmine_model/source/junction_model_impl.cpp @@ -11,6 +11,7 @@ #include "junction_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void junction_model_impl::accept( model_vertex_visitor& _constructor_visitor ) c } +void junction_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/model_version.cpp b/yasmine_model/source/model_version.cpp index 3533d0a..7f9bfa6 100644 --- a/yasmine_model/source/model_version.cpp +++ b/yasmine_model/source/model_version.cpp @@ -30,8 +30,8 @@ namespace const sxe::uint16_t VERSION_MAJOR( 0 ); -const sxe::uint16_t VERSION_MINOR( 1 ); -const sxe::uint16_t VERSION_PATCH( 5 ); +const sxe::uint16_t VERSION_MINOR( 2 ); +const sxe::uint16_t VERSION_PATCH( 0 ); } diff --git a/yasmine_model/source/pseudostate_model_impl.cpp b/yasmine_model/source/pseudostate_model_impl.cpp index 7f6845f..d86f206 100644 --- a/yasmine_model/source/pseudostate_model_impl.cpp +++ b/yasmine_model/source/pseudostate_model_impl.cpp @@ -10,7 +10,10 @@ #include "pseudostate_model_impl.hpp" +#include "essentials/base.hpp" + #include "transition_model.hpp" +#include "model_exception.hpp" namespace sxy @@ -68,6 +71,13 @@ void pseudostate_model_impl::add_outgoing_transition( transition_models _outgoin } +state_machine_element_model* pseudostate_model_impl::get_child( const sxe::uri& _uri ) +{ + SX_UNUSED_PARAMETER( _uri ); + throw sxy::model::exception( "Pseudostates cannot have children!" ); +} + + } diff --git a/yasmine_model/source/region_model_impl.cpp b/yasmine_model/source/region_model_impl.cpp index e44565a..d8bb544 100644 --- a/yasmine_model/source/region_model_impl.cpp +++ b/yasmine_model/source/region_model_impl.cpp @@ -10,8 +10,12 @@ #include "region_model_impl.hpp" -#include "pseudostate_model.hpp" +#include + +#include "pseudostate_model_impl.hpp" #include "state_model.hpp" +#include "model_exception.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -46,6 +50,22 @@ row_const_state_models region_model_impl::get_states() const } +const size_t region_model_impl::get_states_count() const +{ + return( states_.size() ); +} + + +state_model& region_model_impl::get_state( const size_t _index ) +{ + if( _index >= states_.size() ) + { + throw exception( "Index out of range!" ); + } + return( *states_.at( _index ) ); +} + + void region_model_impl::add_state( state_model_uptr _state ) { _state->set_parent( this ); @@ -53,6 +73,16 @@ void region_model_impl::add_state( state_model_uptr _state ) } +void region_model_impl::remove_state( const size_t _index ) +{ + if( _index >= states_.size() ) + { + throw exception( "Index out of range!" ); + } + states_.erase( std::remove( states_.begin(), states_.end(), states_.at( _index ) ) ); +} + + raw_const_pseduostate_models region_model_impl::get_pseudostates() const { raw_const_pseduostate_models pseudostates; @@ -64,6 +94,22 @@ raw_const_pseduostate_models region_model_impl::get_pseudostates() const } +const size_t region_model_impl::get_pseudostates_count() const +{ + return( pseudostates_.size() ); +} + + +pseudostate_model& region_model_impl::get_pseudostate( const size_t _index ) +{ + if( _index >= pseudostates_.size() ) + { + throw exception( "Index out of range!" ); + } + return( *pseudostates_.at( _index ) ); +} + + void region_model_impl::add_pseudostate( pseudostate_model_uptr _pseudostate ) { _pseudostate->set_parent( this ); @@ -71,6 +117,71 @@ void region_model_impl::add_pseudostate( pseudostate_model_uptr _pseudostate ) } +void region_model_impl::remove_pseudostate( const size_t _index ) +{ + if( _index >= pseudostates_.size() ) + { + throw exception( "Index out of range!" ); + } + pseudostates_.erase( std::remove( pseudostates_.begin(), pseudostates_.end(), pseudostates_.at( _index ) ) ); +} + + +state_machine_element_model* region_model_impl::get_child( const sxe::uri& _uri ) +{ + state_machine_element_model* found_child = SX_NULLPTR; + sxe::uri local_uri = _uri; + local_uri.pop_front(); + const std::string child_to_find = local_uri.get_front(); + + for( size_t i = 0; i < states_.size() && !found_child; ++i ) + { + if( states_.at( i )->get_name() == child_to_find ) + { + if( local_uri.size() == 1 ) + { + found_child = states_.at( i ).get(); + } + else + { + found_child = states_.at( i )->get_child( local_uri ); + } + } + } + + if( !found_child ) + { + for( size_t j = 0; j < pseudostates_.size() && !found_child; ++j ) + { + if( pseudostates_.at( j )->get_name() == child_to_find ) + { + if( local_uri.size() == 1 ) + { + found_child = pseudostates_.at( j ).get(); + } + else + { + throw sxy::model::exception( "A pseudostate cannot have children!" ); + } + } + } + } + + if( !found_child ) + { + throw sxy::model::exception( "Region '%' has no child with name '%'!", get_name(), child_to_find ); + } + + return( found_child ); +} + + +void region_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/shallow_history_model_impl.cpp b/yasmine_model/source/shallow_history_model_impl.cpp index e5d66b9..bba3ac0 100644 --- a/yasmine_model/source/shallow_history_model_impl.cpp +++ b/yasmine_model/source/shallow_history_model_impl.cpp @@ -11,6 +11,7 @@ #include "shallow_history_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void shallow_history_model_impl::accept( model_vertex_visitor& _constructor_visi } +void shallow_history_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/simple_state_model_impl.cpp b/yasmine_model/source/simple_state_model_impl.cpp index 3cfed56..8bc32f0 100644 --- a/yasmine_model/source/simple_state_model_impl.cpp +++ b/yasmine_model/source/simple_state_model_impl.cpp @@ -12,6 +12,7 @@ #include "model_vertex_visitor.hpp" #include "model_element_type.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -25,7 +26,7 @@ namespace model simple_state_model_impl::simple_state_model_impl( const std::string& _name, const std::string& _enter_behavior, const std::string& _do_behavior, const std::string& _exit_behavior, const event_ids& _deferred_events, event_sptr _error_event, bool _is_async) - : state_model_impl( _name, model_element_type::TYE_SIMPLE_STATE, _deferred_events ), + : state_model_impl( _name, _is_async ? model_element_type::TYE_ASYNC_SIMPLE_STATE : model_element_type::TYE_SIMPLE_STATE, _deferred_events ), enter_behavior_( _enter_behavior ), do_behavior_( _do_behavior ), exit_behavior_( _exit_behavior ), @@ -36,7 +37,21 @@ simple_state_model_impl::simple_state_model_impl( const std::string& _name, cons } -simple_state_model_impl::~simple_state_model_impl()SX_NOEXCEPT +simple_state_model_impl::simple_state_model_impl( const std::string& _name, bool _is_async, const std::string& _enter_behavior, + const std::string& _do_behavior, const std::string& _exit_behavior, const event_ids& _deferred_events, + event_sptr _error_event ) + : state_model_impl( _name, _is_async ? model_element_type::TYE_ASYNC_SIMPLE_STATE : model_element_type::TYE_SIMPLE_STATE, _deferred_events ), + enter_behavior_( _enter_behavior ), + do_behavior_( _do_behavior ), + exit_behavior_( _exit_behavior ), + error_event_( _error_event ), + is_async_( _is_async ) +{ + // Nothing to do... +} + + +simple_state_model_impl::~simple_state_model_impl() SX_NOEXCEPT { // Nothing to do... } @@ -91,6 +106,13 @@ void simple_state_model_impl::accept( model_vertex_visitor& _constructor_visitor } +bool simple_state_model_impl::has_error_event() const +{ + const bool state_has_error_event = !!error_event_; + return( state_has_error_event ); +} + + event_sptr simple_state_model_impl::get_error_event() const { return( error_event_ ); @@ -115,6 +137,29 @@ void simple_state_model_impl::set_is_async( bool _is_async ) } +void simple_state_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + +void simple_state_model_impl::get_event_references( std::vector& _elements, + const event_sptr _event ) +{ + if( error_event_ ) + { + if( error_event_->get_id() == _event->get_id() ) + { + _elements.push_back( this ); + } + } + else + { + state_model_impl::get_event_references( _elements, _event ); + } +} + + } diff --git a/yasmine_model/source/state_machine_element_model_impl.cpp b/yasmine_model/source/state_machine_element_model_impl.cpp index 2015b52..3fb9ec8 100644 --- a/yasmine_model/source/state_machine_element_model_impl.cpp +++ b/yasmine_model/source/state_machine_element_model_impl.cpp @@ -56,7 +56,13 @@ const state_machine_element_model* state_machine_element_model_impl::get_parent( } -void state_machine_element_model_impl::set_parent( const state_machine_element_model* _parent ) +state_machine_element_model* state_machine_element_model_impl::get_parent() +{ + return( parent_ ); +} + + +void state_machine_element_model_impl::set_parent( state_machine_element_model* _parent ) { parent_ = _parent; } diff --git a/yasmine_model/source/state_machine_external_element.cpp b/yasmine_model/source/state_machine_external_element.cpp new file mode 100644 index 0000000..dce2c2a --- /dev/null +++ b/yasmine_model/source/state_machine_external_element.cpp @@ -0,0 +1,61 @@ +#include "state_machine_external_element.hpp" + + +namespace sxy +{ + + +namespace model +{ + + +state_machine_external_element::state_machine_external_element( const std::string& _name, const model_element_type& _type ): + name_( _name ), + type_( _type ) +{ + // Nothing to do... +} + + +state_machine_external_element::~state_machine_external_element() SX_NOEXCEPT +{ + // Nothing to do... +} + + +const std::string& state_machine_external_element::get_name() const +{ + return( name_ ); +} + + +const std::string& state_machine_external_element::get_name() +{ + return( name_ ); +} + + +void state_machine_external_element::set_name( const std::string& _name ) +{ + name_ = _name; +} + + +const model_element_type state_machine_external_element::get_type() const +{ + return( type_ ); +} + + +void state_machine_external_element::set_type( const model_element_type& _type ) +{ + type_ = _type; +} + + +} + + +} + + diff --git a/yasmine_model/source/state_machine_model.cpp b/yasmine_model/source/state_machine_model.cpp index 5ba54cd..80d4049 100644 --- a/yasmine_model/source/state_machine_model.cpp +++ b/yasmine_model/source/state_machine_model.cpp @@ -10,7 +10,10 @@ #include "state_machine_model.hpp" +#include + #include "composite_state_model_impl.hpp" +#include "model_exception.hpp" namespace sxy @@ -24,7 +27,8 @@ namespace model state_machine_model::state_machine_model() : transitions_(), root_state_(), - event_list_() + event_list_(), + externals_() { // Nothing to do... } @@ -42,6 +46,16 @@ void state_machine_model::add_transition( transition_model_uptr _transition ) } +void state_machine_model::remove_transition( const size_t _index ) +{ + if( _index >= transitions_.size() ) + { + throw exception( "Index out of range!" ); + } + transitions_.erase( std::remove( transitions_.begin(), transitions_.end(), transitions_.at( _index ) ) ); +} + + raw_const_transition_models state_machine_model::get_transitions() const { raw_const_transition_models transitions; @@ -57,6 +71,16 @@ raw_const_transition_models state_machine_model::get_transitions() const } +transition_model& state_machine_model::get_transition( const size_t _index ) +{ + if( _index >= transitions_.size() ) + { + throw exception( "Index out of range!" ); + } + return( *transitions_.at( _index ) ); +} + + composite_state_model_impl& state_machine_model::get_root_state() const { return( *root_state_ ); @@ -75,10 +99,93 @@ sxy::model::state_machine_model::events state_machine_model::get_events() const } +event_model& state_machine_model::get_event( const size_t _index ) +{ + if( _index >= event_list_.size() ) + { + throw exception( "Index out of range!" ); + } + return( *event_list_.at( _index ) ); +} + + +const event_model& state_machine_model::get_event( const size_t _index ) const +{ + if( _index >= event_list_.size() ) + { + throw exception( "Index out of range!" ); + } + return( *event_list_.at( _index ) ); +} + + +std::string state_machine_model::get_event_name( const sxy::model::event_id& _event_id ) const +{ + std::string event_name = ""; + for( size_t i = 0; i < event_list_.size(); ++i ) + { + if( event_list_.at( i )->get_id() == _event_id ) + { + event_name = event_list_.at( i )->get_name(); + break; + } + } + return( event_name ); +} + + void state_machine_model::add_event( const std::string& _event_name, const event_id& _event_id, const event_priority& _event_priority ) { - event_list_.push_back( event_model( _event_name, _event_id, _event_priority ) ); + event_list_.push_back( SX_MAKE_SHARED( _event_name, _event_id, _event_priority ) ); +} + + +void state_machine_model::remove_event( const size_t _index ) +{ + sxy::model::event_sptr event_to_be_deleted = event_list_.at( _index ); + event_list_.erase( std::remove( event_list_.begin(), event_list_.end(), event_to_be_deleted ), event_list_.end() ); +} + + +std::vector state_machine_model::get_event_references( const event_sptr _event ) +{ + std::vector elements; + for( size_t i = 0; i < transitions_.size(); ++i ) + { + if( transitions_.at( i )->has_trigger( _event->get_id() ) ) + { + elements.push_back( transitions_.at( i ).get() ); + } + } + + root_state_->get_event_references( elements, _event ); + return( elements ); +} + + +const external_vertices& state_machine_model::get_externals() const +{ + return( externals_ ); +} + + +external_vertices& state_machine_model::get_externals() +{ + return( externals_ ); +} + + +void state_machine_model::add_external_vertex( external_uptr _external_vertex ) +{ + externals_.push_back( sxe::move( _external_vertex ) ); +} + + +void state_machine_model::remove_external_vertex( const size_t _index ) +{ + external_uptr& vertex_to_be_deleted = externals_.at( _index ); + externals_.erase( std::remove( externals_.begin(), externals_.end(), vertex_to_be_deleted ) ); } diff --git a/yasmine_model/source/state_model_impl.cpp b/yasmine_model/source/state_model_impl.cpp index ffd922b..7e4f23a 100644 --- a/yasmine_model/source/state_model_impl.cpp +++ b/yasmine_model/source/state_model_impl.cpp @@ -10,6 +10,13 @@ #include "state_model_impl.hpp" +#include + +#include "essentials/base.hpp" + +#include "model_exception.hpp" +#include "region_model.hpp" + namespace sxy { @@ -35,6 +42,12 @@ state_model_impl::~state_model_impl() SX_NOEXCEPT } +const size_t state_model_impl::get_regions_count() const +{ + return( 0 ); +} + + raw_const_transition_models state_model_impl::get_transitions() const { std::vector< const transition_model* > transitions; @@ -52,6 +65,47 @@ const event_ids& state_model_impl::get_deferred_events() const } +void state_model_impl::add_deferred_event( const event_id _deferred_event_id ) +{ + deferred_events_.push_back( _deferred_event_id ); +} + + +void state_model_impl::remove_deferred_event( const event_id _deferred_event_id ) +{ + deferred_events_.erase( std::remove( deferred_events_.begin(), deferred_events_.end(), _deferred_event_id ), deferred_events_.end() ); +} + + +bool state_model_impl::defers_event( const event_id _id ) const +{ + bool state_defers_event = false; + if( std::find( deferred_events_.begin(), deferred_events_.end(), _id ) != deferred_events_.end() ) + { + state_defers_event = true; + } + return( state_defers_event ); +} + + +state_machine_element_model* state_model_impl::get_child( const sxe::uri& _uri ) +{ + SX_UNUSED_PARAMETER( _uri ); + throw sxy::model::exception( "State '%' is of type '%' and cannot have children!", get_name(), + model_element_type_to_string( get_type() ) ); +} + + +void state_model_impl::get_event_references( std::vector& _elements, + const event_sptr _event ) +{ + if( defers_event( _event->get_id() ) ) + { + _elements.push_back( this ); + } +} + + } diff --git a/yasmine_model/source/terminate_pseudostate_model_impl.cpp b/yasmine_model/source/terminate_pseudostate_model_impl.cpp index b5f322a..d3dd5b9 100644 --- a/yasmine_model/source/terminate_pseudostate_model_impl.cpp +++ b/yasmine_model/source/terminate_pseudostate_model_impl.cpp @@ -11,6 +11,7 @@ #include "terminate_pseudostate_model_impl.hpp" #include "model_vertex_visitor.hpp" +#include "delete_visitor.hpp" namespace sxy @@ -40,6 +41,12 @@ void terminate_pseudostate_model_impl::accept( model_vertex_visitor& _constructo } +void terminate_pseudostate_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/source/transition_model_impl.cpp b/yasmine_model/source/transition_model_impl.cpp index 2c9e36a..5468082 100644 --- a/yasmine_model/source/transition_model_impl.cpp +++ b/yasmine_model/source/transition_model_impl.cpp @@ -10,6 +10,14 @@ #include "transition_model_impl.hpp" +#include + +#include "essentials/base.hpp" + +#include "model_exception.hpp" +#include "delete_visitor.hpp" + + namespace sxy { @@ -45,36 +53,109 @@ transition_model_kind transition_model_impl::get_kind() const } +void transition_model_impl::set_kind( transition_model_kind _kind ) +{ + kind_ = _kind; +} + + const std::string& transition_model_impl::get_behavior() const { return( behavior_ ); } +void transition_model_impl::set_behavior( const std::string& _behavior ) +{ + behavior_ = _behavior; +} + + const std::string& transition_model_impl::get_guard() const { return( guard_ ); } +void transition_model_impl::set_guard( const std::string& _guard ) +{ + guard_ = _guard; +} + + const sxe::uri& transition_model_impl::get_source() const { return( source_ ); } +void transition_model_impl::set_source( const std::string& _source ) +{ + source_ = sxe::uri( _source ); +} + + const sxe::uri& transition_model_impl::get_target() const { return( target_ ); } +void transition_model_impl::set_target( const std::string& _target ) +{ + target_ = sxe::uri( _target ); +} + + const event_ids& transition_model_impl::get_event_ids() const { return( events_ ); } +void transition_model_impl::set_event_ids( event_ids& _event_ids ) +{ + events_ = _event_ids; +} + + +void transition_model_impl::add_event( const event_id _id ) +{ + events_.push_back( _id ); +} + + +void transition_model_impl::remove_event( const event_id _id ) +{ + events_.erase( std::remove( events_.begin(), events_.end(), _id ), events_.end() ); +} + + +bool transition_model_impl::has_trigger( event_id _id ) const +{ + bool transition_has_trigger = false; + if( std::find( events_.begin(), events_.end(), _id ) != events_.end() ) + { + transition_has_trigger = true; + } + + return( transition_has_trigger ); +} + + +state_machine_element_model* transition_model_impl::get_child( const sxe::uri& _uri ) +{ + SX_UNUSED_PARAMETER( _uri ); + throw sxy::model::exception( "Transitions cannot have children!" ); +} + + +void transition_model_impl::accept_delete_visitor( delete_visitor& _delete_visitor ) +{ + _delete_visitor.visit( *this ); +} + + } diff --git a/yasmine_model/yasmine_model.vcxproj b/yasmine_model/yasmine_model.vcxproj index 73c8ea6..02c5642 100644 --- a/yasmine_model/yasmine_model.vcxproj +++ b/yasmine_model/yasmine_model.vcxproj @@ -83,15 +83,11 @@ - - - - - + @@ -111,6 +107,7 @@ + @@ -118,21 +115,6 @@ - - - - - - - - - - - - - - - @@ -144,6 +126,7 @@ + @@ -153,6 +136,7 @@ + @@ -191,6 +175,7 @@ + @@ -419,10 +404,10 @@ - + diff --git a/yasmine_model/yasmine_model.vcxproj.filters b/yasmine_model/yasmine_model.vcxproj.filters index c797543..b02ab2b 100644 --- a/yasmine_model/yasmine_model.vcxproj.filters +++ b/yasmine_model/yasmine_model.vcxproj.filters @@ -52,20 +52,8 @@ {f23a6b72-fd79-4e80-94f0-df764a94a2fa} - - {31e6d6f0-beef-4573-a2ee-45bb97e3972d} - - - {f3585f15-06be-4a13-8b57-021f06f33586} - - - {c435bfdf-a901-42bf-8149-b5b498bd573f} - - - {ca791aac-15dc-4770-82a2-4af4749309bc} - - - {558aca08-79e1-4822-82f2-d4294f22c133} + + {e4867d26-f01b-4da5-99ae-9c18747a3d19} @@ -147,27 +135,18 @@ Quelldateien\state machine\element - - Quelldateien\extenals\essentials - - - Quelldateien\extenals\essentials - - - Quelldateien\extenals\essentials - - - Quelldateien\extenals\essentials - - - Quelldateien\extenals\essentials - Quelldateien\state machine\element Quelldateien\state machine\element + + Quelldateien\state machine\visitors + + + Quelldateien\state machine + @@ -368,48 +347,6 @@ Headerdateien\state machine\element - - Headerdateien\externals\essentials\compatibility - - - Headerdateien\externals\essentials\compatibility - - - Headerdateien\externals\essentials\compatibility - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - - - Headerdateien\externals\essentials - Headerdateien\state machine\element @@ -419,12 +356,18 @@ Headerdateien\state machine\element - - Headerdateien\externals\essentials\compatibility - Headerdateien\json + + Headerdateien\state machine\visitors + + + Headerdateien + + + Headerdateien\state machine + diff --git a/ygen/CMakeLists.txt b/ygen/CMakeLists.txt index 3e115bb..055242e 100644 --- a/ygen/CMakeLists.txt +++ b/ygen/CMakeLists.txt @@ -29,8 +29,8 @@ message(STATUS "ygen linking to libraries: ${link_libraries_list}" ) target_link_libraries(ygen LINK_PUBLIC ${link_libraries_list}) include_directories("./include") -include_directories("./../externals/essentials/include") -include_directories("./../genesis/include") +include_directories("./../externals/essentials/source/essentials/include") +include_directories("./../externals/genesis/source/genesis/include") include_directories("./../libygen/include") install(TARGETS ygen DESTINATION bin) diff --git a/ygen/changelog.txt b/ygen/changelog.txt index cc90389..289494b 100644 --- a/ygen/changelog.txt +++ b/ygen/changelog.txt @@ -1,14 +1,21 @@ # Change log All notable changes to this project are documented in this file. -##[0.1.3] - 2017-09-21 +##[0.1.5] - 2017-12-18 + +### Changed +• CMake: use external CMakeHelpers files +• CMake: refactoring of build scripts -### Fixed -• bug in template header.gtpl: behavior classes includes onthe same line + +##[0.1.3] - 2017-09-21 ### Changed • removed unused include from template source.gtpl +### Fixed +• bug in template header.gtpl: behavior classes includes onthe same line + ##[0.1.1] - 2017-04-28 @@ -18,4 +25,4 @@ All notable changes to this project are documented in this file. ##[0.1.0] - 2017-04-25 -• The very first released version of ygen \ No newline at end of file +• The very first released version of ygen diff --git a/ygen/include/ygen_build_number.hpp b/ygen/include/ygen_build_number.hpp index 9b59587..3e4cfc1 100644 --- a/ygen/include/ygen_build_number.hpp +++ b/ygen/include/ygen_build_number.hpp @@ -20,7 +20,7 @@ namespace version { - const sxe::uint16_t BUILD_NUMBER( 810 ); + const sxe::uint16_t BUILD_NUMBER( 850 ); } diff --git a/ygen/source/ygen_version.cpp b/ygen/source/ygen_version.cpp index 64a37b6..08c4d79 100644 --- a/ygen/source/ygen_version.cpp +++ b/ygen/source/ygen_version.cpp @@ -27,7 +27,7 @@ namespace const sxe::uint16_t VERSION_MAJOR( 0 ); const sxe::uint16_t VERSION_MINOR( 1 ); -const sxe::uint16_t VERSION_PATCH( 3 ); +const sxe::uint16_t VERSION_PATCH( 5 ); } diff --git a/ygen/ygen.vcxproj b/ygen/ygen.vcxproj index c296b5b..0465e6a 100644 --- a/ygen/ygen.vcxproj +++ b/ygen/ygen.vcxproj @@ -283,11 +283,11 @@ + - + - @@ -419,7 +419,6 @@ -