#include "StructuredDataEnumScopeSequences.h" #include #include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" namespace sdd::enum_scope_sequences { class SequenceEnumEntry final : public StructuredDataDefParser::sequence_t { static constexpr auto CAPTURE_ENTRY_VALUE = 1; public: SequenceEnumEntry() { const SimpleMatcherFactory create(this); AddMatchers({ create.String().Capture(CAPTURE_ENTRY_VALUE), create.Or({ create.Char(','), create.Char('}').NoConsume() }) }); } protected: void ProcessMatch(StructuredDataDefParserState* state, SequenceResult& result) const override { assert(state->m_current_enum); const auto& entryValueToken = result.NextCapture(CAPTURE_ENTRY_VALUE); if (state->m_current_enum->m_reserved_entry_count > 0 && static_cast(state->m_current_enum->m_reserved_entry_count) <= state->m_current_enum->m_entries.size()) throw ParsingException(entryValueToken.GetPos(), "Enum entry count exceeds reserved count"); state->m_current_enum->m_entries.emplace_back(entryValueToken.StringValue(), state->m_current_enum->m_entries.size()); } }; class SequenceCloseEnum final : public StructuredDataDefParser::sequence_t { public: SequenceCloseEnum() { const SimpleMatcherFactory create(this); AddMatchers({ create.Char('}'), create.Optional(create.Char(';')) }); } protected: void ProcessMatch(StructuredDataDefParserState* state, SequenceResult& result) const override { assert(state->m_current_enum != nullptr); std::sort(state->m_current_enum->m_entries.begin(), state->m_current_enum->m_entries.end(), [](const CommonStructuredDataEnumEntry& e1, const CommonStructuredDataEnumEntry& e2) { return e1.m_name < e2.m_name; }); state->m_current_enum = nullptr; } }; } using namespace sdd; using namespace enum_scope_sequences; StructuredDataEnumScopeSequences::StructuredDataEnumScopeSequences(std::vector>& allSequences, std::vector& scopeSequences) : AbstractScopeSequenceHolder(allSequences, scopeSequences) { } void StructuredDataEnumScopeSequences::AddSequences() const { AddSequence(std::make_unique()); AddSequence(std::make_unique()); }