/* * Copyright 2010 Inalogic® Inc. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License, as * published by the Free Software Foundation; either version 2.1 or 3.0 * of the License. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR * PURPOSE. See the applicable version of the GNU Lesser General Public * License for more details. * * You should have received a copy of both the GNU Lesser General Public * License along with this program. If not, see * * Authored by: Jay Taoko * */ #ifndef NMACROS_H #define NMACROS_H // Disable object copy constructor and assignment operator #define NUX_DISABLE_OBJECT_COPY(Class) \ private: \ Class(const Class &); \ const Class& operator = (const Class &); /// GLOBAL OBJECT /////////////////////////////////////////////////////////////////////// #define NUX_GLOBAL_OBJECT_VARIABLE(Class) Class m_##Class; #define NUX_GLOBAL_OBJECT_INSTANCE(Class) Class::Instance() #define NUX_GLOBAL_OBJECT_REFERENCE(Class) Class::Instance() #define NUX_IMPLEMENT_GLOBAL_OBJECT(Class) Class* Class::pInstance = 0; // Note: Methods that are implicitly generated by the compiler if they are not explicitly defined are: // * Default constructor (C::C()) // * Copy constructor (C::C (const C& rhs)) // * Destructor (C::~C()) // * Assignment operator (C& C::operator= (const C& rhs)) // * Address-of operator (C* C::operator&()) // * Address-of operator (const C* C::operator&() const;) /*! A Global Object with a behavior similar to a singleton. Only one instance of this object can exist. The unique instance is created by a friend class: GlobalInitializer. Only GlobalInitializer can create this instance. example: class GlobalObject { NUX_DECLARE_GLOBAL_OBJECT(GlobalObject, , GlobalSingletonInitializer) public: void foo(void); }; The macro also define a Constructor and Destructor method to be implemented: - void Constructor() - void Destructor() They are replacement for the real Constructor and Destructor. */ #define NUX_DECLARE_GLOBAL_OBJECT(Class, GlobalInitializer) \ NUX_DISABLE_OBJECT_COPY(Class); \ /* Disable address-of operator */ \ /*Class* operator & (); */ \ /*const Class* operator & () const; */ \ friend class GlobalInitializer; \ private: \ static Class* pInstance; \ Class() \ { \ pInstance = this; \ Constructor(); \ } \ virtual ~Class() \ { \ Destructor(); \ } \ \ void Constructor(); \ void Destructor(); \ \ public: \ static bool Ready() \ { \ return pInstance != 0; \ } \ static Class& Instance() \ { \ if(pInstance == 0) \ { \ PrintOutputDebugString(ANSI_TO_TCHAR(__FILE__), __LINE__, \ TEXT("Global object %s has not been initialized"), ANSI_TO_TCHAR(TEXT(#Class))); \ inlDebugBreak(); \ } \ return *pInstance; \ } \ /// Loki Singleton //////////////////////////////////////////////////////////////////////////////////// #define NUX_SINGLETON_CLASS_INTERNAL(ClassImpl) \ private: \ ClassImpl(); \ ~ClassImpl(); \ ClassImpl(const ClassImpl &); \ ClassImpl& operator=(const ClassImpl &); \ ClassImpl* operator &(); \ friend struct Loki::CreateUsingNew; \ friend struct Loki::CreateUsingMalloc; \ friend struct Loki::CreateStatic; #define NUX_SINGLETON_CLASS_DECLARE(ClassImpl, SingletonClass) typedef ::Loki::SingletonHolder SingletonClass; #define NUX_SINGLETON_INSTANCE(SingletonClass) SingletonClass::Instance() // Silence unused parameters: no warning #define NUX_UNUSED(parameter) (void)parameter; #endif // NMACROS_H