bolt/deps/llvm-18.1.8/mlir/lib/Query/Matcher/VariantValue.cpp

133 lines
3.3 KiB
C++
Raw Normal View History

2025-02-14 19:21:04 +01:00
//===--- 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<DynMatcher> 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<SinglePayload>(std::move(matcher)));
}
std::optional<DynMatcher> VariantMatcher::getDynMatcher() const {
return value ? value->getDynMatcher() : std::nullopt;
}
void VariantMatcher::reset() { value.reset(); }
std::string VariantMatcher::getTypeAsString() const { return "<Nothing>"; }
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