2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-03-06 21:13:02 +00:00
Files
OpenAssetTools/src/Parser/Parsing/Matcher/MatcherOr.h
2026-03-06 00:13:04 +01:00

44 lines
1.2 KiB
C++

#pragma once
#include "AbstractMatcher.h"
#include "Parsing/IParserValue.h"
#include "Utils/ClassUtils.h"
#include <iterator>
#include <memory>
template<typename TokenType> class MatcherOr final : public AbstractMatcher<TokenType>
{
// TokenType must inherit IParserValue
static_assert(std::is_base_of<IParserValue, TokenType>::value);
std::vector<std::unique_ptr<AbstractMatcher<TokenType>>> m_matchers;
protected:
MatcherResult<TokenType> CanMatch(ILexer<TokenType>* lexer, unsigned tokenOffset) override
{
for (const std::unique_ptr<AbstractMatcher<TokenType>>& matcher : m_matchers)
{
MatcherResult<TokenType> result = matcher->Match(lexer, tokenOffset);
if (!result.m_matches)
continue;
return result;
}
return MatcherResult<TokenType>::NoMatch();
}
public:
MatcherOr(std::initializer_list<Movable<std::unique_ptr<AbstractMatcher<TokenType>>>> matchers)
: m_matchers(std::make_move_iterator(matchers.begin()), std::make_move_iterator(matchers.end()))
{
}
explicit MatcherOr(std::vector<std::unique_ptr<AbstractMatcher<TokenType>>> matchers)
: m_matchers(std::move(matchers))
{
}
};