Skip to content

Commit 3bdfe16

Browse files
committed
Support cout << error
1 parent 31e8a12 commit 3bdfe16

File tree

10 files changed

+40
-20
lines changed

10 files changed

+40
-20
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ if (!parser.allocate_capacity(1024*1024)) { exit(1); }
179179
for (padded_string json : { string("[1, 2, 3]"), string("true"), string("[ true, false ]") }) {
180180
cout << "Parsing " << json.data() << " ..." << endl;
181181
auto [doc, error] = parser.parse(json);
182-
if (error) { cerr << "Error: " << error_message(error) << endl; exit(1); }
182+
if (error) { cerr << "Error: " << error << endl; exit(1); }
183183
doc.print_json(cout);
184184
cout << endl;
185185
}

amalgamation.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ int main(int argc, char *argv[]) {
132132
if (error) {
133133
std::cout << "parse failed" << std::endl;
134134
std::cout << "error code: " << error << std::endl;
135-
std::cout << error_message(error) << std::endl;
135+
std::cout << error << std::endl;
136136
} else {
137137
std::cout << "parse valid" << std::endl;
138138
}
@@ -150,7 +150,7 @@ int main(int argc, char *argv[]) {
150150
if (error) {
151151
std::cout << "parse_many failed" << std::endl;
152152
std::cout << "error code: " << error << std::endl;
153-
std::cout << error_message(error) << std::endl;
153+
std::cout << error << std::endl;
154154
} else {
155155
std::cout << "parse_many valid" << std::endl;
156156
}

benchmark/parse_stream.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ int main (int argc, char *argv[]){
9696
batch_size_res[i] = speedinGBs;
9797

9898
if (error != simdjson::SUCCESS) {
99-
std::wcerr << "Parsing failed with: " << simdjson::error_message(error) << std::endl;
99+
std::wcerr << "Parsing failed with: " << error << std::endl;
100100
exit(1);
101101
}
102102
}
@@ -132,7 +132,7 @@ int main (int argc, char *argv[]){
132132
res.push_back(secs.count());
133133

134134
if (error != simdjson::SUCCESS) {
135-
std::wcerr << "Parsing failed with: " << simdjson::error_message(error) << std::endl;
135+
std::wcerr << "Parsing failed with: " << error << std::endl;
136136
exit(1);
137137
}
138138

include/simdjson/document.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ class document::parser {
949949
*
950950
* document::parser parser;
951951
* for (auto [doc, error] : parser.parse_many(buf, len)) {
952-
* if (error) { cerr << error_message(error) << endl; exit(1); }
952+
* if (error) { cerr << error << endl; exit(1); }
953953
* cout << std::string(doc["title"]) << endl;
954954
* }
955955
*
@@ -1011,7 +1011,7 @@ class document::parser {
10111011
*
10121012
* document::parser parser;
10131013
* for (auto [doc, error] : parser.parse_many(buf, len)) {
1014-
* if (error) { cerr << error_message(error) << endl; exit(1); }
1014+
* if (error) { cerr << error << endl; exit(1); }
10151015
* cout << std::string(doc["title"]) << endl;
10161016
* }
10171017
*
@@ -1073,7 +1073,7 @@ class document::parser {
10731073
*
10741074
* document::parser parser;
10751075
* for (auto [doc, error] : parser.parse_many(buf, len)) {
1076-
* if (error) { cerr << error_message(error) << endl; exit(1); }
1076+
* if (error) { cerr << error << endl; exit(1); }
10771077
* cout << std::string(doc["title"]) << endl;
10781078
* }
10791079
*
@@ -1134,7 +1134,7 @@ class document::parser {
11341134
*
11351135
* document::parser parser;
11361136
* for (auto [doc, error] : parser.parse_many(buf, len)) {
1137-
* if (error) { cerr << error_message(error) << endl; exit(1); }
1137+
* if (error) { cerr << error << endl; exit(1); }
11381138
* cout << std::string(doc["title"]) << endl;
11391139
* }
11401140
*

include/simdjson/error.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,26 @@ enum error_code {
4444
*/
4545
inline const char *error_message(error_code error) noexcept;
4646

47+
/**
48+
* Write the error message to the output stream
49+
*/
50+
inline std::ostream& operator<<(std::ostream& out, error_code error) noexcept;
51+
52+
/**
53+
* Exception thrown when an exception-supporting simdjson method is called
54+
*/
4755
struct invalid_json : public std::exception {
48-
invalid_json(error_code _error) noexcept : error{_error} { }
49-
const char *what() const noexcept { return error_message(error); }
50-
error_code error;
56+
/**
57+
* Create an exception from a simdjson error code.
58+
* @param error The error code
59+
*/
60+
invalid_json(error_code error) noexcept : _error{error} { }
61+
/** The error message */
62+
const char *what() const noexcept { return error_message(error()); }
63+
error_code error() const noexcept { return _error; }
64+
private:
65+
/** The error code that was used */
66+
error_code _error;
5167
};
5268

5369
/**

include/simdjson/inline/error.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ inline const std::string &error_message(int error) noexcept {
5050
return internal::error_codes[error].message;
5151
}
5252

53+
inline std::ostream& operator<<(std::ostream& out, error_code error) noexcept {
54+
return out << error_message(error);
55+
}
56+
5357
} // namespace simdjson
5458

5559
#endif // SIMDJSON_INLINE_ERROR_H

singleheader/amalgamation_demo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ int main(int argc, char *argv[]) {
1313
if (error) {
1414
std::cout << "document::parse failed" << std::endl;
1515
std::cout << "error code: " << error << std::endl;
16-
std::cout << error_message(error) << std::endl;
16+
std::cout << error << std::endl;
1717
} else {
1818
std::cout << "document::parse valid" << std::endl;
1919
}

tests/basictests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ static bool parse_json_message_issue467(char const* message, std::size_t len, si
254254
simdjson::padded_string str(message,len);
255255
for (auto [doc, error] : parser.parse_many(str, parser.capacity())) {
256256
if (error) {
257-
std::cerr << "Failed with simdjson error= " << simdjson::error_message(error) << std::endl;
257+
std::cerr << "Failed with simdjson error= " << error << std::endl;
258258
return false;
259259
}
260260
count++;
@@ -784,7 +784,7 @@ namespace dom_api {
784784
if (uint64_t(doc["a"]) != 1) { cerr << "Expected uint64_t(doc[\"a\"]) to be 1, was " << uint64_t(doc["a"]) << endl; return false; }
785785

786786
auto [val, error] = doc["d"];
787-
if (error != simdjson::NO_SUCH_FIELD) { cerr << "Expected NO_SUCH_FIELD error for uint64_t(doc[\"d\"]), got " << error_message(error) << endl; return false; }
787+
if (error != simdjson::NO_SUCH_FIELD) { cerr << "Expected NO_SUCH_FIELD error for uint64_t(doc[\"d\"]), got " << error << endl; return false; }
788788
return true;
789789
}
790790

@@ -802,7 +802,7 @@ namespace dom_api {
802802
if (uint64_t(obj["a"]) != 1) { cerr << "Expected uint64_t(obj[\"a\"]) to be 1, was " << uint64_t(obj["a"]) << endl; return false; }
803803

804804
auto [val, error] = obj["d"];
805-
if (error != simdjson::NO_SUCH_FIELD) { cerr << "Expected NO_SUCH_FIELD error for uint64_t(obj[\"d\"]), got " << error_message(error) << endl; return false; }
805+
if (error != simdjson::NO_SUCH_FIELD) { cerr << "Expected NO_SUCH_FIELD error for uint64_t(obj[\"d\"]), got " << error << endl; return false; }
806806
return true;
807807
}
808808

tests/parse_many_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ bool validate(const char *dirname) {
9999
} else if (starts_with("pass", name) and (has_extension(extension1, name) or has_extension(extension2, name)) and error) {
100100
is_file_as_expected[i] = false;
101101
printf("warning: file %s should pass but it fails. Error is: %s\n",
102-
name, simdjson::error_message(error).data());
102+
name, error_message(error));
103103
printf("size of file in bytes: %zu \n", json.size());
104104
everything_fine = false;
105105
} else if ( starts_with("fail", name) and (not starts_with("fail10.json", name)) and !error) {

tests/readme_examples.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ void document_parse_error_code() {
88

99
string json("[ 1, 2, 3 ]");
1010
auto [doc, error] = document::parse(json);
11-
if (error) { cerr << "Error: " << error_message(error) << endl; exit(1); }
11+
if (error) { cerr << "Error: " << error << endl; exit(1); }
1212
if (!doc.print_json(cout)) { exit(1); }
1313
cout << endl;
1414
}
@@ -51,7 +51,7 @@ void parser_parse() {
5151
for (padded_string json : { string("[1, 2, 3]"), string("true"), string("[ true, false ]") }) {
5252
cout << "Parsing " << json.data() << " ..." << endl;
5353
auto [doc, error] = parser.parse(json);
54-
if (error) { cerr << "Error: " << error_message(error) << endl; exit(1); }
54+
if (error) { cerr << "Error: " << error << endl; exit(1); }
5555
if (!doc.print_json(cout)) { exit(1); }
5656
cout << endl;
5757
}
@@ -65,7 +65,7 @@ void parser_parse_many_error_code() {
6565
cout << "Parsing " << json.data() << " ..." << endl;
6666
document::parser parser;
6767
for (auto [doc, error] : parser.parse_many(json)) {
68-
if (error) { cerr << "Error: " << error_message(error) << endl; exit(1); }
68+
if (error) { cerr << "Error: " << error << endl; exit(1); }
6969
if (!doc.print_json(cout)) { exit(1); }
7070
cout << endl;
7171
}

0 commit comments

Comments
 (0)