#include <stdexcept>
+namespace dc {
+
+
template <typename T>
class singleton
{
- static T* ptr;
+ static T* ptr_;
public:
+ struct exception : public std::runtime_error
+ {
+ explicit exception(const std::string& what_arg) :
+ std::runtime_error(what_arg) {}
+ };
+
singleton()
{
- if (!ptr)
+ if (!ptr_)
{
// This hack is from Game Programming Gems.
long long offset = (long long)(T*)1 - (long long)(singleton<T>*)(T*)1;
- ptr = (T*)((long long)this + offset);
+ ptr_ = (T*)((long long)this + offset);
}
}
~singleton()
{
long long offset = (long long)(T*)1 - (long long)(singleton<T>*)(T*)1;
- if (ptr == (T*)((long long)this + offset))
+ if (ptr_ == (T*)((long long)this + offset))
{
- ptr = 0;
+ ptr_ = 0;
}
}
static T& instance()
{
- if (!ptr)
+ if (!ptr_)
{
- throw std::runtime_error("accessing uninstantiated singleton");
+ throw exception("accessing uninstantiated singleton");
}
- return *ptr;
+ return *ptr_;
}
- static T* instancePtr()
+ static T* instance_ptr()
{
- return ptr;
+ return ptr_;
}
};
-template <typename T> T* singleton<T>::ptr = 0;
+template <typename T> T* singleton<T>::ptr_ = 0;
+
+} // namespace dc
#endif // _SINGLETON_HH_
+/** vim: set ts=4 sw=4 tw=80: *************************************************/
+