@@ -1,74 +1,29 @@
|
||||
#ifndef FURVM_CONSTANT_HPP
|
||||
#define FURVM_CONSTANT_HPP
|
||||
|
||||
#include "furvm/exceptions.hpp"
|
||||
#include "furvm/fwd.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
#include <string_view>
|
||||
|
||||
namespace furvm {
|
||||
|
||||
enum class constant_t : std::uint8_t {
|
||||
String, /**< String constant. */
|
||||
};
|
||||
|
||||
class constant {
|
||||
public:
|
||||
using string_type = std::string_view; /**< String constant type. */
|
||||
public:
|
||||
/**
|
||||
* @brief Construct a new string constant.
|
||||
*
|
||||
* @param string String.
|
||||
*/
|
||||
constant(string_type string)
|
||||
: m_type(constant_t::String), m_value(string) {}
|
||||
|
||||
~constant() = default;
|
||||
|
||||
/**
|
||||
* @brief Move constructor.
|
||||
*/
|
||||
constant(constant&&) = default;
|
||||
|
||||
/**
|
||||
* @brief Move constructor.
|
||||
*/
|
||||
constant& operator=(constant&&) = default;
|
||||
|
||||
constant(const constant&) = delete;
|
||||
constant& operator=(const constant&) = delete;
|
||||
public:
|
||||
/**
|
||||
* @brief Returns this constant's type.
|
||||
* @see constant_t
|
||||
*
|
||||
* @return The constant type.
|
||||
*/
|
||||
constexpr constant_t type() const { return m_type; }
|
||||
|
||||
/**
|
||||
* @brief Returns this constant's string value.
|
||||
* @throws bad_constant_access if this constant's type is not constant_t::String.
|
||||
*
|
||||
* @return The string value.
|
||||
*/
|
||||
constexpr string_type string() const {
|
||||
require_type(constant_t::String);
|
||||
return m_value.string;
|
||||
}
|
||||
private:
|
||||
void require_type(constant_t type) const {
|
||||
if (m_type != type) throw bad_constant_access();
|
||||
}
|
||||
private:
|
||||
constant_t m_type{};
|
||||
union value {
|
||||
string_type string;
|
||||
|
||||
value(string_type sv)
|
||||
: string(sv) {}
|
||||
} m_value;
|
||||
// TODO: Array constants
|
||||
struct constant {
|
||||
enum type_e {
|
||||
S32 = 0,
|
||||
U32,
|
||||
S64,
|
||||
U64,
|
||||
String,
|
||||
} type = S32;
|
||||
union {
|
||||
std::int32_t s32;
|
||||
std::uint32_t u32;
|
||||
std::int64_t s64;
|
||||
std::uint64_t u64;
|
||||
std::string_view string;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace furvm
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "furlang/utility/hash.hpp"
|
||||
#include "furlang/view.hpp"
|
||||
#include "furvm/constant.hpp"
|
||||
#include "furvm/function.hpp"
|
||||
#include "furvm/fwd.hpp"
|
||||
#include "furvm/handle.hpp"
|
||||
@@ -10,8 +11,6 @@
|
||||
|
||||
#include <functional>
|
||||
#include <istream>
|
||||
#include <limits>
|
||||
#include <optional>
|
||||
#include <ostream>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
@@ -384,6 +383,13 @@ public:
|
||||
if (var >= m_globalVariables.size()) throw std::runtime_error("invalid slot");
|
||||
return m_globalVariables[var];
|
||||
}
|
||||
public:
|
||||
template <typename... Args, typename = std::enable_if_t<std::is_constructible_v<constant, Args...>>>
|
||||
void emplace_constant(Args&&... args) {
|
||||
m_constants.emplace_back(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
const constant& constant_at(constant_index index) const { return m_constants.at(index); }
|
||||
public:
|
||||
template <typename Fwd, typename = std::enable_if_t<std::is_constructible_v<breakpoint, Fwd>>>
|
||||
void set_breakpoint(bytecode_pos pos, Fwd&& breakpoint) {
|
||||
@@ -423,6 +429,8 @@ private:
|
||||
|
||||
std::vector<thing<>> m_globalVariables;
|
||||
|
||||
std::vector<constant> m_constants;
|
||||
|
||||
std::unordered_map<std::string, native_function> m_nativeFunctions;
|
||||
|
||||
std::unordered_map<bytecode_pos, breakpoint> m_breakpoints;
|
||||
|
||||
Reference in New Issue
Block a user