diff --git a/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp b/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp index 504df56c..f26372fd 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp +++ b/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp @@ -6,8 +6,9 @@ #include "Sequence/SequenceLoadMenu.h" #include "Sequence/SequenceMenuDef.h" #include "Sequence/SequenceOpenGlobalScopeBlock.h" -#include "Sequence/Properties/SequenceFullScreen.h" -#include "Sequence/Properties/SequenceName.h" +#include "Sequence/Properties/FunctionPropertySequences.h" +#include "Sequence/Properties/ItemPropertySequences.h" +#include "Sequence/Properties/MenuPropertySequences.h" using namespace menu; @@ -17,7 +18,7 @@ MenuFileParser::MenuFileParser(SimpleLexer* lexer, const FeatureLevel featureLev CreateTestCollections(); } -void MenuFileParser::AddTest(std::vector& collection, std::unique_ptr test) +void MenuFileParser::AddSequence(std::vector& collection, std::unique_ptr test) { collection.push_back(test.get()); m_all_tests.emplace_back(std::move(test)); @@ -25,36 +26,40 @@ void MenuFileParser::AddTest(std::vector& collection, std::unique_p void MenuFileParser::CreateNoScopeTests() { - AddTest(m_no_scope_tests, std::make_unique()); + AddSequence(m_no_scope_tests, std::make_unique()); } void MenuFileParser::CreateGlobalScopeTests() { - AddTest(m_global_scope_tests, std::make_unique()); - AddTest(m_global_scope_tests, std::make_unique()); - AddTest(m_global_scope_tests, std::make_unique()); - AddTest(m_global_scope_tests, std::make_unique()); + AddSequence(m_global_scope_tests, std::make_unique()); + AddSequence(m_global_scope_tests, std::make_unique()); + AddSequence(m_global_scope_tests, std::make_unique()); + AddSequence(m_global_scope_tests, std::make_unique()); } void MenuFileParser::CreateFunctionScopeTests() { - AddTest(m_function_scope_tests, std::make_unique()); - AddTest(m_function_scope_tests, std::make_unique()); + AddSequence(m_function_scope_tests, std::make_unique()); + + FunctionPropertySequences functionPropertySequences(m_all_tests, m_function_scope_tests); + functionPropertySequences.AddSequences(m_state->m_feature_level); } void MenuFileParser::CreateMenuScopeTests() { - AddTest(m_menu_scope_tests, std::make_unique()); - AddTest(m_menu_scope_tests, std::make_unique()); - AddTest(m_menu_scope_tests, std::make_unique()); + AddSequence(m_menu_scope_tests, std::make_unique()); + AddSequence(m_menu_scope_tests, std::make_unique()); - AddTest(m_menu_scope_tests, std::make_unique()); + MenuPropertySequences menuPropertySequences(m_all_tests, m_menu_scope_tests); + menuPropertySequences.AddSequences(m_state->m_feature_level); } void MenuFileParser::CreateItemScopeTests() { - AddTest(m_item_scope_tests, std::make_unique()); - AddTest(m_item_scope_tests, std::make_unique()); + AddSequence(m_item_scope_tests, std::make_unique()); + + ItemPropertySequences itemPropertySequences(m_all_tests, m_item_scope_tests); + itemPropertySequences.AddSequences(m_state->m_feature_level); } void MenuFileParser::CreateTestCollections() diff --git a/src/ObjLoading/Parsing/Menu/MenuFileParser.h b/src/ObjLoading/Parsing/Menu/MenuFileParser.h index ee62b0d4..c5d3d677 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileParser.h +++ b/src/ObjLoading/Parsing/Menu/MenuFileParser.h @@ -17,7 +17,7 @@ namespace menu std::vector m_menu_scope_tests; std::vector m_item_scope_tests; - void AddTest(std::vector& collection, std::unique_ptr test); + void AddSequence(std::vector& collection, std::unique_ptr test); void CreateNoScopeTests(); void CreateGlobalScopeTests(); void CreateFunctionScopeTests(); diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.cpp new file mode 100644 index 00000000..a4147697 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.cpp @@ -0,0 +1,15 @@ +#include "AbstractPropertySequenceHolder.h" + +using namespace menu; + +AbstractPropertySequenceHolder::AbstractPropertySequenceHolder(std::vector>& allSequences, std::vector& scopeSequences) + : m_all_sequences(allSequences), + m_scope_sequences(scopeSequences) +{ +} + +void AbstractPropertySequenceHolder::AddSequence(std::unique_ptr test) const +{ + m_scope_sequences.push_back(test.get()); + m_all_sequences.emplace_back(std::move(test)); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.h new file mode 100644 index 00000000..4f314c7d --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" + +namespace menu +{ + class AbstractPropertySequenceHolder + { + std::vector>& m_all_sequences; + std::vector& m_scope_sequences; + + protected: + AbstractPropertySequenceHolder(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequence(std::unique_ptr test) const; + + public: + virtual ~AbstractPropertySequenceHolder() = default; + AbstractPropertySequenceHolder(const AbstractPropertySequenceHolder& other) = delete; + AbstractPropertySequenceHolder(AbstractPropertySequenceHolder&& other) noexcept = default; + AbstractPropertySequenceHolder& operator=(const AbstractPropertySequenceHolder& other) = delete; + AbstractPropertySequenceHolder& operator=(AbstractPropertySequenceHolder&& other) noexcept = default; + + virtual void AddSequences(FeatureLevel featureLevel) = 0; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp new file mode 100644 index 00000000..6da0a9ce --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp @@ -0,0 +1,45 @@ +#include "FunctionPropertySequences.h" + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +namespace menu::function_properties +{ + class SequenceName final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_NAME = 1; + + public: + SequenceName() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase("name"), + create.Text().Capture(CAPTURE_NAME) + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + assert(state->m_current_function); + + const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); + state->m_current_function->m_name = nameValue; + } + }; +} + +using namespace function_properties; + +FunctionPropertySequences::FunctionPropertySequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractPropertySequenceHolder(allSequences, scopeSequences) +{ +} + +void FunctionPropertySequences::AddSequences(FeatureLevel featureLevel) +{ + AddSequence(std::make_unique()); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.h new file mode 100644 index 00000000..d971d130 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractPropertySequenceHolder.h" + +namespace menu +{ + class FunctionPropertySequences final : AbstractPropertySequenceHolder + { + public: + FunctionPropertySequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp new file mode 100644 index 00000000..be1be6e4 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp @@ -0,0 +1,45 @@ +#include "ItemPropertySequences.h" + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +namespace menu::item_properties +{ + class SequenceName final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_NAME = 1; + + public: + SequenceName() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase("name"), + create.Text().Capture(CAPTURE_NAME) + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + assert(state->m_current_item); + + const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); + state->m_current_item->m_name = nameValue; + } + }; +} + +using namespace item_properties; + +ItemPropertySequences::ItemPropertySequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractPropertySequenceHolder(allSequences, scopeSequences) +{ +} + +void ItemPropertySequences::AddSequences(FeatureLevel featureLevel) +{ + AddSequence(std::make_unique()); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.h new file mode 100644 index 00000000..820180d8 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractPropertySequenceHolder.h" + +namespace menu +{ + class ItemPropertySequences final : AbstractPropertySequenceHolder + { + public: + ItemPropertySequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp new file mode 100644 index 00000000..c736b234 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp @@ -0,0 +1,71 @@ +#include "MenuPropertySequences.h" + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +namespace menu::menu_properties +{ + class SequenceName final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_NAME = 1; + + public: + SequenceName() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase("name"), + create.Text().Capture(CAPTURE_NAME) + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + assert(state->m_current_menu); + + const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); + state->m_current_menu->m_name = nameValue; + } + }; + + class SequenceFullScreen final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_VALUE = 1; + + public: + SequenceFullScreen() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase("fullscreen"), + create.Numeric().Capture(CAPTURE_VALUE) + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + assert(state->m_current_menu); + + const auto value = MenuMatcherFactory::TokenNumericIntValue(result.NextCapture(CAPTURE_VALUE)); + state->m_current_menu->m_fullscreen = value > 0; + } + }; +} + +using namespace menu_properties; + +MenuPropertySequences::MenuPropertySequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractPropertySequenceHolder(allSequences, scopeSequences) +{ +} + +void MenuPropertySequences::AddSequences(FeatureLevel featureLevel) +{ + AddSequence(std::make_unique()); + AddSequence(std::make_unique()); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.h new file mode 100644 index 00000000..b81328a3 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractPropertySequenceHolder.h" + +namespace menu +{ + class MenuPropertySequences final : AbstractPropertySequenceHolder + { + public: + MenuPropertySequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceFullScreen.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceFullScreen.cpp deleted file mode 100644 index d321944d..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceFullScreen.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "SequenceFullScreen.h" - -#include "Parsing/Menu/MenuMatcherFactory.h" - -using namespace menu; - -SequenceFullScreen::SequenceFullScreen() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.KeywordIgnoreCase("fullscreen"), - create.Numeric().Capture(CAPTURE_VALUE) - }); -} - -void SequenceFullScreen::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(state->m_current_menu); - - const auto nameValue = MenuMatcherFactory::TokenNumericIntValue(result.NextCapture(CAPTURE_VALUE)); - - state->m_current_menu->m_fullscreen = nameValue > 0; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceFullScreen.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceFullScreen.h deleted file mode 100644 index 0552e1ac..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceFullScreen.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceFullScreen final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_VALUE = 1; - - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceFullScreen(); - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.cpp deleted file mode 100644 index 505fa8ca..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "SequenceName.h" - -#include "Parsing/Menu/MenuMatcherFactory.h" - -using namespace menu; - -SequenceName::SequenceName() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.KeywordIgnoreCase("name"), - create.Text().Capture(CAPTURE_NAME) - }); -} - -void SequenceName::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(state->m_current_item || state->m_current_menu || state->m_current_function); - - const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); - - if (state->m_current_item) - state->m_current_item->m_name = nameValue; - else if (state->m_current_menu) - state->m_current_menu->m_name = nameValue; - else if (state->m_current_function) - state->m_current_function->m_name = nameValue; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.h deleted file mode 100644 index 800aecd7..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceName final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_NAME = 1; - - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceName(); - }; -}