ADD: user data value.

main
bog 2023-09-14 12:49:58 +02:00
parent 47b44d3439
commit c94bf181fd
3 changed files with 19 additions and 1 deletions

View File

@ -130,6 +130,16 @@ namespace grino
return value;
}
/*static*/
std::shared_ptr<Value> Value::make_user_data(Loc const& loc,
void* val)
{
auto value = std::make_shared<Value>(loc);
value->m_type = TYPE_PROGRAM;
value->m_user_data_val = val;
return value;
}
std::shared_ptr<Program> Value::as_program() const
{
return m_program_val;
@ -152,6 +162,7 @@ namespace grino
case TYPE_FUNCTION: return "<function>";
case TYPE_REF: return "&" + std::to_string(*m_ref_val);
case TYPE_PROGRAM: return "<program>";
case TYPE_USER_DATA: return "<user data>";
case TYPE_MODULE: return "<module " + m_module_val->name() + ">";
case TYPE_ARRAY: {
std::stringstream ss;
@ -188,6 +199,7 @@ namespace grino
case TYPE_REF: return *m_ref_val == *other.m_ref_val;
case TYPE_PROGRAM: return false;
case TYPE_MODULE: return false;
case TYPE_USER_DATA: return m_user_data_val == other.m_user_data_val;
default:
std::cerr << "cannot compare equality with value "

View File

@ -44,6 +44,9 @@ namespace grino
static std::shared_ptr<Value> make_module(Loc const& loc,
std::shared_ptr<Module> val);
static std::shared_ptr<Value> make_user_data(Loc const& loc,
void* val);
explicit Value(Loc const& loc);
virtual ~Value() = default;
@ -59,6 +62,7 @@ namespace grino
val_array_t const& as_array() const { return *m_array_val; }
std::string const& as_string() const { return *m_string_val; }
std::shared_ptr<Module> as_module() const;
void* as_user_data() const { return m_user_data_val; }
std::string string() const;
bool equals(Value const& other) const;
@ -75,6 +79,7 @@ namespace grino
std::optional<val_array_t> m_array_val;
std::optional<std::string> m_string_val;
std::shared_ptr<Module> m_module_val;
void* m_user_data_val = nullptr;
};
}

View File

@ -13,7 +13,8 @@
G(TYPE_FLOAT), \
G(TYPE_ARRAY), \
G(TYPE_STRING), \
G(TYPE_MODULE)
G(TYPE_MODULE), \
G(TYPE_USER_DATA)
namespace grino