//*********************************************************** // Copyright © 2003-2008 Alexander S. Kiselev, Valentin Pavlyuchenko // // This file is part of Boltun. // // Boltun is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // Boltun is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Boltun. If not, see . // //*********************************************************** #ifndef _CONFIG_H #define _CONFIG_H class BoltunConfig; template class Property { public: typedef const T(__thiscall BaseClass::*Getter)(); typedef const T(__thiscall BaseClass::*Setter)(const T); private: const Getter getter; const Setter setter; BaseClass* owner; bool cacheValid; T cached; Property& operator=(const Property&); public: Property(Getter g, Setter s) :getter(g), setter(s), cacheValid(false) { } void SetOwner(BaseClass* o) { owner = o; } inline operator const T() { if (cacheValid) return cached; cached = (owner->*getter)(); cacheValid = true; return cached; } inline const T operator= (const T& value) { cacheValid = true; return (owner->*setter)(cached = value); } }; template class PtrProperty { public: typedef const T* (__thiscall BaseClass::*Getter)(); typedef const T* (__thiscall BaseClass::*Setter)(const T*); private: const Getter getter; const Setter setter; BaseClass* owner; bool cacheValid; const T* cached; PtrProperty& operator=(const PtrProperty&); public: PtrProperty(Getter g, Setter s) :getter(g), setter(s), cacheValid(false), cached(NULL) { } ~PtrProperty() { delete cached; } void SetOwner(BaseClass* o) { owner = o; } inline operator const T*() { if (cacheValid) return cached; cached = (owner->*getter)(); cacheValid = true; return cached; } inline const T* operator= (const T* value) { cacheValid = true; delete cached; cached = (owner->*setter)(value); return cached; } }; class _BoltunConfigInit; #define BUILDDEFETTERS(x, typ) \ const typ Get##x(); \ const typ Set##x(const typ value); class BoltunConfig { BUILDDEFETTERS(TalkWithEverybody, bool); BUILDDEFETTERS(TalkWithNotInList, bool); BUILDDEFETTERS(TalkWarnContacts, bool); BUILDDEFETTERS(TalkEveryoneWhileAway, bool); BUILDDEFETTERS(MarkAsRead, bool); BUILDDEFETTERS(AnswerPauseTime, int); BUILDDEFETTERS(AnswerThinkTime, int); BUILDDEFETTERS(PauseDepends, bool); BUILDDEFETTERS(PauseRandom, bool); BUILDDEFETTERS(WarnText, TCHAR*); BUILDDEFETTERS(MindFileName, TCHAR*); BUILDDEFETTERS(EngineStaySilent, bool); BUILDDEFETTERS(EngineMakeLowerCase, bool); BUILDDEFETTERS(EngineUnderstandAlways, bool); BoltunConfig(); ~BoltunConfig(); friend class _BoltunConfigInit; public: Property TalkWithEverybody; Property TalkWithNotInList; Property TalkWarnContacts; Property TalkEveryoneWhileAway; Property MarkAsRead; Property AnswerPauseTime; Property AnswerThinkTime; Property PauseDepends; Property PauseRandom; PtrProperty WarnText; PtrProperty MindFileName; Property EngineStaySilent; Property EngineMakeLowerCase; Property EngineUnderstandAlways; }; extern BoltunConfig &Config; #endif /* _CONFIG_H */