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*02d9f4d1SDevajithVariantMatcher VariantMatcher::SingleMatcher(DynMatcher matcher) { 33*02d9f4d1SDevajith return VariantMatcher(std::make_shared<SinglePayload>(std::move(matcher))); 34*02d9f4d1SDevajith } 35*02d9f4d1SDevajith getDynMatcher() const36*02d9f4d1SDevajithstd::optional<DynMatcher> VariantMatcher::getDynMatcher() const { 37*02d9f4d1SDevajith return value ? value->getDynMatcher() : std::nullopt; 38*02d9f4d1SDevajith } 39*02d9f4d1SDevajith reset()40*02d9f4d1SDevajithvoid VariantMatcher::reset() { value.reset(); } 41*02d9f4d1SDevajith getTypeAsString() const42*02d9f4d1SDevajithstd::string VariantMatcher::getTypeAsString() const { return "<Nothing>"; } 43*02d9f4d1SDevajith VariantValue(const VariantValue & other)44*02d9f4d1SDevajithVariantValue::VariantValue(const VariantValue &other) 45*02d9f4d1SDevajith : type(ValueType::Nothing) { 46*02d9f4d1SDevajith *this = other; 47*02d9f4d1SDevajith } 48*02d9f4d1SDevajith VariantValue(const llvm::StringRef string)49*02d9f4d1SDevajithVariantValue::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*02d9f4d1SDevajithVariantValue::VariantValue(const VariantMatcher &matcher) 55*02d9f4d1SDevajith : type(ValueType::Matcher) { 56*02d9f4d1SDevajith value.Matcher = new VariantMatcher(matcher); 57*02d9f4d1SDevajith } 58*02d9f4d1SDevajith ~VariantValue()59*02d9f4d1SDevajithVariantValue::~VariantValue() { reset(); } 60*02d9f4d1SDevajith operator =(const VariantValue & other)61*02d9f4d1SDevajithVariantValue &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*02d9f4d1SDevajithvoid 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*02d9f4d1SDevajithbool VariantValue::isString() const { return type == ValueType::String; } 95*02d9f4d1SDevajith getString() const96*02d9f4d1SDevajithconst llvm::StringRef &VariantValue::getString() const { 97*02d9f4d1SDevajith assert(isString()); 98*02d9f4d1SDevajith return *value.String; 99*02d9f4d1SDevajith } 100*02d9f4d1SDevajith setString(const llvm::StringRef & newValue)101*02d9f4d1SDevajithvoid 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*02d9f4d1SDevajithbool VariantValue::isMatcher() const { return type == ValueType::Matcher; } 108*02d9f4d1SDevajith getMatcher() const109*02d9f4d1SDevajithconst VariantMatcher &VariantValue::getMatcher() const { 110*02d9f4d1SDevajith assert(isMatcher()); 111*02d9f4d1SDevajith return *value.Matcher; 112*02d9f4d1SDevajith } 113*02d9f4d1SDevajith setMatcher(const VariantMatcher & newValue)114*02d9f4d1SDevajithvoid 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*02d9f4d1SDevajithstd::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