00001 /****************************************************************************** 00002 * Protocce Engine * 00003 * Part of the Crown and Cutlass Project * 00004 * http://www.crownandcutlass.com * 00005 * Copyright (c) 2004 - 2008 David Thulson and Collin Sanford * 00006 * All rights reserved. * 00007 * * 00008 * Redistribution and use in source and binary forms, with or without * 00009 * modification, are permitted provided that the following conditions * 00010 * are met: * 00011 * 1. Redistributions of source code must retain the above copyright * 00012 * notice, this list of conditions and the following disclaimer. * 00013 * 2. Redistributions in binary form must reproduce the above copyright * 00014 * notice, this list of conditions and the following disclaimer in the * 00015 * documentation and/or other materials provided with the distribution. * 00016 * 3. The names of the authors may not be used to endorse or promote products * 00017 * derived from this software without specific prior written permission. * 00018 * * 00019 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * 00020 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * 00021 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * 00022 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * 00023 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * 00024 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * 00025 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * 00026 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 00027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * 00028 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * 00029 * * 00030 ******************************************************************************/ 00031 00032 // Singleton template 00033 00034 #ifndef _PCCE_SINGLETON_H_ 00035 #define _PCCE_SINGLETON_H_ 00036 00037 #include "config.h" 00038 #include <boost/shared_ptr.hpp> 00039 #include <boost/thread/mutex.hpp> 00040 #include "Exception.h" 00041 00042 namespace pcce { 00043 00045 00051 template<class T> class Singleton { 00052 private: 00053 static boost::shared_ptr<T> sT; 00054 static boost::mutex sMutex; 00055 public: 00056 static void Initialize() { 00057 boost::mutex::scoped_lock lock(sMutex); 00058 if (sT) { 00059 PCCE_THROW("Attempt to reinitialize singleton class"); 00060 } 00061 sT.reset(new T()); 00062 } 00063 static void Shutdown() { 00064 boost::mutex::scoped_lock lock(sMutex); 00065 if (!sT) { 00066 PCCE_THROW("Attempt to shutdown unintialized singleton class"); 00067 } 00068 if (sT.use_count() != 1) { 00069 PCCE_THROW("Attempt to shutdown singleton class while still in use"); 00070 } 00071 sT.reset(); 00072 } 00073 static boost::shared_ptr<T> Get() { 00074 boost::mutex::scoped_lock lock(sMutex); 00075 if (!sT) { 00076 PCCE_THROW("Attempt to use unintialized singleton class"); 00077 } 00078 return sT; 00079 } 00080 static bool IsInitialized() { 00081 boost::mutex::scoped_lock lock(sMutex); 00082 return sT; 00083 } 00084 }; 00085 template<class T> boost::shared_ptr<T> Singleton<T>::sT; 00086 template<class T> boost::mutex Singleton<T>::sMutex; 00087 00089 00096 template<class T> class ScopedSingleton { 00097 public: 00099 ScopedSingleton() { 00100 T::Initialize(); 00101 }; 00103 ~ScopedSingleton() { 00104 T::Shutdown(); 00105 }; 00106 }; 00107 00108 } 00109 00110 #endif
1.5.5