Sirikata
|
00001 /* Sirikata Utilities -- Sirikata Synchronization Utilities 00002 * SelfWeakPtr.hpp 00003 * 00004 * Copyright (c) 2009, Daniel Reiter Horn 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions are 00009 * met: 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in 00014 * the documentation and/or other materials provided with the 00015 * distribution. 00016 * * Neither the name of Sirikata nor the names of its contributors may 00017 * be used to endorse or promote products derived from this software 00018 * without specific prior written permission. 00019 * 00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 00021 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00022 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00023 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 00024 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00026 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 */ 00032 00033 #ifndef SIRIKATA_SelfWeakPtr_HPP__ 00034 #define SIRIKATA_SelfWeakPtr_HPP__ 00035 00036 namespace Sirikata { 00037 template <class T> 00038 class SelfWeakPtr { 00039 std::tr1::weak_ptr<T> mWeakPtr; 00040 protected: 00041 SelfWeakPtr() {} 00042 00043 ~SelfWeakPtr() {} 00044 00045 template <class U> static std::tr1::shared_ptr<U> internalConstruct(U * u){ 00046 std::tr1::shared_ptr<U> retval(u); 00047 std::tr1::shared_ptr<T> sharedPtr(retval); 00048 sharedPtr->mWeakPtr=sharedPtr; 00049 return retval; 00050 } 00051 00052 public: 00053 const std::tr1::weak_ptr<T>& getWeakPtr() const { 00054 return mWeakPtr; 00055 } 00056 std::tr1::shared_ptr<T> getSharedPtr() const { 00057 std::tr1::shared_ptr<T> retval(getWeakPtr()); 00058 return retval; 00059 } 00060 template <class U> 00061 static std::tr1::shared_ptr<U>construct(){ 00062 return internalConstruct(new U()); 00063 } 00064 template <class U,class A> 00065 static std::tr1::shared_ptr<U>construct(A a){ 00066 return internalConstruct(new U(a)); 00067 } 00068 template <class U,class A,class B> 00069 static std::tr1::shared_ptr<U>construct(A a, B b){ 00070 return internalConstruct(new U(a,b)); 00071 } 00072 template <class U,class A,class B,class C> 00073 static std::tr1::shared_ptr<U>construct(A a, B b, C c){ 00074 return internalConstruct(new U(a,b,c)); 00075 } 00076 template <class U,class A,class B,class C,class D> 00077 static std::tr1::shared_ptr<U>construct(A a, B b, C c, D d){ 00078 return internalConstruct(new U(a,b,c,d)); 00079 } 00080 template <class U,class A,class B,class C,class D,class E> 00081 static std::tr1::shared_ptr<U>construct(A a,B b,C c,D d,E e){ 00082 return internalConstruct(new U(a,b,c,d,e)); 00083 } 00084 template <class U,class A,class B,class C,class D,class E, class F> 00085 static std::tr1::shared_ptr<U>construct(A a,B b,C c,D d,E e, F f){ 00086 return internalConstruct(new U(a,b,c,d,e,f)); 00087 } 00088 // add more if you need to, keptain... 00089 }; 00090 00091 } 00092 00093 #endif