use more stringrefs

master
Daniel Kolesa 2021-03-17 23:32:38 +01:00
parent 7eaf3679a4
commit fb8668a508
2 changed files with 61 additions and 57 deletions

View File

@ -92,6 +92,10 @@ struct OSTD_EXPORT cs_strref {
return ostd::string_range{*this}.length(); return ostd::string_range{*this}.length();
} }
char const *data() const {
return ostd::string_range{*this}.data();
}
bool operator==(cs_strref const &s) const; bool operator==(cs_strref const &s) const;
private: private:
@ -234,9 +238,9 @@ struct OSTD_EXPORT cs_ident {
} }
protected: protected:
cs_ident(cs_ident_type tp, ostd::string_range name, int flags = 0); cs_ident(cs_ident_type tp, cs_strref name, int flags = 0);
cs_string p_name; cs_strref p_name;
/* represents the cs_ident_type above, but internally it has a wider variety /* represents the cs_ident_type above, but internally it has a wider variety
* of values, so it's an int here (maps to an internal enum) * of values, so it's an int here (maps to an internal enum)
*/ */
@ -251,7 +255,7 @@ struct OSTD_EXPORT cs_var: cs_ident {
friend struct cs_shared_state; friend struct cs_shared_state;
protected: protected:
cs_var(cs_ident_type tp, ostd::string_range name, cs_var_cb func, int flags = 0); cs_var(cs_ident_type tp, cs_strref name, cs_var_cb func, int flags = 0);
private: private:
cs_var_cb cb_var; cs_var_cb cb_var;
@ -279,7 +283,7 @@ struct OSTD_EXPORT cs_ivar: cs_var {
private: private:
cs_ivar( cs_ivar(
ostd::string_range n, cs_int m, cs_int x, cs_int v, cs_var_cb f, int flags cs_strref n, cs_int m, cs_int x, cs_int v, cs_var_cb f, int flags
); );
cs_int p_storage, p_minval, p_maxval, p_overrideval; cs_int p_storage, p_minval, p_maxval, p_overrideval;
@ -299,7 +303,7 @@ struct OSTD_EXPORT cs_fvar: cs_var {
private: private:
cs_fvar( cs_fvar(
ostd::string_range n, cs_float m, cs_float x, cs_float v, cs_strref n, cs_float m, cs_float x, cs_float v,
cs_var_cb f, int flags cs_var_cb f, int flags
); );
@ -310,15 +314,15 @@ struct OSTD_EXPORT cs_svar: cs_var {
friend struct cs_state; friend struct cs_state;
friend struct cs_shared_state; friend struct cs_shared_state;
ostd::string_range get_value() const; cs_strref get_value() const;
void set_value(cs_string val); void set_value(cs_strref val);
cs_string to_printable() const final; cs_string to_printable() const final;
private: private:
cs_svar(ostd::string_range n, cs_string v, cs_var_cb f, int flags); cs_svar(cs_strref n, cs_strref v, cs_strref ov, cs_var_cb f, int flags);
cs_string p_storage, p_overrideval; cs_strref p_storage, p_overrideval;
}; };
struct OSTD_EXPORT cs_alias: cs_ident { struct OSTD_EXPORT cs_alias: cs_ident {
@ -332,12 +336,12 @@ struct OSTD_EXPORT cs_alias: cs_ident {
void get_cval(cs_value &v) const; void get_cval(cs_value &v) const;
private: private:
cs_alias(cs_state &cs, ostd::string_range n, cs_strref a, int flags); cs_alias(cs_state &cs, cs_strref n, cs_strref a, int flags);
cs_alias(cs_state &cs, ostd::string_range n, ostd::string_range a, int flags); cs_alias(cs_state &cs, cs_strref n, ostd::string_range a, int flags);
cs_alias(cs_state &cs, ostd::string_range n, cs_int a, int flags); cs_alias(cs_state &cs, cs_strref n, cs_int a, int flags);
cs_alias(cs_state &cs, ostd::string_range n, cs_float a, int flags); cs_alias(cs_state &cs, cs_strref n, cs_float a, int flags);
cs_alias(cs_state &cs, ostd::string_range n, int flags); cs_alias(cs_state &cs, cs_strref n, int flags);
cs_alias(cs_state &cs, ostd::string_range n, cs_value v, int flags); cs_alias(cs_state &cs, cs_strref n, cs_value v, int flags);
cs_bcode *p_acode; cs_bcode *p_acode;
cs_ident_stack *p_astack; cs_ident_stack *p_astack;
@ -353,12 +357,9 @@ struct cs_command: cs_ident {
int get_num_args() const; int get_num_args() const;
private: private:
cs_command( cs_command(cs_strref name, cs_strref args, int numargs, cs_command_cb func);
ostd::string_range name, ostd::string_range args,
int numargs, cs_command_cb func
);
cs_string p_cargs; cs_strref p_cargs;
cs_command_cb p_cb_cftv; cs_command_cb p_cb_cftv;
int p_numargs; int p_numargs;
}; };
@ -445,7 +446,7 @@ struct OSTD_EXPORT cs_state {
cs_var_cb f = cs_var_cb(), int flags = 0 cs_var_cb f = cs_var_cb(), int flags = 0
); );
cs_svar *new_svar( cs_svar *new_svar(
ostd::string_range n, cs_string v, ostd::string_range n, ostd::string_range v,
cs_var_cb f = cs_var_cb(), int flags = 0 cs_var_cb f = cs_var_cb(), int flags = 0
); );

View File

@ -30,72 +30,71 @@ bool cs_check_num(ostd::string_range s) {
} }
} }
cs_ident::cs_ident(cs_ident_type tp, ostd::string_range nm, int fl): cs_ident::cs_ident(cs_ident_type tp, cs_strref nm, int fl):
p_name(nm), p_type(int(tp)), p_flags(fl) p_name(nm), p_type(int(tp)), p_flags(fl)
{} {}
cs_var::cs_var(cs_ident_type tp, ostd::string_range name, cs_var_cb f, int fl): cs_var::cs_var(cs_ident_type tp, cs_strref name, cs_var_cb f, int fl):
cs_ident(tp, name, fl), cb_var(std::move(f)) cs_ident(tp, name, fl), cb_var(std::move(f))
{} {}
cs_ivar::cs_ivar( cs_ivar::cs_ivar(
ostd::string_range name, cs_int m, cs_int x, cs_int v, cs_var_cb f, int fl cs_strref name, cs_int m, cs_int x, cs_int v, cs_var_cb f, int fl
): ):
cs_var(cs_ident_type::Ivar, name, std::move(f), fl | ((m > x) ? CS_IDF_READONLY : 0)), cs_var(cs_ident_type::Ivar, name, std::move(f), fl | ((m > x) ? CS_IDF_READONLY : 0)),
p_storage(v), p_minval(m), p_maxval(x), p_overrideval(0) p_storage(v), p_minval(m), p_maxval(x), p_overrideval(0)
{} {}
cs_fvar::cs_fvar( cs_fvar::cs_fvar(
ostd::string_range name, cs_float m, cs_float x, cs_float v, cs_var_cb f, int fl cs_strref name, cs_float m, cs_float x, cs_float v, cs_var_cb f, int fl
): ):
cs_var(cs_ident_type::Fvar, name, std::move(f), fl | ((m > x) ? CS_IDF_READONLY : 0)), cs_var(cs_ident_type::Fvar, name, std::move(f), fl | ((m > x) ? CS_IDF_READONLY : 0)),
p_storage(v), p_minval(m), p_maxval(x), p_overrideval(0) p_storage(v), p_minval(m), p_maxval(x), p_overrideval(0)
{} {}
cs_svar::cs_svar(ostd::string_range name, cs_string v, cs_var_cb f, int fl): cs_svar::cs_svar(cs_strref name, cs_strref v, cs_strref ov, cs_var_cb f, int fl):
cs_var(cs_ident_type::Svar, name, std::move(f), fl), cs_var(cs_ident_type::Svar, name, std::move(f), fl),
p_storage(std::move(v)), p_overrideval() p_storage{v}, p_overrideval{ov}
{} {}
cs_alias::cs_alias(cs_state &cs, ostd::string_range name, cs_strref a, int fl): cs_alias::cs_alias(cs_state &cs, cs_strref name, cs_strref a, int fl):
cs_ident(cs_ident_type::Alias, name, fl), cs_ident(cs_ident_type::Alias, name, fl),
p_acode(nullptr), p_astack(nullptr), p_val{cs} p_acode(nullptr), p_astack(nullptr), p_val{cs}
{ {
p_val.set_str(a); p_val.set_str(a);
} }
cs_alias::cs_alias(cs_state &cs, ostd::string_range name, ostd::string_range a, int fl): cs_alias::cs_alias(cs_state &cs, cs_strref name, ostd::string_range a, int fl):
cs_ident(cs_ident_type::Alias, name, fl), cs_ident(cs_ident_type::Alias, name, fl),
p_acode(nullptr), p_astack(nullptr), p_val{cs} p_acode(nullptr), p_astack(nullptr), p_val{cs}
{ {
p_val.set_str(a); p_val.set_str(a);
} }
cs_alias::cs_alias(cs_state &cs, ostd::string_range name, cs_int a, int fl): cs_alias::cs_alias(cs_state &cs, cs_strref name, cs_int a, int fl):
cs_ident(cs_ident_type::Alias, name, fl), cs_ident(cs_ident_type::Alias, name, fl),
p_acode(nullptr), p_astack(nullptr), p_val{cs} p_acode(nullptr), p_astack(nullptr), p_val{cs}
{ {
p_val.set_int(a); p_val.set_int(a);
} }
cs_alias::cs_alias(cs_state &cs, ostd::string_range name, cs_float a, int fl): cs_alias::cs_alias(cs_state &cs, cs_strref name, cs_float a, int fl):
cs_ident(cs_ident_type::Alias, name, fl), cs_ident(cs_ident_type::Alias, name, fl),
p_acode(nullptr), p_astack(nullptr), p_val{cs} p_acode(nullptr), p_astack(nullptr), p_val{cs}
{ {
p_val.set_float(a); p_val.set_float(a);
} }
cs_alias::cs_alias(cs_state &cs, ostd::string_range name, int fl): cs_alias::cs_alias(cs_state &cs, cs_strref name, int fl):
cs_ident(cs_ident_type::Alias, name, fl), cs_ident(cs_ident_type::Alias, name, fl),
p_acode(nullptr), p_astack(nullptr), p_val{cs} p_acode(nullptr), p_astack(nullptr), p_val{cs}
{ {
p_val.set_null(); p_val.set_null();
} }
/* FIXME: use cs rather than val's cs */ /* FIXME: use cs rather than val's cs */
cs_alias::cs_alias(cs_state &, ostd::string_range name, cs_value v, int fl): cs_alias::cs_alias(cs_state &, cs_strref name, cs_value v, int fl):
cs_ident(cs_ident_type::Alias, name, fl), cs_ident(cs_ident_type::Alias, name, fl),
p_acode(nullptr), p_astack(nullptr), p_val(std::move(v)) p_acode(nullptr), p_astack(nullptr), p_val(v)
{} {}
cs_command::cs_command( cs_command::cs_command(
ostd::string_range name, ostd::string_range args, cs_strref name, cs_strref args, int nargs, cs_command_cb f
int nargs, cs_command_cb f
): ):
cs_ident(cs_ident_type::Command, name, 0), cs_ident(cs_ident_type::Command, name, 0),
p_cargs(args), p_cb_cftv(std::move(f)), p_numargs(nargs) p_cargs(args), p_cb_cftv(std::move(f)), p_numargs(nargs)
@ -275,11 +274,11 @@ cs_string cs_fvar::to_printable() const {
return std::move(app.get()); return std::move(app.get());
} }
ostd::string_range cs_svar::get_value() const { cs_strref cs_svar::get_value() const {
return ostd::iter(p_storage); return p_storage;
} }
void cs_svar::set_value(cs_string val) { void cs_svar::set_value(cs_strref val) {
p_storage = std::move(val); p_storage = val;
} }
cs_string cs_svar::to_printable() const { cs_string cs_svar::to_printable() const {
@ -529,7 +528,9 @@ OSTD_EXPORT cs_ident *cs_state::new_ident(ostd::string_range name, int flags) {
*this, "number %s is not a valid identifier name", name *this, "number %s is not a valid identifier name", name
); );
} }
id = add_ident(p_state->create<cs_alias>(*this, name, flags)); id = add_ident(p_state->create<cs_alias>(
*this, cs_strref{*p_state, name}, flags
));
} }
return id; return id;
} }
@ -585,25 +586,26 @@ OSTD_EXPORT cs_const_ident_r cs_state::get_idents() const {
OSTD_EXPORT cs_ivar *cs_state::new_ivar( OSTD_EXPORT cs_ivar *cs_state::new_ivar(
ostd::string_range n, cs_int m, cs_int x, cs_int v, cs_var_cb f, int flags ostd::string_range n, cs_int m, cs_int x, cs_int v, cs_var_cb f, int flags
) { ) {
return add_ident( return add_ident(p_state->create<cs_ivar>(
p_state->create<cs_ivar>(n, m, x, v, std::move(f), flags) cs_strref{*p_state, n}, m, x, v, std::move(f), flags
)->get_ivar(); ))->get_ivar();
} }
OSTD_EXPORT cs_fvar *cs_state::new_fvar( OSTD_EXPORT cs_fvar *cs_state::new_fvar(
ostd::string_range n, cs_float m, cs_float x, cs_float v, cs_var_cb f, int flags ostd::string_range n, cs_float m, cs_float x, cs_float v, cs_var_cb f, int flags
) { ) {
return add_ident( return add_ident(p_state->create<cs_fvar>(
p_state->create<cs_fvar>(n, m, x, v, std::move(f), flags) cs_strref{*p_state, n}, m, x, v, std::move(f), flags
)->get_fvar(); ))->get_fvar();
} }
OSTD_EXPORT cs_svar *cs_state::new_svar( OSTD_EXPORT cs_svar *cs_state::new_svar(
ostd::string_range n, cs_string v, cs_var_cb f, int flags ostd::string_range n, ostd::string_range v, cs_var_cb f, int flags
) { ) {
return add_ident( return add_ident(p_state->create<cs_svar>(
p_state->create<cs_svar>(n, std::move(v), std::move(f), flags) cs_strref{*p_state, n}, cs_strref{*p_state, v},
)->get_svar(); cs_strref{*p_state, ""}, std::move(f), flags
))->get_svar();
} }
OSTD_EXPORT void cs_state::reset_var(ostd::string_range name) { OSTD_EXPORT void cs_state::reset_var(ostd::string_range name) {
@ -656,7 +658,7 @@ OSTD_EXPORT void cs_state::set_alias(ostd::string_range name, cs_value v) {
throw cs_error(*this, "cannot alias number %s", name); throw cs_error(*this, "cannot alias number %s", name);
} else { } else {
add_ident(p_state->create<cs_alias>( add_ident(p_state->create<cs_alias>(
*this, name, std::move(v), identflags *this, cs_strref{*p_state, name}, std::move(v), identflags
)); ));
} }
} }
@ -776,7 +778,7 @@ OSTD_EXPORT void cs_state::set_var_str(
*this, sv, sv->p_flags, *this, sv, sv->p_flags,
[&sv]() { sv->p_overrideval = sv->get_value(); } [&sv]() { sv->p_overrideval = sv->get_value(); }
); );
sv->set_value(cs_string{v}); sv->set_value(cs_strref{*p_state, v});
if (dofunc) { if (dofunc) {
sv->changed(*this); sv->changed(*this);
} }
@ -950,7 +952,7 @@ OSTD_EXPORT void cs_state::set_var_str_checked(
*this, sv, sv->p_flags, *this, sv, sv->p_flags,
[&sv]() { sv->p_overrideval = sv->get_value(); } [&sv]() { sv->p_overrideval = sv->get_value(); }
); );
sv->set_value(cs_string{v}); sv->set_value(cs_strref{*p_state, v});
sv->changed(*this); sv->changed(*this);
} }
@ -1000,9 +1002,10 @@ OSTD_EXPORT cs_command *cs_state::new_command(
return nullptr; return nullptr;
} }
} }
return static_cast<cs_command *>( return static_cast<cs_command *>(add_ident(p_state->create<cs_command>(
add_ident(p_state->create<cs_command>(name, args, nargs, std::move(func))) cs_strref{*p_state, name}, cs_strref{*p_state, args}, nargs,
); std::move(func))
));
} }
static inline void cs_do_loop( static inline void cs_do_loop(