eliminate length field in cs_value

master
Daniel Kolesa 2021-03-17 21:16:25 +01:00
parent e3cff816c7
commit 8b7f36319d
2 changed files with 12 additions and 24 deletions

View File

@ -151,7 +151,6 @@ private:
stor_t<void *>, stor_t<void *>,
cs_strref cs_strref
> p_stor; > p_stor;
size_t p_len;
cs_value_type p_type; cs_value_type p_type;
}; };

View File

@ -37,7 +37,7 @@ static inline void csv_cleanup(cs_value_type tv, T &stor) {
cs_value::cs_value(cs_state &st): cs_value(*st.p_state) {} cs_value::cs_value(cs_state &st): cs_value(*st.p_state) {}
cs_value::cs_value(cs_shared_state &st): cs_value::cs_value(cs_shared_state &st):
p_stor(), p_len(0), p_type(cs_value_type::Null) p_stor(), p_type(cs_value_type::Null)
{ {
reinterpret_cast<stor_priv_t<void *> *>(&p_stor)->state = &st; reinterpret_cast<stor_priv_t<void *> *>(&p_stor)->state = &st;
} }
@ -57,13 +57,11 @@ cs_value &cs_value::operator=(cs_value const &v) {
case cs_value_type::Int: case cs_value_type::Int:
case cs_value_type::Float: case cs_value_type::Float:
case cs_value_type::Ident: case cs_value_type::Ident:
p_len = v.p_len;
p_type = v.p_type; p_type = v.p_type;
p_stor = v.p_stor; p_stor = v.p_stor;
break; break;
case cs_value_type::String: case cs_value_type::String:
p_type = cs_value_type::String; p_type = cs_value_type::String;
p_len = v.p_len;
new (&p_stor) cs_strref{ new (&p_stor) cs_strref{
*reinterpret_cast<cs_strref const *>(&v.p_stor) *reinterpret_cast<cs_strref const *>(&v.p_stor)
}; };
@ -97,7 +95,6 @@ void cs_value::set_str(ostd::string_range val) {
csv_cleanup(p_type, p_stor); csv_cleanup(p_type, p_stor);
new (&p_stor) cs_strref{*state(), val}; new (&p_stor) cs_strref{*state(), val};
p_type = cs_value_type::String; p_type = cs_value_type::String;
p_len = val.size();
} }
void cs_value::set_null() { void cs_value::set_null() {
@ -132,8 +129,7 @@ cs_float cs_value::force_float() {
break; break;
case cs_value_type::String: case cs_value_type::String:
rf = cs_parse_float(ostd::string_range( rf = cs_parse_float(ostd::string_range(
csv_get<char const *>(p_stor), *reinterpret_cast<cs_strref const *>(&p_stor)
csv_get<char const *>(p_stor) + p_len
)); ));
break; break;
case cs_value_type::Float: case cs_value_type::Float:
@ -153,8 +149,7 @@ cs_int cs_value::force_int() {
break; break;
case cs_value_type::String: case cs_value_type::String:
ri = cs_parse_int(ostd::string_range( ri = cs_parse_int(ostd::string_range(
csv_get<char const *>(p_stor), *reinterpret_cast<cs_strref const *>(&p_stor)
csv_get<char const *>(p_stor) + p_len
)); ));
break; break;
case cs_value_type::Int: case cs_value_type::Int:
@ -177,17 +172,13 @@ ostd::string_range cs_value::force_str() {
break; break;
case cs_value_type::String: case cs_value_type::String:
return ostd::string_range( return ostd::string_range(
csv_get<char const *>(p_stor), *reinterpret_cast<cs_strref const *>(&p_stor)
csv_get<char const *>(p_stor) + p_len
); );
default: default:
break; break;
} }
set_str(std::move(rs)); set_str(std::move(rs));
return ostd::string_range( return ostd::string_range(*reinterpret_cast<cs_strref const *>(&p_stor));
csv_get<char const *>(p_stor),
csv_get<char const *>(p_stor) + p_len
);
} }
cs_int cs_value::get_int() const { cs_int cs_value::get_int() const {
@ -198,8 +189,7 @@ cs_int cs_value::get_int() const {
return csv_get<cs_int>(p_stor); return csv_get<cs_int>(p_stor);
case cs_value_type::String: case cs_value_type::String:
return cs_parse_int(ostd::string_range( return cs_parse_int(ostd::string_range(
csv_get<char const *>(p_stor), *reinterpret_cast<cs_strref const *>(&p_stor)
csv_get<char const *>(p_stor) + p_len
)); ));
default: default:
break; break;
@ -215,8 +205,7 @@ cs_float cs_value::get_float() const {
return cs_float(csv_get<cs_int>(p_stor)); return cs_float(csv_get<cs_int>(p_stor));
case cs_value_type::String: case cs_value_type::String:
return cs_parse_float(ostd::string_range( return cs_parse_float(ostd::string_range(
csv_get<char const *>(p_stor), *reinterpret_cast<cs_strref const *>(&p_stor)
csv_get<char const *>(p_stor) + p_len
)); ));
default: default:
break; break;
@ -241,7 +230,9 @@ cs_ident *cs_value::get_ident() const {
cs_string cs_value::get_str() const { cs_string cs_value::get_str() const {
switch (get_type()) { switch (get_type()) {
case cs_value_type::String: case cs_value_type::String:
return cs_string{csv_get<char const *>(p_stor), p_len}; return cs_string{ostd::string_range{
*reinterpret_cast<cs_strref const *>(&p_stor)
}};
case cs_value_type::Int: case cs_value_type::Int:
return intstr(csv_get<cs_int>(p_stor)); return intstr(csv_get<cs_int>(p_stor));
case cs_value_type::Float: case cs_value_type::Float:
@ -256,8 +247,7 @@ ostd::string_range cs_value::get_strr() const {
switch (get_type()) { switch (get_type()) {
case cs_value_type::String: case cs_value_type::String:
return ostd::string_range( return ostd::string_range(
csv_get<char const *>(p_stor), *reinterpret_cast<cs_strref const *>(&p_stor)
csv_get<char const *>(p_stor)+ p_len
); );
default: default:
break; break;
@ -323,8 +313,7 @@ bool cs_value::get_bool() const {
return csv_get<cs_int>(p_stor) != 0; return csv_get<cs_int>(p_stor) != 0;
case cs_value_type::String: case cs_value_type::String:
return cs_get_bool(ostd::string_range( return cs_get_bool(ostd::string_range(
csv_get<char const *>(p_stor), *reinterpret_cast<cs_strref const *>(&p_stor)
csv_get<char const *>(p_stor) + p_len
)); ));
default: default:
return false; return false;