Skip to content

Commit 68a1dec

Browse files
authored
refactor: replace boost lexical_cast (#4095)
1 parent c64fae2 commit 68a1dec

7 files changed

Lines changed: 122 additions & 44 deletions

File tree

src/apiserver/api_server_impl.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ bool APIServerImpl::AppendJsonValue(const Value& v, hybridse::sdk::DataType type
263263
if (!v.IsInt()) {
264264
return false;
265265
}
266-
return row->AppendInt16(boost::lexical_cast<int16_t>(v.GetInt()));
266+
return row->AppendInt16(static_cast<int16_t>(v.GetInt()));
267267
}
268268
case hybridse::sdk::kTypeInt32: {
269269
if (!v.IsInt()) {

src/codec/codec.cc

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919
#include <algorithm>
2020
#include <array>
21+
#include <charconv>
2122
#include <unordered_set>
2223

2324
#include "base/glog_wrapper.h"
24-
#include "boost/lexical_cast.hpp"
2525

2626
namespace openmldb {
2727
namespace codec {
@@ -463,23 +463,43 @@ bool RowBuilder::AppendValue(const std::string& val) {
463463
}
464464
break;
465465
}
466-
case openmldb::type::kSmallInt:
467-
ok = AppendInt16(boost::lexical_cast<int16_t>(val));
466+
case openmldb::type::kSmallInt: {
467+
int16_t v = 0;
468+
if (auto ret = std::from_chars(val.data(), val.data() + val.size(), v); ret.ec != std::errc()) {
469+
return false;
470+
}
471+
ok = AppendInt16(v);
468472
break;
469-
case openmldb::type::kInt:
470-
ok = AppendInt32(boost::lexical_cast<int32_t>(val));
473+
}
474+
case openmldb::type::kInt: {
475+
int32_t v = 0;
476+
if (auto ret = std::from_chars(val.data(), val.data() + val.size(), v); ret.ec != std::errc()) {
477+
return false;
478+
}
479+
ok = AppendInt32(v);
471480
break;
472-
case openmldb::type::kBigInt:
473-
ok = AppendInt64(boost::lexical_cast<int64_t>(val));
481+
}
482+
case openmldb::type::kBigInt: {
483+
int64_t v = 0;
484+
if (auto ret = std::from_chars(val.data(), val.data() + val.size(), v); ret.ec != std::errc()) {
485+
return false;
486+
}
487+
ok = AppendInt64(v);
474488
break;
475-
case openmldb::type::kTimestamp:
476-
ok = AppendTimestamp(boost::lexical_cast<int64_t>(val));
489+
}
490+
case openmldb::type::kTimestamp: {
491+
int64_t v = 0;
492+
if (auto ret = std::from_chars(val.data(), val.data() + val.size(), v); ret.ec != std::errc()) {
493+
return false;
494+
}
495+
ok = AppendTimestamp(v);
477496
break;
497+
}
478498
case openmldb::type::kFloat:
479-
ok = AppendFloat(boost::lexical_cast<float>(val));
499+
ok = AppendFloat(std::stof(val));
480500
break;
481501
case openmldb::type::kDouble:
482-
ok = AppendDouble(boost::lexical_cast<double>(val));
502+
ok = AppendDouble(std::stod(val));
483503
break;
484504
case openmldb::type::kDate: {
485505
std::vector<std::string> parts;
@@ -488,9 +508,18 @@ bool RowBuilder::AppendValue(const std::string& val) {
488508
ok = false;
489509
break;
490510
}
491-
uint32_t year = boost::lexical_cast<uint32_t>(parts[0]);
492-
uint32_t mon = boost::lexical_cast<uint32_t>(parts[1]);
493-
uint32_t day = boost::lexical_cast<uint32_t>(parts[2]);
511+
uint32_t year = 0;
512+
uint32_t mon = 0;
513+
uint32_t day = 0;
514+
if (auto ret = std::from_chars(parts[0].data(), parts[0].data() + parts[0].size(), year); ret.ec != std::errc()) {
515+
return false;
516+
}
517+
if (auto ret = std::from_chars(parts[1].data(), parts[1].data() + parts[1].size(), mon); ret.ec != std::errc()) {
518+
return false;
519+
}
520+
if (auto ret = std::from_chars(parts[2].data(), parts[2].data() + parts[2].size(), day); ret.ec != std::errc()) {
521+
return false;
522+
}
494523
ok = AppendDate(year, mon, day);
495524
break;
496525
}

src/codec/field_codec.h

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
#include <string.h>
2121

2222
#include <algorithm>
23+
#include <charconv>
2324
#include <string>
2425
#include <vector>
2526

2627
#include "base/endianconv.h"
2728
#include "base/strings.h"
28-
#include "boost/lexical_cast.hpp"
2929
#include "proto/type.pb.h"
3030
#include "sdk/base.h"
3131

@@ -56,19 +56,31 @@ static bool AppendColumnValue(const std::string& v, hybridse::sdk::DataType type
5656
return ok;
5757
}
5858
case hybridse::sdk::kTypeInt16: {
59-
return row->AppendInt16(boost::lexical_cast<int16_t>(v));
59+
int16_t val = 0;
60+
if (auto ret = std::from_chars(v.data(), v.data() + v.size(), val); ret.ec != std::errc()) {
61+
return false;
62+
}
63+
return row->AppendInt16(val);
6064
}
6165
case hybridse::sdk::kTypeInt32: {
62-
return row->AppendInt32(boost::lexical_cast<int32_t>(v));
66+
int32_t val = 0;
67+
if (auto ret = std::from_chars(v.data(), v.data() + v.size(), val); ret.ec != std::errc()) {
68+
return false;
69+
}
70+
return row->AppendInt32(val);
6371
}
6472
case hybridse::sdk::kTypeInt64: {
65-
return row->AppendInt64(boost::lexical_cast<int64_t>(v));
73+
int64_t val = 0;
74+
if (auto ret = std::from_chars(v.data(), v.data() + v.size(), val); ret.ec != std::errc()) {
75+
return false;
76+
}
77+
return row->AppendInt64(val);
6678
}
6779
case hybridse::sdk::kTypeFloat: {
68-
return row->AppendFloat(boost::lexical_cast<float>(v));
80+
return row->AppendFloat(std::stof(v));
6981
}
7082
case hybridse::sdk::kTypeDouble: {
71-
return row->AppendDouble(boost::lexical_cast<double>(v));
83+
return row->AppendDouble(std::stod(v));
7284
}
7385
case hybridse::sdk::kTypeString: {
7486
return row->AppendString(v);
@@ -79,13 +91,29 @@ static bool AppendColumnValue(const std::string& v, hybridse::sdk::DataType type
7991
if (parts.size() != 3) {
8092
return false;
8193
}
82-
auto year = boost::lexical_cast<int32_t>(parts[0]);
83-
auto mon = boost::lexical_cast<int32_t>(parts[1]);
84-
auto day = boost::lexical_cast<int32_t>(parts[2]);
94+
int32_t year = 0;
95+
int32_t mon = 0;
96+
int32_t day = 0;
97+
if (auto ret = std::from_chars(parts[0].data(), parts[0].data() + parts[0].size(), year);
98+
ret.ec != std::errc()) {
99+
return false;
100+
}
101+
if (auto ret = std::from_chars(parts[1].data(), parts[1].data() + parts[1].size(), mon);
102+
ret.ec != std::errc()) {
103+
return false;
104+
}
105+
if (auto ret = std::from_chars(parts[2].data(), parts[2].data() + parts[2].size(), day);
106+
ret.ec != std::errc()) {
107+
return false;
108+
}
85109
return row->AppendDate(year, mon, day);
86110
}
87111
case hybridse::sdk::kTypeTimestamp: {
88-
return row->AppendTimestamp(boost::lexical_cast<int64_t>(v));
112+
int64_t val = 0;
113+
if (auto ret = std::from_chars(v.data(), v.data() + v.size(), val); ret.ec != std::errc()) {
114+
return false;
115+
}
116+
return row->AppendTimestamp(val);
89117
}
90118
default: {
91119
return false;

src/sdk/node_adapter.cc

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -675,20 +675,42 @@ std::shared_ptr<hybridse::node::ConstNode> NodeAdapter::StringToData(const std::
675675
openmldb::type::DataType data_type) {
676676
try {
677677
switch (data_type) {
678-
case type::kBool:
679-
return std::make_shared<hybridse::node::ConstNode>(boost::lexical_cast<bool>(str));
680-
case type::kSmallInt:
681-
return std::make_shared<hybridse::node::ConstNode>(boost::lexical_cast<int16_t>(str));
678+
case type::kBool: {
679+
std::string b_val = str;
680+
std::transform(b_val.begin(), b_val.end(), b_val.begin(), ::tolower);
681+
if (b_val == "true") {
682+
return std::make_shared<hybridse::node::ConstNode>(true);
683+
} else {
684+
return std::make_shared<hybridse::node::ConstNode>(false);
685+
}
686+
}
687+
case type::kSmallInt: {
688+
int16_t val = 0;
689+
if (auto ret = std::from_chars(str.data(), str.data() + str.size(), val); ret.ec != std::errc()) {
690+
return std::shared_ptr<hybridse::node::ConstNode>();
691+
}
692+
return std::make_shared<hybridse::node::ConstNode>(val);
693+
}
682694
case type::kInt:
683-
case type::kDate:
684-
return std::make_shared<hybridse::node::ConstNode>(boost::lexical_cast<int32_t>(str));
695+
case type::kDate: {
696+
int32_t val = 0;
697+
if (auto ret = std::from_chars(str.data(), str.data() + str.size(), val); ret.ec != std::errc()) {
698+
return std::shared_ptr<hybridse::node::ConstNode>();
699+
}
700+
return std::make_shared<hybridse::node::ConstNode>(val);
701+
}
685702
case type::kBigInt:
686-
case type::kTimestamp:
687-
return std::make_shared<hybridse::node::ConstNode>(boost::lexical_cast<int64_t>(str));
703+
case type::kTimestamp: {
704+
int64_t val = 0;
705+
if (auto ret = std::from_chars(str.data(), str.data() + str.size(), val); ret.ec != std::errc()) {
706+
return std::shared_ptr<hybridse::node::ConstNode>();
707+
}
708+
return std::make_shared<hybridse::node::ConstNode>(val);
709+
}
688710
case type::kFloat:
689-
return std::make_shared<hybridse::node::ConstNode>(boost::lexical_cast<float>(str));
711+
return std::make_shared<hybridse::node::ConstNode>(std::stof(str));
690712
case type::kDouble:
691-
return std::make_shared<hybridse::node::ConstNode>(boost::lexical_cast<double>(str));
713+
return std::make_shared<hybridse::node::ConstNode>(std::stod(str));
692714
case type::kVarchar:
693715
case type::kString:
694716
return std::make_shared<hybridse::node::ConstNode>(str);

src/tablet/tablet_impl_test.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
#include "base/glog_wrapper.h"
3232
#include "base/kv_iterator.h"
3333
#include "base/strings.h"
34-
#include "boost/lexical_cast.hpp"
3534
#include "codec/codec.h"
3635
#include "codec/row_codec.h"
3736
#include "codec/schema_codec.h"

src/test/base_test.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
*/
1616

1717
#include "test/base_test.h"
18-
19-
#include "boost/lexical_cast.hpp"
18+
#include <charconv>
2019
#include "glog/logging.h"
2120
#include "sdk/base.h"
2221
#include "sdk/result_set.h"
@@ -255,8 +254,10 @@ const std::vector<hybridse::codec::Row> SQLCaseTest::SortRows(const hybridse::vm
255254
std::vector<std::pair<int64_t, hybridse::codec::Row>> sort_rows;
256255
for (auto row : rows) {
257256
row_view.Reset(row.buf());
258-
row_view.GetAsString(idx);
259-
sort_rows.push_back(std::make_pair(boost::lexical_cast<int64_t>(row_view.GetAsString(idx)), row));
257+
std::string str = row_view.GetAsString(idx);
258+
int64_t val = 0;
259+
std::from_chars(str.data(), str.data() + str.size(), val);
260+
sort_rows.push_back(std::make_pair(val, row));
260261
}
261262
std::sort(sort_rows.begin(), sort_rows.end(),
262263
[](std::pair<int64_t, hybridse::codec::Row> &a, std::pair<int64_t, hybridse::codec::Row> &b) {

src/zk/zk_client.cc

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
#include "zk/zk_client.h"
1818

1919
#include <algorithm>
20+
#include <charconv>
2021
#include <utility>
2122

2223
#include "absl/cleanup/cleanup.h"
2324
#include "absl/strings/str_split.h"
2425
#include "base/glog_wrapper.h"
2526
#include "base/strings.h"
26-
#include "boost/lexical_cast.hpp"
2727
#include "gflags/gflags.h"
2828

2929
namespace openmldb {
@@ -435,9 +435,8 @@ bool ZkClient::Increment(const std::string& node) {
435435
continue;
436436
}
437437
uint64_t number = 0;
438-
try {
439-
number = boost::lexical_cast<uint64_t>(value);
440-
} catch (const std::exception& e) {
438+
auto result = std::from_chars(value.data(), value.data() + value.size(), number);
439+
if (result.ec != std::errc{}) {
441440
return false;
442441
}
443442
std::string new_value = std::to_string(number + 1);

0 commit comments

Comments
 (0)