Skip to content

Commit 3833ef2

Browse files
[Minor] Replace all Result<...>::Ok with ResultOk (#355)
When returning with OK, we don't need to actually specify the type in most cases. So we implement a wrapper class `PartialResult` to enable users to write code like: `ResultOK` and `ResultErr`. Still, we have fallback to specify the result type or the error type, and the code will look like `ResultOK<T>` and `ResultErr<E>`
1 parent 096e57b commit 3833ef2

File tree

6 files changed

+88
-106
lines changed

6 files changed

+88
-106
lines changed

cpp/fsm.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,7 @@ Result<FSMWithStartEnd> FSMWithStartEnd::Intersect(
872872
const FSMWithStartEnd& lhs, const FSMWithStartEnd& rhs, int num_of_states_limited
873873
) {
874874
if (!lhs.IsLeaf() || !rhs.IsLeaf()) {
875-
return Result<FSMWithStartEnd>::Err("Intersect only support leaf fsm!");
875+
return ResultErr("Intersect only support leaf fsm!");
876876
}
877877
auto lhs_dfa = lhs.ToDFA();
878878
auto rhs_dfa = rhs.ToDFA();
@@ -921,7 +921,7 @@ Result<FSMWithStartEnd> FSMWithStartEnd::Intersect(
921921
state_map[{lhs_dfa.GetStart(), rhs_dfa.GetStart()}] = 0;
922922
while (!queue.empty()) {
923923
if (int(state_map.size()) > num_of_states_limited) {
924-
return Result<FSMWithStartEnd>::Err("Intersection have too many states!");
924+
return ResultErr("Intersection have too many states!");
925925
}
926926
auto state = queue.front();
927927
queue.pop();
@@ -994,7 +994,7 @@ Result<FSMWithStartEnd> FSMWithStartEnd::Intersect(
994994
result.AddEndState(state_map[state]);
995995
}
996996
}
997-
return Result<FSMWithStartEnd>::Ok(std::move(result));
997+
return ResultOk(std::move(result));
998998
}
999999

10001000
bool FSMWithStartEnd::IsDFA() {

cpp/fsm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414
#include <cassert>
1515
#include <cstddef>
1616
#include <cstdint>
17+
#include <functional>
1718
#include <string>
1819
#include <unordered_map>
1920
#include <unordered_set>
2021
#include <vector>
2122

2223
#include "support/compact_2d_array.h"
2324
#include "support/reflection/reflection.h"
25+
#include "support/utils.h"
2426

2527
namespace xgrammar {
2628

cpp/fsm_builder.cc

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@
77
#include <cstddef>
88
#include <cstdint>
99
#include <cstring>
10-
#include <set>
1110
#include <stack>
1211
#include <unordered_set>
1312
#include <variant>
1413
#include <vector>
1514

1615
#include "fsm.h"
17-
#include "grammar_data_structure.h"
1816
#include "support/logging.h"
1917
#include "support/utils.h"
2018

@@ -129,7 +127,7 @@ class RegexIR {
129127

130128
Result<std::pair<int, int>> RegexIR::CheckRepeat(const std::string& regex, int& start) {
131129
if (regex[start] != '{') {
132-
return Result<std::pair<int, int>>::Err("Invalid repeat format1");
130+
return ResultErr("Invalid repeat format1");
133131
}
134132
int lower_bound = 0;
135133
int upper_bound = RegexIR::kRepeatNoUpperBound;
@@ -144,7 +142,7 @@ Result<std::pair<int, int>> RegexIR::CheckRepeat(const std::string& regex, int&
144142
start++;
145143
}
146144
if (num_str.empty()) {
147-
return Result<std::pair<int, int>>::Err("Invalid repeat format2");
145+
return ResultErr("Invalid repeat format2");
148146
}
149147
lower_bound = std::stoi(num_str);
150148
while (static_cast<size_t>(start) < regex.size() && regex[start] == ' ') {
@@ -153,10 +151,10 @@ Result<std::pair<int, int>> RegexIR::CheckRepeat(const std::string& regex, int&
153151
// The format is {n}
154152
if (regex[start] == '}') {
155153
upper_bound = lower_bound;
156-
return Result<std::pair<int, int>>::Ok(std::make_pair(lower_bound, upper_bound));
154+
return ResultOk(std::make_pair(lower_bound, upper_bound));
157155
}
158156
if (regex[start] != ',') {
159-
return Result<std::pair<int, int>>::Err("Invalid repeat format3");
157+
return ResultErr("Invalid repeat format3");
160158
}
161159
XGRAMMAR_DCHECK(regex[start] == ',');
162160
start++;
@@ -165,32 +163,32 @@ Result<std::pair<int, int>> RegexIR::CheckRepeat(const std::string& regex, int&
165163
}
166164
// The format is {n,}
167165
if (regex[start] == '}') {
168-
return Result<std::pair<int, int>>::Ok(std::make_pair(lower_bound, upper_bound));
166+
return ResultOk(std::make_pair(lower_bound, upper_bound));
169167
}
170168
num_str.clear();
171169
while (static_cast<size_t>(start) < regex.size() && std::isdigit(regex[start])) {
172170
num_str += regex[start];
173171
start++;
174172
}
175173
if (num_str.empty()) {
176-
return Result<std::pair<int, int>>::Err("Invalid repeat format4");
174+
return ResultErr("Invalid repeat format4");
177175
}
178176
upper_bound = std::stoi(num_str);
179177
while (static_cast<size_t>(start) < regex.size() && regex[start] == ' ') {
180178
start++;
181179
}
182180
if (regex[start] != '}') {
183-
return Result<std::pair<int, int>>::Err("Invalid repeat format5");
181+
return ResultErr("Invalid repeat format5");
184182
}
185183
XGRAMMAR_DCHECK(regex[start] == '}');
186-
return Result<std::pair<int, int>>::Ok(std::make_pair(lower_bound, upper_bound));
184+
return ResultOk(std::make_pair(lower_bound, upper_bound));
187185
}
188186

189187
Result<FSMWithStartEnd> RegexIR::Build() const {
190188
if (states.empty()) {
191189
FSM empty_fsm(1);
192190
FSMWithStartEnd result(empty_fsm, 0, std::unordered_set<int>{0}, false);
193-
return Result<FSMWithStartEnd>::Ok(std::move(result));
191+
return ResultOk(std::move(result));
194192
}
195193
std::vector<FSMWithStartEnd> fsm_list;
196194
for (const auto& state : states) {
@@ -201,16 +199,16 @@ Result<FSMWithStartEnd> RegexIR::Build() const {
201199
fsm_list.push_back(std::move(visited).Unwrap());
202200
}
203201
if (fsm_list.size() > 1) {
204-
return Result<FSMWithStartEnd>::Ok(FSMWithStartEnd::Concat(fsm_list));
202+
return ResultOk(FSMWithStartEnd::Concat(fsm_list));
205203
} else {
206204
// If there is only one FSM, return it directly.
207-
return Result<FSMWithStartEnd>::Ok(std::move(fsm_list[0]));
205+
return ResultOk(std::move(fsm_list[0]));
208206
}
209207
}
210208

211209
Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Leaf& state) const {
212210
FSMWithStartEnd result = BuildLeafFSMFromRegex(state.regex);
213-
return Result<FSMWithStartEnd>::Ok(std::move(result));
211+
return ResultOk(std::move(result));
214212
}
215213

216214
Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Union& state) const {
@@ -223,14 +221,14 @@ Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Union& state) const {
223221
fsm_list.push_back(std::move(visited).Unwrap());
224222
}
225223
if (fsm_list.size() <= 1) {
226-
return Result<FSMWithStartEnd>::Err("Invalid union");
224+
return ResultErr("Invalid union");
227225
}
228-
return Result<FSMWithStartEnd>::Ok(FSMWithStartEnd::Union(fsm_list));
226+
return ResultOk(FSMWithStartEnd::Union(fsm_list));
229227
}
230228

231229
Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Symbol& state) const {
232230
if (state.state.size() != 1) {
233-
return Result<FSMWithStartEnd>::Err("Invalid symbol");
231+
return ResultErr("Invalid symbol");
234232
}
235233
Result<FSMWithStartEnd> child_result =
236234
std::visit([&](auto&& arg) { return RegexIR::visit(arg); }, state.state[0]);
@@ -241,13 +239,13 @@ Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Symbol& state) const {
241239

242240
switch (state.symbol) {
243241
case RegexIR::RegexSymbol::plus: {
244-
return Result<FSMWithStartEnd>::Ok(child.Plus());
242+
return ResultOk(child.Plus());
245243
}
246244
case RegexIR::RegexSymbol::star: {
247-
return Result<FSMWithStartEnd>::Ok(child.Star());
245+
return ResultOk(child.Star());
248246
}
249247
case RegexIR::RegexSymbol::optional: {
250-
return Result<FSMWithStartEnd>::Ok(child.Optional());
248+
return ResultOk(child.Optional());
251249
}
252250
default: {
253251
XGRAMMAR_LOG(FATAL) << "Unknown regex symbol: " << static_cast<int>(state.symbol);
@@ -265,14 +263,14 @@ Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Bracket& state) const {
265263
fsm_list.push_back(std::move(visited).Unwrap());
266264
}
267265
if (fsm_list.empty()) {
268-
return Result<FSMWithStartEnd>::Err("Invalid bracket");
266+
return ResultErr("Invalid bracket");
269267
}
270-
return Result<FSMWithStartEnd>::Ok(FSMWithStartEnd::Concat(fsm_list));
268+
return ResultOk(FSMWithStartEnd::Concat(fsm_list));
271269
}
272270

273271
Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Repeat& state) const {
274272
if (state.states.size() != 1) {
275-
return Result<FSMWithStartEnd>::Err("Invalid repeat");
273+
return ResultErr("Invalid repeat");
276274
}
277275
Result<FSMWithStartEnd> child_result =
278276
std::visit([&](auto&& arg) { return RegexIR::visit(arg); }, state.states[0]);
@@ -298,7 +296,7 @@ Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Repeat& state) const {
298296
for (const auto& end : result.GetEnds()) {
299297
result->AddEpsilonEdge(end, end_state_of_lower_bound_fsm);
300298
}
301-
return Result<FSMWithStartEnd>::Ok(std::move(result));
299+
return ResultOk(std::move(result));
302300
}
303301
// Handling {n, m} or {n}
304302
for (int i = 2; i <= state.upper_bound; i++) {
@@ -312,7 +310,7 @@ Result<FSMWithStartEnd> RegexIR::visit(const RegexIR::Repeat& state) const {
312310
for (const auto& end : new_ends) {
313311
result.AddEndState(end);
314312
}
315-
return Result<FSMWithStartEnd>::Ok(std::move(result));
313+
return ResultOk(std::move(result));
316314
}
317315

318316
FSMWithStartEnd RegexIR::BuildLeafFSMFromRegex(const std::string& regex) {
@@ -550,14 +548,14 @@ Result<FSMWithStartEnd> RegexFSMBuilder::Build(const std::string& regex) {
550548
// Handle The class.
551549
if (regex[i] == '[') {
552550
if (left_middle_bracket != -1) {
553-
return Result<FSMWithStartEnd>::Err("Nested middle bracket!");
551+
return ResultErr("Nested middle bracket!");
554552
}
555553
left_middle_bracket = i;
556554
continue;
557555
}
558556
if (regex[i] == ']') {
559557
if (left_middle_bracket == -1) {
560-
return Result<FSMWithStartEnd>::Err("Invalid middle bracket!");
558+
return ResultErr("Invalid middle bracket!");
561559
}
562560
RegexIR::Leaf leaf;
563561
leaf.regex = regex.substr(left_middle_bracket, i - left_middle_bracket + 1);
@@ -573,11 +571,11 @@ Result<FSMWithStartEnd> RegexFSMBuilder::Build(const std::string& regex) {
573571
}
574572
if (regex[i] == '+' || regex[i] == '*' || regex[i] == '?') {
575573
if (stack.empty()) {
576-
return Result<FSMWithStartEnd>::Err("Invalid regex: no state before operator!");
574+
return ResultErr("Invalid regex: no state before operator!");
577575
}
578576
auto state = stack.top();
579577
if (std::holds_alternative<char>(state)) {
580-
return Result<FSMWithStartEnd>::Err("Invalid regex: no state before operator!");
578+
return ResultErr("Invalid regex: no state before operator!");
581579
}
582580
stack.pop();
583581
auto child = std::get<RegexIR::State>(state);
@@ -637,9 +635,7 @@ Result<FSMWithStartEnd> RegexFSMBuilder::Build(const std::string& regex) {
637635
}
638636
}
639637
if (!paired) {
640-
return Result<FSMWithStartEnd>::Err(
641-
"Invalid regex: no paired bracket!" + std::to_string(__LINE__)
642-
);
638+
return ResultErr("Invalid regex: no paired bracket!" + std::to_string(__LINE__));
643639
}
644640
if (states.empty()) {
645641
continue;
@@ -666,18 +662,14 @@ Result<FSMWithStartEnd> RegexFSMBuilder::Build(const std::string& regex) {
666662
bracket.states.clear();
667663
continue;
668664
}
669-
return Result<FSMWithStartEnd>::Err(
670-
"Invalid regex: no paired bracket!" + std::to_string(__LINE__)
671-
);
665+
return ResultErr("Invalid regex: no paired bracket!" + std::to_string(__LINE__));
672666
}
673667
if (std::holds_alternative<RegexIR::State>(state)) {
674668
auto child = std::get<RegexIR::State>(state);
675669
bracket.states.push_back(child);
676670
continue;
677671
}
678-
return Result<FSMWithStartEnd>::Err(
679-
"Invalid regex: no paired bracket!" + std::to_string(__LINE__)
680-
);
672+
return ResultErr("Invalid regex: no paired bracket!" + std::to_string(__LINE__));
681673
}
682674
union_state.states.push_back(bracket);
683675
stack.push(union_state);
@@ -686,16 +678,16 @@ Result<FSMWithStartEnd> RegexFSMBuilder::Build(const std::string& regex) {
686678
}
687679
if (regex[i] == '{') {
688680
if (stack.empty()) {
689-
return Result<FSMWithStartEnd>::Err("Invalid regex: no state before repeat!");
681+
return ResultErr("Invalid regex: no state before repeat!");
690682
}
691683
auto state = stack.top();
692684
if (std::holds_alternative<char>(state)) {
693-
return Result<FSMWithStartEnd>::Err("Invalid regex: no state before repeat!");
685+
return ResultErr("Invalid regex: no state before repeat!");
694686
}
695687
stack.pop();
696688
auto bounds_result = RegexIR::CheckRepeat(regex, i);
697689
if (bounds_result.IsErr()) {
698-
return Result<FSMWithStartEnd>::Err(std::move(bounds_result).UnwrapErr());
690+
return ResultErr(std::move(bounds_result).UnwrapErr());
699691
}
700692
auto bounds = std::move(bounds_result).Unwrap();
701693
auto child = std::get<RegexIR::State>(state);
@@ -729,7 +721,7 @@ Result<FSMWithStartEnd> RegexFSMBuilder::Build(const std::string& regex) {
729721
stack.pop();
730722
continue;
731723
}
732-
return Result<FSMWithStartEnd>::Err("Invalid regex: no paired!");
724+
return ResultErr("Invalid regex: no paired!");
733725
}
734726
auto state = stack.top();
735727
stack.pop();

0 commit comments

Comments
 (0)