1 //===--- Variantvalue.cpp -------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
12 #include "mlir/Query/Matcher/VariantValue.h"
14 namespace mlir::query::matcher
{
16 VariantMatcher::Payload::~Payload() = default;
18 class VariantMatcher::SinglePayload
: public VariantMatcher::Payload
{
20 explicit SinglePayload(DynMatcher matcher
) : matcher(std::move(matcher
)) {}
22 std::optional
<DynMatcher
> getDynMatcher() const override
{ return matcher
; }
24 std::string
getTypeAsString() const override
{ return "Matcher"; }
30 VariantMatcher::VariantMatcher() = default;
32 VariantMatcher
VariantMatcher::SingleMatcher(DynMatcher matcher
) {
33 return VariantMatcher(std::make_shared
<SinglePayload
>(std::move(matcher
)));
36 std::optional
<DynMatcher
> VariantMatcher::getDynMatcher() const {
37 return value
? value
->getDynMatcher() : std::nullopt
;
40 void VariantMatcher::reset() { value
.reset(); }
42 std::string
VariantMatcher::getTypeAsString() const { return "<Nothing>"; }
44 VariantValue::VariantValue(const VariantValue
&other
)
45 : type(ValueType::Nothing
) {
49 VariantValue::VariantValue(const llvm::StringRef string
)
50 : type(ValueType::String
) {
51 value
.String
= new llvm::StringRef(string
);
54 VariantValue::VariantValue(const VariantMatcher
&matcher
)
55 : type(ValueType::Matcher
) {
56 value
.Matcher
= new VariantMatcher(matcher
);
59 VariantValue::~VariantValue() { reset(); }
61 VariantValue
&VariantValue::operator=(const VariantValue
&other
) {
66 case ValueType::String
:
67 setString(other
.getString());
69 case ValueType::Matcher
:
70 setMatcher(other
.getMatcher());
72 case ValueType::Nothing
:
73 type
= ValueType::Nothing
;
79 void VariantValue::reset() {
81 case ValueType::String
:
84 case ValueType::Matcher
:
87 // Cases that do nothing.
88 case ValueType::Nothing
:
91 type
= ValueType::Nothing
;
94 bool VariantValue::isString() const { return type
== ValueType::String
; }
96 const llvm::StringRef
&VariantValue::getString() const {
101 void VariantValue::setString(const llvm::StringRef
&newValue
) {
103 type
= ValueType::String
;
104 value
.String
= new llvm::StringRef(newValue
);
107 bool VariantValue::isMatcher() const { return type
== ValueType::Matcher
; }
109 const VariantMatcher
&VariantValue::getMatcher() const {
111 return *value
.Matcher
;
114 void VariantValue::setMatcher(const VariantMatcher
&newValue
) {
116 type
= ValueType::Matcher
;
117 value
.Matcher
= new VariantMatcher(newValue
);
120 std::string
VariantValue::getTypeAsString() const {
122 case ValueType::String
:
124 case ValueType::Matcher
:
126 case ValueType::Nothing
:
129 llvm_unreachable("Invalid Type");
132 } // namespace mlir::query::matcher