1 | //===--- Variantvalue.cpp -------------------------------------------------===// |
---|---|
2 | // |
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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // |
10 | //===----------------------------------------------------------------------===// |
11 | |
12 | #include "mlir/Query/Matcher/VariantValue.h" |
13 | |
14 | namespace mlir::query::matcher { |
15 | |
16 | VariantMatcher::Payload::~Payload() = default; |
17 | |
18 | class VariantMatcher::SinglePayload : public VariantMatcher::Payload { |
19 | public: |
20 | explicit SinglePayload(DynMatcher matcher) : matcher(std::move(matcher)) {} |
21 | |
22 | std::optional<DynMatcher> getDynMatcher() const override { return matcher; } |
23 | |
24 | std::string getTypeAsString() const override { return "Matcher"; } |
25 | |
26 | private: |
27 | DynMatcher matcher; |
28 | }; |
29 | |
30 | VariantMatcher::VariantMatcher() = default; |
31 | |
32 | VariantMatcher VariantMatcher::SingleMatcher(DynMatcher matcher) { |
33 | return VariantMatcher(std::make_shared<SinglePayload>(args: std::move(matcher))); |
34 | } |
35 | |
36 | std::optional<DynMatcher> VariantMatcher::getDynMatcher() const { |
37 | return value ? value->getDynMatcher() : std::nullopt; |
38 | } |
39 | |
40 | void VariantMatcher::reset() { value.reset(); } |
41 | |
42 | std::string VariantMatcher::getTypeAsString() const { return "<Nothing>"; } |
43 | |
44 | VariantValue::VariantValue(const VariantValue &other) |
45 | : type(ValueType::Nothing) { |
46 | *this = other; |
47 | } |
48 | |
49 | VariantValue::VariantValue(const llvm::StringRef string) |
50 | : type(ValueType::String) { |
51 | value.String = new llvm::StringRef(string); |
52 | } |
53 | |
54 | VariantValue::VariantValue(const VariantMatcher &matcher) |
55 | : type(ValueType::Matcher) { |
56 | value.Matcher = new VariantMatcher(matcher); |
57 | } |
58 | |
59 | VariantValue::VariantValue(int64_t signedValue) : type(ValueType::Signed) { |
60 | value.Signed = signedValue; |
61 | } |
62 | |
63 | VariantValue::VariantValue(bool setBoolean) : type(ValueType::Boolean) { |
64 | value.Boolean = setBoolean; |
65 | } |
66 | |
67 | VariantValue::~VariantValue() { reset(); } |
68 | |
69 | VariantValue &VariantValue::operator=(const VariantValue &other) { |
70 | if (this == &other) |
71 | return *this; |
72 | reset(); |
73 | switch (other.type) { |
74 | case ValueType::String: |
75 | setString(other.getString()); |
76 | break; |
77 | case ValueType::Matcher: |
78 | setMatcher(other.getMatcher()); |
79 | break; |
80 | case ValueType::Signed: |
81 | setSigned(other.getSigned()); |
82 | break; |
83 | case ValueType::Boolean: |
84 | setBoolean(other.getBoolean()); |
85 | break; |
86 | case ValueType::Nothing: |
87 | type = ValueType::Nothing; |
88 | break; |
89 | } |
90 | return *this; |
91 | } |
92 | |
93 | void VariantValue::reset() { |
94 | switch (type) { |
95 | case ValueType::String: |
96 | delete value.String; |
97 | break; |
98 | case ValueType::Matcher: |
99 | delete value.Matcher; |
100 | break; |
101 | // Cases that do nothing. |
102 | case ValueType::Signed: |
103 | case ValueType::Boolean: |
104 | case ValueType::Nothing: |
105 | break; |
106 | } |
107 | type = ValueType::Nothing; |
108 | } |
109 | |
110 | // Signed |
111 | bool VariantValue::isSigned() const { return type == ValueType::Signed; } |
112 | |
113 | int64_t VariantValue::getSigned() const { return value.Signed; } |
114 | |
115 | void VariantValue::setSigned(int64_t newValue) { |
116 | type = ValueType::Signed; |
117 | value.Signed = newValue; |
118 | } |
119 | |
120 | // Boolean |
121 | bool VariantValue::isBoolean() const { return type == ValueType::Boolean; } |
122 | |
123 | bool VariantValue::getBoolean() const { return value.Signed; } |
124 | |
125 | void VariantValue::setBoolean(bool newValue) { |
126 | type = ValueType::Boolean; |
127 | value.Signed = newValue; |
128 | } |
129 | |
130 | bool VariantValue::isString() const { return type == ValueType::String; } |
131 | |
132 | const llvm::StringRef &VariantValue::getString() const { |
133 | assert(isString()); |
134 | return *value.String; |
135 | } |
136 | |
137 | void VariantValue::setString(const llvm::StringRef &newValue) { |
138 | reset(); |
139 | type = ValueType::String; |
140 | value.String = new llvm::StringRef(newValue); |
141 | } |
142 | |
143 | bool VariantValue::isMatcher() const { return type == ValueType::Matcher; } |
144 | |
145 | const VariantMatcher &VariantValue::getMatcher() const { |
146 | assert(isMatcher()); |
147 | return *value.Matcher; |
148 | } |
149 | |
150 | void VariantValue::setMatcher(const VariantMatcher &newValue) { |
151 | reset(); |
152 | type = ValueType::Matcher; |
153 | value.Matcher = new VariantMatcher(newValue); |
154 | } |
155 | |
156 | std::string VariantValue::getTypeAsString() const { |
157 | switch (type) { |
158 | case ValueType::String: |
159 | return "String"; |
160 | case ValueType::Matcher: |
161 | return "Matcher"; |
162 | case ValueType::Signed: |
163 | return "Signed"; |
164 | case ValueType::Boolean: |
165 | return "Boolean"; |
166 | case ValueType::Nothing: |
167 | return "Nothing"; |
168 | } |
169 | llvm_unreachable("Invalid Type"); |
170 | } |
171 | |
172 | } // namespace mlir::query::matcher |
173 |
Definitions
- ~Payload
- SinglePayload
- SinglePayload
- getDynMatcher
- getTypeAsString
- VariantMatcher
- SingleMatcher
- getDynMatcher
- reset
- getTypeAsString
- VariantValue
- VariantValue
- VariantValue
- VariantValue
- VariantValue
- ~VariantValue
- operator=
- reset
- isSigned
- getSigned
- setSigned
- isBoolean
- getBoolean
- setBoolean
- isString
- getString
- setString
- isMatcher
- getMatcher
- setMatcher
Improve your Profiling and Debugging skills
Find out more