Merge pull request #12 from loud-hound/improve_baseholder_typing

compare BaseHolders using typeid
This commit is contained in:
Ilia 2017-01-24 23:52:24 +03:00 committed by GitHub
commit 673ca99e36
2 changed files with 16 additions and 30 deletions

View File

@ -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();

View File

@ -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;