00001 // Copyright NVIDIA Corporation 2002-2004 00002 // TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED 00003 // *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS 00004 // OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY 00005 // AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS 00006 // BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES 00007 // WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, 00008 // BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) 00009 // ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS 00010 // BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 00011 00012 #pragma once 00013 00015 #include "nvsg/nvsgapi.h" // storage-class defines 00016 00017 namespace nvutil { 00018 00020 00022 template <typename T> 00023 class Singleton 00024 { 00025 public: 00027 00029 static T* instance(); 00030 00031 private: 00032 // not permitted 00033 // client must call Singleton<T>::instance() for instantiation 00034 Singleton() {} 00035 Singleton(const Singleton<T>&) {} 00036 ~Singleton() {} 00037 // also not permitted 00038 Singleton<T>& operator=(const Singleton<T>&) {} 00039 00040 private: 00041 static NVSG_API T m_instance; 00042 }; 00043 00044 template <typename T> 00045 inline T* Singleton<T>::instance() 00046 { 00047 return &m_instance; 00048 }; 00049 00050 } // namespace nvutil