summaryrefslogtreecommitdiff
path: root/mlir/lib/Query/Matcher/VariantValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/Query/Matcher/VariantValue.cpp')
-rw-r--r--mlir/lib/Query/Matcher/VariantValue.cpp56
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; }