/* * Copyright (c) 2013 Remko Tronçon * Licensed under the GNU General Public License. * See the COPYING file for more information. */ #pragma once #include #include #include #include #include #include namespace Swift { template class GenericLuaElementConvertor : public LuaElementConvertor { public: GenericLuaElementConvertor(const std::string& type) : type(type) { } virtual ~GenericLuaElementConvertor() {} virtual boost::shared_ptr convertFromLua(lua_State* L, int index, const std::string& payloadType) SWIFTEN_OVERRIDE { if (payloadType == type) { Lua::checkType(L, index, LUA_TTABLE); lua_pushvalue(L, index); boost::shared_ptr result = doConvertFromLua(L); lua_pop(L, 1); return result; } return boost::shared_ptr(); } virtual boost::optional convertToLua( lua_State* L, boost::shared_ptr payload) SWIFTEN_OVERRIDE { if (boost::shared_ptr actualPayload = boost::dynamic_pointer_cast(payload)) { doConvertToLua(L, actualPayload); assert(lua_type(L, -1) == LUA_TTABLE); return type; } return NO_RESULT; } protected: virtual boost::shared_ptr doConvertFromLua(lua_State*) = 0; virtual void doConvertToLua(lua_State*, boost::shared_ptr) = 0; private: std::string type; }; }