ADD: user data value.
parent
47b44d3439
commit
c94bf181fd
|
@ -130,6 +130,16 @@ namespace grino
|
||||||
return value;
|
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
|
std::shared_ptr<Program> Value::as_program() const
|
||||||
{
|
{
|
||||||
return m_program_val;
|
return m_program_val;
|
||||||
|
@ -152,6 +162,7 @@ namespace grino
|
||||||
case TYPE_FUNCTION: return "<function>";
|
case TYPE_FUNCTION: return "<function>";
|
||||||
case TYPE_REF: return "&" + std::to_string(*m_ref_val);
|
case TYPE_REF: return "&" + std::to_string(*m_ref_val);
|
||||||
case TYPE_PROGRAM: return "<program>";
|
case TYPE_PROGRAM: return "<program>";
|
||||||
|
case TYPE_USER_DATA: return "<user data>";
|
||||||
case TYPE_MODULE: return "<module " + m_module_val->name() + ">";
|
case TYPE_MODULE: return "<module " + m_module_val->name() + ">";
|
||||||
case TYPE_ARRAY: {
|
case TYPE_ARRAY: {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
|
@ -188,6 +199,7 @@ namespace grino
|
||||||
case TYPE_REF: return *m_ref_val == *other.m_ref_val;
|
case TYPE_REF: return *m_ref_val == *other.m_ref_val;
|
||||||
case TYPE_PROGRAM: return false;
|
case TYPE_PROGRAM: return false;
|
||||||
case TYPE_MODULE: return false;
|
case TYPE_MODULE: return false;
|
||||||
|
case TYPE_USER_DATA: return m_user_data_val == other.m_user_data_val;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
std::cerr << "cannot compare equality with value "
|
std::cerr << "cannot compare equality with value "
|
||||||
|
|
|
@ -44,6 +44,9 @@ namespace grino
|
||||||
static std::shared_ptr<Value> make_module(Loc const& loc,
|
static std::shared_ptr<Value> make_module(Loc const& loc,
|
||||||
std::shared_ptr<Module> val);
|
std::shared_ptr<Module> val);
|
||||||
|
|
||||||
|
static std::shared_ptr<Value> make_user_data(Loc const& loc,
|
||||||
|
void* val);
|
||||||
|
|
||||||
explicit Value(Loc const& loc);
|
explicit Value(Loc const& loc);
|
||||||
virtual ~Value() = default;
|
virtual ~Value() = default;
|
||||||
|
|
||||||
|
@ -59,6 +62,7 @@ namespace grino
|
||||||
val_array_t const& as_array() const { return *m_array_val; }
|
val_array_t const& as_array() const { return *m_array_val; }
|
||||||
std::string const& as_string() const { return *m_string_val; }
|
std::string const& as_string() const { return *m_string_val; }
|
||||||
std::shared_ptr<Module> as_module() const;
|
std::shared_ptr<Module> as_module() const;
|
||||||
|
void* as_user_data() const { return m_user_data_val; }
|
||||||
|
|
||||||
std::string string() const;
|
std::string string() const;
|
||||||
bool equals(Value const& other) const;
|
bool equals(Value const& other) const;
|
||||||
|
@ -75,6 +79,7 @@ namespace grino
|
||||||
std::optional<val_array_t> m_array_val;
|
std::optional<val_array_t> m_array_val;
|
||||||
std::optional<std::string> m_string_val;
|
std::optional<std::string> m_string_val;
|
||||||
std::shared_ptr<Module> m_module_val;
|
std::shared_ptr<Module> m_module_val;
|
||||||
|
void* m_user_data_val = nullptr;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
G(TYPE_FLOAT), \
|
G(TYPE_FLOAT), \
|
||||||
G(TYPE_ARRAY), \
|
G(TYPE_ARRAY), \
|
||||||
G(TYPE_STRING), \
|
G(TYPE_STRING), \
|
||||||
G(TYPE_MODULE)
|
G(TYPE_MODULE), \
|
||||||
|
G(TYPE_USER_DATA)
|
||||||
|
|
||||||
|
|
||||||
namespace grino
|
namespace grino
|
||||||
|
|
Loading…
Reference in New Issue