/* * Copyright (c) 2013-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include #include #include #include #include namespace Swift { template class GenericLuaElementConvertor : public LuaElementConvertor { public: GenericLuaElementConvertor(const std::string& type) : type(type) { } virtual ~GenericLuaElementConvertor() override {} virtual std::shared_ptr convertFromLua(lua_State* L, int index, const std::string& payloadType) override { if (payloadType == type) { Lua::checkType(L, index, LUA_TTABLE); lua_pushvalue(L, index); std::shared_ptr result = doConvertFromLua(L); lua_pop(L, 1); return result; } return std::shared_ptr(); } virtual boost::optional convertToLua( lua_State* L, std::shared_ptr payload) override { if (std::shared_ptr actualPayload = std::dynamic_pointer_cast(payload)) { doConvertToLua(L, actualPayload); assert(lua_type(L, -1) == LUA_TTABLE); return type; } return NO_RESULT; } protected: virtual std::shared_ptr doConvertFromLua(lua_State*) = 0; virtual void doConvertToLua(lua_State*, std::shared_ptr) = 0; private: std::string type; }; }