//===--- Variantvalue.cpp -------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // //===----------------------------------------------------------------------===// #include "mlir/Query/Matcher/VariantValue.h" namespace mlir::query::matcher { VariantMatcher::Payload::~Payload() = default; class VariantMatcher::SinglePayload : public VariantMatcher::Payload { public: explicit SinglePayload(DynMatcher matcher) : matcher(std::move(matcher)) {} std::optional getDynMatcher() const override { return matcher; } std::string getTypeAsString() const override { return "Matcher"; } private: DynMatcher matcher; }; VariantMatcher::VariantMatcher() = default; VariantMatcher VariantMatcher::SingleMatcher(DynMatcher matcher) { return VariantMatcher(std::make_shared(std::move(matcher))); } std::optional VariantMatcher::getDynMatcher() const { return value ? value->getDynMatcher() : std::nullopt; } void VariantMatcher::reset() { value.reset(); } std::string VariantMatcher::getTypeAsString() const { return ""; } VariantValue::VariantValue(const VariantValue &other) : type(ValueType::Nothing) { *this = other; } VariantValue::VariantValue(const llvm::StringRef string) : type(ValueType::String) { value.String = new llvm::StringRef(string); } VariantValue::VariantValue(const VariantMatcher &matcher) : type(ValueType::Matcher) { value.Matcher = new VariantMatcher(matcher); } VariantValue::~VariantValue() { reset(); } VariantValue &VariantValue::operator=(const VariantValue &other) { if (this == &other) return *this; reset(); switch (other.type) { case ValueType::String: setString(other.getString()); break; case ValueType::Matcher: setMatcher(other.getMatcher()); break; case ValueType::Nothing: type = ValueType::Nothing; break; } return *this; } void VariantValue::reset() { switch (type) { case ValueType::String: delete value.String; break; case ValueType::Matcher: delete value.Matcher; break; // Cases that do nothing. case ValueType::Nothing: break; } type = ValueType::Nothing; } bool VariantValue::isString() const { return type == ValueType::String; } const llvm::StringRef &VariantValue::getString() const { assert(isString()); return *value.String; } void VariantValue::setString(const llvm::StringRef &newValue) { reset(); type = ValueType::String; value.String = new llvm::StringRef(newValue); } bool VariantValue::isMatcher() const { return type == ValueType::Matcher; } const VariantMatcher &VariantValue::getMatcher() const { assert(isMatcher()); return *value.Matcher; } void VariantValue::setMatcher(const VariantMatcher &newValue) { reset(); type = ValueType::Matcher; value.Matcher = new VariantMatcher(newValue); } std::string VariantValue::getTypeAsString() const { switch (type) { case ValueType::String: return "String"; case ValueType::Matcher: return "Matcher"; case ValueType::Nothing: return "Nothing"; } llvm_unreachable("Invalid Type"); } } // namespace mlir::query::matcher