#pragma once #include #include #define index_error_maker(CPP_TYPE, LUA_CLASS_NAME) [](CPP_TYPE & item, sol::object key) \ { \ if (WarningsAsErrors) \ { \ std::string err = "Attempted to read non-existant var \"" + key.as() + "\" from " + LUA_CLASS_NAME; \ throw std::runtime_error(err); \ } \ } template using callbackSetName = std::function; using callbackRemoveName = std::function; // Use the "curiously recurring template pattern" to allow classes to inherit static members and functions. // T is the class that will both derive and instantiate this base class. S is the type used inside GameScriptWhateverInfo // to actually reference the underlying TombEngine struct. template class GameScriptNamedBase { public: static void SetNameCallbacks(callbackSetName cbs, callbackRemoveName cbr) { s_callbackSetName = cbs; s_callbackRemoveName = cbr; } protected: static callbackSetName s_callbackSetName; static callbackRemoveName s_callbackRemoveName; }; // default callbacks template callbackSetName GameScriptNamedBase::s_callbackSetName = [](std::string const& n, S identifier) { std::string err = "\"Set Name\" callback is not set."; if (WarningsAsErrors) { throw std::runtime_error(err); } return false; }; template callbackRemoveName GameScriptNamedBase::s_callbackRemoveName = [](std::string const& n) { std::string err = "\"Remove Name\" callback is not set."; if (WarningsAsErrors) { throw std::runtime_error(err); } return false; };