Sirikata
libcore/include/sirikata/core/util/SelfWeakPtr.hpp
Go to the documentation of this file.
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