nf7/core/luajit/value.hh

64 lines
1.4 KiB
C++

// No copyright
#pragma once
#include <cassert>
#include <cstdint>
#include <memory>
#include <span>
#include <string>
#include <string_view>
#include <vector>
#include <lua.hpp>
#include "iface/common/future.hh"
#include "iface/common/leak_detector.hh"
#include "iface/common/value.hh"
#include "iface/env.hh"
namespace nf7::core::luajit {
class Context;
class TaskContext;
class Value final : public nf7::Value::Data, public LeakDetector<Value> {
public:
static std::shared_ptr<Value> MakeFunction(
TaskContext&,
std::span<const uint8_t>,
const char* name = "");
static Future<std::shared_ptr<Value>> MakeFunction(
Env&,
std::vector<uint8_t>&&,
std::string name = "") noexcept;
public:
Value() = delete;
Value(const std::shared_ptr<Context>& ctx, int index) noexcept
: ctx_(ctx), index_(index) {
assert(nullptr != ctx_);
}
~Value() noexcept override;
public:
Value(const Value&) = delete;
Value(Value&&) = delete;
Value& operator=(const Value&) = delete;
Value& operator=(Value&&) = delete;
void Push(lua_State* L) const noexcept {
lua_rawgeti(L, LUA_REGISTRYINDEX, index_);
}
public:
const std::shared_ptr<Context>& context() const noexcept { return ctx_; }
int index() const noexcept { return index_; }
private:
const std::shared_ptr<Context> ctx_;
const int index_;
};
} // namespace nf7::core::luajit