Merge pull request #12 from loud-hound/improve_baseholder_typing
compare BaseHolders using typeid
This commit is contained in:
commit
673ca99e36
@ -17,17 +17,16 @@ template<typename StoredType>
|
|||||||
class PrimitiveHolder : public BaseHolder {
|
class PrimitiveHolder : public BaseHolder {
|
||||||
public:
|
public:
|
||||||
PrimitiveHolder(const sol::stack_object& luaObject) noexcept
|
PrimitiveHolder(const sol::stack_object& luaObject) noexcept
|
||||||
: BaseHolder(luaObject.get_type()), data_(luaObject.as<StoredType>()) {}
|
: data_(luaObject.as<StoredType>()) {}
|
||||||
|
|
||||||
PrimitiveHolder(const sol::object& luaObject) noexcept
|
PrimitiveHolder(const sol::object& luaObject) noexcept
|
||||||
: BaseHolder(luaObject.get_type()), data_(luaObject.as<StoredType>()) {}
|
: data_(luaObject.as<StoredType>()) {}
|
||||||
|
|
||||||
PrimitiveHolder(sol::type type, const StoredType& init) noexcept
|
PrimitiveHolder(const StoredType& init) noexcept
|
||||||
: BaseHolder(type), data_(init) {}
|
: data_(init) {}
|
||||||
|
|
||||||
bool rawCompare(const BaseHolder* other) const noexcept final {
|
bool compare(const BaseHolder* other) const noexcept final {
|
||||||
ASSERT(type_ == other->type());
|
return BaseHolder::compare(other) && static_cast<const PrimitiveHolder<StoredType>*>(other)->data_ == data_;
|
||||||
return static_cast<const PrimitiveHolder<StoredType>*>(other)->data_ == data_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t hash() const noexcept final {
|
std::size_t hash() const noexcept final {
|
||||||
@ -45,17 +44,15 @@ private:
|
|||||||
class FunctionHolder : public BaseHolder {
|
class FunctionHolder : public BaseHolder {
|
||||||
public:
|
public:
|
||||||
template<typename SolObject>
|
template<typename SolObject>
|
||||||
FunctionHolder(SolObject luaObject) noexcept
|
FunctionHolder(SolObject luaObject) noexcept {
|
||||||
: BaseHolder(sol::type::function) {
|
|
||||||
sol::state_view lua(luaObject.lua_state());
|
sol::state_view lua(luaObject.lua_state());
|
||||||
sol::function dumper = lua["string"]["dump"];
|
sol::function dumper = lua["string"]["dump"];
|
||||||
|
|
||||||
ASSERT(dumper.valid());
|
ASSERT(dumper.valid());
|
||||||
function_ = dumper(luaObject);
|
function_ = dumper(luaObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rawCompare(const BaseHolder* other) const noexcept final {
|
bool compare(const BaseHolder* other) const noexcept final {
|
||||||
return function_ == static_cast<const FunctionHolder*>(other)->function_;
|
return BaseHolder::compare(other) && static_cast<const FunctionHolder*>(other)->function_ == function_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t hash() const noexcept final {
|
std::size_t hash() const noexcept final {
|
||||||
@ -66,10 +63,8 @@ public:
|
|||||||
sol::state_view lua((lua_State*)state);
|
sol::state_view lua((lua_State*)state);
|
||||||
sol::function loader = lua["loadstring"];
|
sol::function loader = lua["loadstring"];
|
||||||
ASSERT(loader.valid());
|
ASSERT(loader.valid());
|
||||||
|
|
||||||
sol::function result = loader(function_);
|
sol::function result = loader(function_);
|
||||||
ASSERT(result.valid()) << "Unable to restore function!\n"
|
ASSERT(result.valid()) << "Unable to restore function!\n" << "Content:\n" << function_;
|
||||||
<< "Content:\n" << function_;
|
|
||||||
return sol::make_object(state, result);
|
return sol::make_object(state, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +133,7 @@ std::unique_ptr<BaseHolder> fromSolObject(const SolObject& luaObject) {
|
|||||||
// SolTableToShared is used to prevent from infinity recursion
|
// SolTableToShared is used to prevent from infinity recursion
|
||||||
// in recursive tables
|
// in recursive tables
|
||||||
dumpTable(table, luaTable, visited);
|
dumpTable(table, luaTable, visited);
|
||||||
return std::make_unique<PrimitiveHolder<SharedTable*>>(sol::type::userdata, table);
|
return std::make_unique<PrimitiveHolder<SharedTable*>>(table);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
ERROR << "Unable to store object of that type: " << (int)luaObject.get_type() << "\n";
|
ERROR << "Unable to store object of that type: " << (int)luaObject.get_type() << "\n";
|
||||||
@ -152,7 +147,7 @@ StoredObject::StoredObject(StoredObject&& init) noexcept
|
|||||||
: data_(std::move(init.data_)) {}
|
: data_(std::move(init.data_)) {}
|
||||||
|
|
||||||
StoredObject::StoredObject(SharedTable* table) noexcept
|
StoredObject::StoredObject(SharedTable* table) noexcept
|
||||||
: data_(new PrimitiveHolder<SharedTable*>(sol::type::userdata, table)) {
|
: data_(new PrimitiveHolder<SharedTable*>(table)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
StoredObject::StoredObject(const sol::object& object) noexcept
|
StoredObject::StoredObject(const sol::object& object) noexcept
|
||||||
@ -187,7 +182,7 @@ StoredObject& StoredObject::operator=(StoredObject&& o) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool StoredObject::operator==(const StoredObject& o) const noexcept {
|
bool StoredObject::operator==(const StoredObject& o) const noexcept {
|
||||||
if (data_)
|
if (data_ && o.data_)
|
||||||
return data_->compare(o.data_.get());
|
return data_->compare(o.data_.get());
|
||||||
else
|
else
|
||||||
return data_.get() == o.data_.get();
|
return data_.get() == o.data_.get();
|
||||||
|
|||||||
@ -9,25 +9,16 @@ namespace effil {
|
|||||||
|
|
||||||
class BaseHolder {
|
class BaseHolder {
|
||||||
public:
|
public:
|
||||||
BaseHolder(sol::type t) noexcept : type_(t) {}
|
BaseHolder() = default;
|
||||||
virtual ~BaseHolder() = default;
|
virtual ~BaseHolder() = default;
|
||||||
|
|
||||||
sol::type type() const noexcept {
|
virtual bool compare(const BaseHolder* other) const noexcept {
|
||||||
return type_;
|
return typeid(*this) == typeid(*other);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool compare(const BaseHolder* other) const noexcept {
|
|
||||||
ASSERT(other != nullptr);
|
|
||||||
return type_ == other->type_ && rawCompare(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool rawCompare(const BaseHolder* other) const noexcept = 0;
|
|
||||||
virtual std::size_t hash() const noexcept = 0;
|
virtual std::size_t hash() const noexcept = 0;
|
||||||
virtual sol::object unpack(sol::this_state state) const noexcept = 0;
|
virtual sol::object unpack(sol::this_state state) const noexcept = 0;
|
||||||
|
|
||||||
protected:
|
|
||||||
sol::type type_;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BaseHolder(const BaseHolder&) = delete;
|
BaseHolder(const BaseHolder&) = delete;
|
||||||
BaseHolder(BaseHolder&) = delete;
|
BaseHolder(BaseHolder&) = delete;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user