11#ifndef ARK_VM_VALUE_HPP
12#define ARK_VM_VALUE_HPP
74struct std::hash<
Ark::ValueType>
78 return std::hash<std::underlying_type_t<Ark::ValueType>> {}(
static_cast<std::underlying_type_t<Ark::ValueType>
>(s));
109 std::shared_ptr<Dict_t>,
136 template <typename T>
138 m_type(type), m_value(value)
141 explicit Value(
int value)
noexcept;
142 explicit Value(
double value)
noexcept;
143 explicit Value(
const String_t& value)
noexcept;
144 explicit Value(
const char* value)
noexcept;
147 explicit Value(List_t&& value)
noexcept;
150 explicit Value(Dict_t&& value)
noexcept;
151 explicit Value(Ref_t ref)
noexcept;
156 return m_type == ValueType::PageAddr || m_type == ValueType::Closure || m_type == ValueType::CProc ||
157 (m_type == ValueType::Reference && reference()->isFunction());
161 return m_type == ValueType::List || m_type == ValueType::String;
166 [[nodiscard]]
const String_t&
string()
const {
return std::get<String_t>(m_value); }
171 [[nodiscard]]
List_t&
list() {
return std::get<List_t>(m_value); }
176 [[nodiscard]]
const Dict_t&
dict()
const {
return *std::get<std::shared_ptr<Dict_t>>(m_value); }
177 [[nodiscard]]
Dict_t&
dictRef() {
return *std::get<std::shared_ptr<Dict_t>>(m_value); }
188 void push_back(
const Value& value);
195 void push_back(
Value&& value);
197 std::string toString(
VM& vm,
bool show_as_code =
false) const noexcept;
211 [[nodiscard]] constexpr uint8_t typeNum() const noexcept {
return static_cast<uint8_t
>(m_type); }
213 [[nodiscard]]
const Procedure&
proc()
const {
return std::get<Procedure>(m_value); }
220 if (A.m_type != B.m_type)
222 return A.m_value < B.m_value;
235 const auto index =
static_cast<std::underlying_type_t<Ark::ValueType>
>(type);
241struct std::hash<
std::vector<Ark::Value>>
243 [[nodiscard]] std::size_t
operator()(
const std::vector<Ark::Value>& s)
const noexcept
245 return std::hash<const Ark::Value*> {}(s.data());
250struct std::hash<
std::shared_ptr<Ark::Value::Dict_t>>
252 [[nodiscard]] std::size_t
operator()(
const std::shared_ptr<Ark::Value::Dict_t>& s)
const noexcept
254 return std::hash<const Ark::Value::Dict_t*> {}(s.get());
259struct std::hash<
Ark::Value>
263 return std::hash<Ark::Value::Value_t> {}(s.m_value);
Subtype of the value type, handling closures.
Wrapper object for user-defined functions.
Subtype of the value, capable of handling any C++ type.
This class is just a helper to.
Storage class to hold custom functions.
A class to be use C++ objects in ArkScript.
The ArkScript virtual machine, executing ArkScript bytecode.
const Dict_t & dict() const
const String_t & string() const
const List_t & constList() const
internal::Closure & refClosure()
const Procedure & proc() const
const internal::Closure & closure() const
bool isFunction() const noexcept
ValueType valueType() const noexcept
const UserType & usertype() const
bool isIndexable() const noexcept
std::variant< Number_t, String_t, internal::PageAddr_t, Procedure, internal::Closure, UserType, List_t, std::shared_ptr< Dict_t >, Ref_t > Value_t
internal::PageAddr_t pageAddr() const
std::vector< Value > List_t
bool operator<(const Namespace &, const Namespace &)
constexpr std::array types_to_str
const auto False
ArkScript False value.
const auto Nil
ArkScript Nil value.
const auto True
ArkScript True value.
bool operator!=(const Value &A, const Value &B) noexcept
@ Garbage
Used to signal a value was used and can/should be collected and removed from the stack.
@ Any
Used only for typechecking.
std::string to_string(const Ark::ValueType type) noexcept
std::size_t operator()(const Ark::ValueType &s) const noexcept
std::size_t operator()(const Ark::Value &s) const noexcept
std::size_t operator()(const std::shared_ptr< Ark::Value::Dict_t > &s) const noexcept
std::size_t operator()(const std::vector< Ark::Value > &s) const noexcept