xref: /llvm-project/mlir/lib/Query/Matcher/VariantValue.cpp (revision 02d9f4d1f128e17e04ab6e602d3c9b9942612428)
1*02d9f4d1SDevajith //===--- Variantvalue.cpp -------------------------------------------------===//
2*02d9f4d1SDevajith //
3*02d9f4d1SDevajith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*02d9f4d1SDevajith // See https://llvm.org/LICENSE.txt for license information.
5*02d9f4d1SDevajith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*02d9f4d1SDevajith //
7*02d9f4d1SDevajith //===----------------------------------------------------------------------===//
8*02d9f4d1SDevajith //
9*02d9f4d1SDevajith //
10*02d9f4d1SDevajith //===----------------------------------------------------------------------===//
11*02d9f4d1SDevajith 
12*02d9f4d1SDevajith #include "mlir/Query/Matcher/VariantValue.h"
13*02d9f4d1SDevajith 
14*02d9f4d1SDevajith namespace mlir::query::matcher {
15*02d9f4d1SDevajith 
16*02d9f4d1SDevajith VariantMatcher::Payload::~Payload() = default;
17*02d9f4d1SDevajith 
18*02d9f4d1SDevajith class VariantMatcher::SinglePayload : public VariantMatcher::Payload {
19*02d9f4d1SDevajith public:
SinglePayload(DynMatcher matcher)20*02d9f4d1SDevajith   explicit SinglePayload(DynMatcher matcher) : matcher(std::move(matcher)) {}
21*02d9f4d1SDevajith 
getDynMatcher() const22*02d9f4d1SDevajith   std::optional<DynMatcher> getDynMatcher() const override { return matcher; }
23*02d9f4d1SDevajith 
getTypeAsString() const24*02d9f4d1SDevajith   std::string getTypeAsString() const override { return "Matcher"; }
25*02d9f4d1SDevajith 
26*02d9f4d1SDevajith private:
27*02d9f4d1SDevajith   DynMatcher matcher;
28*02d9f4d1SDevajith };
29*02d9f4d1SDevajith 
30*02d9f4d1SDevajith VariantMatcher::VariantMatcher() = default;
31*02d9f4d1SDevajith 
SingleMatcher(DynMatcher matcher)32*02d9f4d1SDevajith VariantMatcher VariantMatcher::SingleMatcher(DynMatcher matcher) {
33*02d9f4d1SDevajith   return VariantMatcher(std::make_shared<SinglePayload>(std::move(matcher)));
34*02d9f4d1SDevajith }
35*02d9f4d1SDevajith 
getDynMatcher() const36*02d9f4d1SDevajith std::optional<DynMatcher> VariantMatcher::getDynMatcher() const {
37*02d9f4d1SDevajith   return value ? value->getDynMatcher() : std::nullopt;
38*02d9f4d1SDevajith }
39*02d9f4d1SDevajith 
reset()40*02d9f4d1SDevajith void VariantMatcher::reset() { value.reset(); }
41*02d9f4d1SDevajith 
getTypeAsString() const42*02d9f4d1SDevajith std::string VariantMatcher::getTypeAsString() const { return "<Nothing>"; }
43*02d9f4d1SDevajith 
VariantValue(const VariantValue & other)44*02d9f4d1SDevajith VariantValue::VariantValue(const VariantValue &other)
45*02d9f4d1SDevajith     : type(ValueType::Nothing) {
46*02d9f4d1SDevajith   *this = other;
47*02d9f4d1SDevajith }
48*02d9f4d1SDevajith 
VariantValue(const llvm::StringRef string)49*02d9f4d1SDevajith VariantValue::VariantValue(const llvm::StringRef string)
50*02d9f4d1SDevajith     : type(ValueType::String) {
51*02d9f4d1SDevajith   value.String = new llvm::StringRef(string);
52*02d9f4d1SDevajith }
53*02d9f4d1SDevajith 
VariantValue(const VariantMatcher & matcher)54*02d9f4d1SDevajith VariantValue::VariantValue(const VariantMatcher &matcher)
55*02d9f4d1SDevajith     : type(ValueType::Matcher) {
56*02d9f4d1SDevajith   value.Matcher = new VariantMatcher(matcher);
57*02d9f4d1SDevajith }
58*02d9f4d1SDevajith 
~VariantValue()59*02d9f4d1SDevajith VariantValue::~VariantValue() { reset(); }
60*02d9f4d1SDevajith 
operator =(const VariantValue & other)61*02d9f4d1SDevajith VariantValue &VariantValue::operator=(const VariantValue &other) {
62*02d9f4d1SDevajith   if (this == &other)
63*02d9f4d1SDevajith     return *this;
64*02d9f4d1SDevajith   reset();
65*02d9f4d1SDevajith   switch (other.type) {
66*02d9f4d1SDevajith   case ValueType::String:
67*02d9f4d1SDevajith     setString(other.getString());
68*02d9f4d1SDevajith     break;
69*02d9f4d1SDevajith   case ValueType::Matcher:
70*02d9f4d1SDevajith     setMatcher(other.getMatcher());
71*02d9f4d1SDevajith     break;
72*02d9f4d1SDevajith   case ValueType::Nothing:
73*02d9f4d1SDevajith     type = ValueType::Nothing;
74*02d9f4d1SDevajith     break;
75*02d9f4d1SDevajith   }
76*02d9f4d1SDevajith   return *this;
77*02d9f4d1SDevajith }
78*02d9f4d1SDevajith 
reset()79*02d9f4d1SDevajith void VariantValue::reset() {
80*02d9f4d1SDevajith   switch (type) {
81*02d9f4d1SDevajith   case ValueType::String:
82*02d9f4d1SDevajith     delete value.String;
83*02d9f4d1SDevajith     break;
84*02d9f4d1SDevajith   case ValueType::Matcher:
85*02d9f4d1SDevajith     delete value.Matcher;
86*02d9f4d1SDevajith     break;
87*02d9f4d1SDevajith   // Cases that do nothing.
88*02d9f4d1SDevajith   case ValueType::Nothing:
89*02d9f4d1SDevajith     break;
90*02d9f4d1SDevajith   }
91*02d9f4d1SDevajith   type = ValueType::Nothing;
92*02d9f4d1SDevajith }
93*02d9f4d1SDevajith 
isString() const94*02d9f4d1SDevajith bool VariantValue::isString() const { return type == ValueType::String; }
95*02d9f4d1SDevajith 
getString() const96*02d9f4d1SDevajith const llvm::StringRef &VariantValue::getString() const {
97*02d9f4d1SDevajith   assert(isString());
98*02d9f4d1SDevajith   return *value.String;
99*02d9f4d1SDevajith }
100*02d9f4d1SDevajith 
setString(const llvm::StringRef & newValue)101*02d9f4d1SDevajith void VariantValue::setString(const llvm::StringRef &newValue) {
102*02d9f4d1SDevajith   reset();
103*02d9f4d1SDevajith   type = ValueType::String;
104*02d9f4d1SDevajith   value.String = new llvm::StringRef(newValue);
105*02d9f4d1SDevajith }
106*02d9f4d1SDevajith 
isMatcher() const107*02d9f4d1SDevajith bool VariantValue::isMatcher() const { return type == ValueType::Matcher; }
108*02d9f4d1SDevajith 
getMatcher() const109*02d9f4d1SDevajith const VariantMatcher &VariantValue::getMatcher() const {
110*02d9f4d1SDevajith   assert(isMatcher());
111*02d9f4d1SDevajith   return *value.Matcher;
112*02d9f4d1SDevajith }
113*02d9f4d1SDevajith 
setMatcher(const VariantMatcher & newValue)114*02d9f4d1SDevajith void VariantValue::setMatcher(const VariantMatcher &newValue) {
115*02d9f4d1SDevajith   reset();
116*02d9f4d1SDevajith   type = ValueType::Matcher;
117*02d9f4d1SDevajith   value.Matcher = new VariantMatcher(newValue);
118*02d9f4d1SDevajith }
119*02d9f4d1SDevajith 
getTypeAsString() const120*02d9f4d1SDevajith std::string VariantValue::getTypeAsString() const {
121*02d9f4d1SDevajith   switch (type) {
122*02d9f4d1SDevajith   case ValueType::String:
123*02d9f4d1SDevajith     return "String";
124*02d9f4d1SDevajith   case ValueType::Matcher:
125*02d9f4d1SDevajith     return "Matcher";
126*02d9f4d1SDevajith   case ValueType::Nothing:
127*02d9f4d1SDevajith     return "Nothing";
128*02d9f4d1SDevajith   }
129*02d9f4d1SDevajith   llvm_unreachable("Invalid Type");
130*02d9f4d1SDevajith }
131*02d9f4d1SDevajith 
132*02d9f4d1SDevajith } // namespace mlir::query::matcher
133