diff options
Diffstat (limited to 'mlir/lib/Query/Matcher/VariantValue.cpp')
| -rw-r--r-- | mlir/lib/Query/Matcher/VariantValue.cpp | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/mlir/lib/Query/Matcher/VariantValue.cpp b/mlir/lib/Query/Matcher/VariantValue.cpp index 1cb2d48f9d56..98ed4cc5df31 100644 --- a/mlir/lib/Query/Matcher/VariantValue.cpp +++ b/mlir/lib/Query/Matcher/VariantValue.cpp @@ -27,12 +27,64 @@ private: DynMatcher matcher; }; +class VariantMatcher::VariadicOpPayload : public VariantMatcher::Payload { +public: + VariadicOpPayload(DynMatcher::VariadicOperator varOp, + std::vector<VariantMatcher> args) + : varOp(varOp), args(std::move(args)) {} + + std::optional<DynMatcher> getDynMatcher() const override { + std::vector<DynMatcher> dynMatchers; + for (auto variantMatcher : args) { + std::optional<DynMatcher> dynMatcher = variantMatcher.getDynMatcher(); + if (dynMatcher) + dynMatchers.push_back(dynMatcher.value()); + } + auto result = DynMatcher::constructVariadic(varOp, dynMatchers); + return *result; + } + + std::string getTypeAsString() const override { + std::string inner; + llvm::interleave( + args, [&](auto const &arg) { inner += arg.getTypeAsString(); }, + [&] { inner += " & "; }); + return inner; + } + +private: + const DynMatcher::VariadicOperator varOp; + const std::vector<VariantMatcher> args; +}; + VariantMatcher::VariantMatcher() = default; VariantMatcher VariantMatcher::SingleMatcher(DynMatcher matcher) { return VariantMatcher(std::make_shared<SinglePayload>(std::move(matcher))); } +VariantMatcher +VariantMatcher::VariadicOperatorMatcher(DynMatcher::VariadicOperator varOp, + ArrayRef<VariantMatcher> args) { + return VariantMatcher( + std::make_shared<VariadicOpPayload>(varOp, std::move(args))); +} + +std::optional<DynMatcher> VariantMatcher::MatcherOps::constructVariadicOperator( + DynMatcher::VariadicOperator varOp, + ArrayRef<VariantMatcher> innerMatchers) const { + std::vector<DynMatcher> dynMatchers; + for (const auto &innerMatcher : innerMatchers) { + if (!innerMatcher.value) + return std::nullopt; + std::optional<DynMatcher> inner = innerMatcher.value->getDynMatcher(); + if (!inner) + return std::nullopt; + dynMatchers.push_back(*inner); + } + return *DynMatcher::constructVariadic(varOp, dynMatchers); +} + std::optional<DynMatcher> VariantMatcher::getDynMatcher() const { return value ? value->getDynMatcher() : std::nullopt; } @@ -120,11 +172,11 @@ void VariantValue::setSigned(int64_t newValue) { // Boolean bool VariantValue::isBoolean() const { return type == ValueType::Boolean; } -bool VariantValue::getBoolean() const { return value.Signed; } +bool VariantValue::getBoolean() const { return value.Boolean; } void VariantValue::setBoolean(bool newValue) { type = ValueType::Boolean; - value.Signed = newValue; + value.Boolean = newValue; } bool VariantValue::isString() const { return type == ValueType::String; } |
