16 VariantMatcher::Payload::~Payload() =
default;
22 std::optional<DynMatcher>
getDynMatcher()
const override {
return matcher; }
33 std::vector<VariantMatcher> args)
34 : varOp(varOp), args(std::move(args)) {}
37 std::vector<DynMatcher> dynMatchers;
38 for (
auto variantMatcher : args) {
39 std::optional<DynMatcher> dynMatcher = variantMatcher.getDynMatcher();
41 dynMatchers.push_back(dynMatcher.value());
50 args, [&](
auto const &arg) { inner += arg.getTypeAsString(); },
51 [&] { inner +=
" & "; });
57 const std::vector<VariantMatcher> args;
63 return VariantMatcher(std::make_shared<SinglePayload>(std::move(matcher)));
70 std::make_shared<VariadicOpPayload>(varOp, std::move(args)));
73 std::optional<DynMatcher> VariantMatcher::MatcherOps::constructVariadicOperator(
76 std::vector<DynMatcher> dynMatchers;
77 for (
const auto &innerMatcher : innerMatchers) {
78 if (!innerMatcher.value)
80 std::optional<DynMatcher> inner = innerMatcher.value->getDynMatcher();
83 dynMatchers.push_back(*inner);
89 return value ? value->getDynMatcher() : std::nullopt;
97 : type(ValueType::Nothing) {
102 : type(ValueType::
String) {
103 value.String =
new llvm::StringRef(
string);
112 value.Signed = signedValue;
125 switch (other.type) {
126 case ValueType::String:
129 case ValueType::Matcher:
132 case ValueType::Signed:
135 case ValueType::Boolean:
138 case ValueType::Nothing:
139 type = ValueType::Nothing;
145 void VariantValue::reset() {
147 case ValueType::String:
150 case ValueType::Matcher:
151 delete value.Matcher;
154 case ValueType::Signed:
155 case ValueType::Boolean:
156 case ValueType::Nothing:
159 type = ValueType::Nothing;
168 type = ValueType::Signed;
169 value.Signed = newValue;
178 type = ValueType::Boolean;
179 value.Boolean = newValue;
186 return *value.String;
191 type = ValueType::String;
192 value.String =
new llvm::StringRef(newValue);
199 return *value.Matcher;
204 type = ValueType::Matcher;
210 case ValueType::String:
212 case ValueType::Matcher:
214 case ValueType::Signed:
216 case ValueType::Boolean:
218 case ValueType::Nothing:
221 llvm_unreachable(
"Invalid Type");
static std::unique_ptr< DynMatcher > constructVariadic(VariadicOperator Op, std::vector< DynMatcher > innerMatchers)
std::string getTypeAsString() const override
SinglePayload(DynMatcher matcher)
std::optional< DynMatcher > getDynMatcher() const override
VariadicOpPayload(DynMatcher::VariadicOperator varOp, std::vector< VariantMatcher > args)
std::string getTypeAsString() const override
std::optional< DynMatcher > getDynMatcher() const override
static VariantMatcher SingleMatcher(DynMatcher matcher)
std::optional< DynMatcher > getDynMatcher() const
std::string getTypeAsString() const
static VariantMatcher VariadicOperatorMatcher(DynMatcher::VariadicOperator varOp, ArrayRef< VariantMatcher > args)
std::string getTypeAsString() const
VariantValue & operator=(const VariantValue &other)
const VariantMatcher & getMatcher() const
void setMatcher(const VariantMatcher &matcher)
const llvm::StringRef & getString() const
int64_t getSigned() const
void setSigned(int64_t signedValue)
void setString(const llvm::StringRef &string)
void setBoolean(bool booleanValue)
Computes the backward-slice of all transitive defs reachable from rootOp, if innerMatcher matches.