diff --git a/source/gui/GUIutil.cpp b/source/gui/GUIutil.cpp index e9f8c879c7..1bc9b54b3c 100755 --- a/source/gui/GUIutil.cpp +++ b/source/gui/GUIutil.cpp @@ -367,3 +367,25 @@ void CInternalCGUIAccessorBase::HandleMessage(IGUIObject *pObject, const SGUIMes { pObject->HandleMessage(message); } + + +//#ifndef NDEBUG +#define TYPE(T) \ + template<> void CheckType(const IGUIObject* obj, const CStr& setting) { \ + if (((IGUIObject*)obj)->m_Settings[setting].m_Type != GUIST_##T) \ + { \ + debug_warn("EXCESSIVELY FATAL ERROR: Inconsistent types in GUI"); \ + throw "EXCESSIVELY FATAL ERROR: Inconsistent types in GUI"; /* TODO: better reporting */ \ + } \ + } +TYPE(bool) +TYPE(int) +TYPE(float) +TYPE(CClientArea) +TYPE(CStr) +TYPE(CColor) +TYPE(CGUIString) +TYPE(EAlign) +TYPE(EVAlign) +#undef TYPE +//#endif // #ifndef NDEBUG diff --git a/source/gui/GUIutil.h b/source/gui/GUIutil.h index bbe230a203..b50bdbcaec 100755 --- a/source/gui/GUIutil.h +++ b/source/gui/GUIutil.h @@ -152,6 +152,12 @@ protected: }; +//#ifndef NDEBUG +// Used to ensure type-safety, sort of +template void CheckType(const IGUIObject* obj, const CStr& setting); +//#endif + + /** * @author Gustav Larsson * @@ -188,7 +194,9 @@ public: if (!pObject->m_Settings.find(Setting)->second.m_pSetting) return PS_FAIL; - // Set value + CheckType(pObject, Setting); + + // Get value Value = *(T*)pObject->m_Settings.find(Setting)->second.m_pSetting; return PS_OK; @@ -212,6 +220,8 @@ public: if (!pObject->SettingExists(Setting)) return PS_SETTING_FAIL; + CheckType(pObject, Setting); + // Set value *(T*)pObject->m_Settings[Setting].m_pSetting = Value;