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 (
const 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)));
69 return VariantMatcher(std::make_shared<VariadicOpPayload>(varOp, args));
72 std::optional<DynMatcher> VariantMatcher::MatcherOps::constructVariadicOperator(
75 std::vector<DynMatcher> dynMatchers;
76 for (
const auto &innerMatcher : innerMatchers) {
77 if (!innerMatcher.value)
79 std::optional<DynMatcher> inner = innerMatcher.value->getDynMatcher();
82 dynMatchers.push_back(*inner);
88 return value ? value->getDynMatcher() : std::nullopt;
96 : type(ValueType::Nothing) {
101 : type(ValueType::
String) {
102 value.String =
new llvm::StringRef(
string);
111 value.Signed = signedValue;
124 switch (other.type) {
125 case ValueType::String:
128 case ValueType::Matcher:
131 case ValueType::Signed:
134 case ValueType::Boolean:
137 case ValueType::Nothing:
138 type = ValueType::Nothing;
144 void VariantValue::reset() {
146 case ValueType::String:
149 case ValueType::Matcher:
150 delete value.Matcher;
153 case ValueType::Signed:
154 case ValueType::Boolean:
155 case ValueType::Nothing:
158 type = ValueType::Nothing;
167 type = ValueType::Signed;
168 value.Signed = newValue;
177 type = ValueType::Boolean;
178 value.Boolean = newValue;
185 return *value.String;
190 type = ValueType::String;
191 value.String =
new llvm::StringRef(newValue);
198 return *value.Matcher;
203 type = ValueType::Matcher;
209 case ValueType::String:
211 case ValueType::Matcher:
213 case ValueType::Signed:
215 case ValueType::Boolean:
217 case ValueType::Nothing:
220 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.