00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef PALUDIS_GUARD_PALUDIS_UTIL_DEFERRED_CONSTRUCTION_PTR_HH
00021 #define PALUDIS_GUARD_PALUDIS_UTIL_DEFERRED_CONSTRUCTION_PTR_HH 1
00022
00023 #include <paludis/util/deferred_construction_ptr-fwd.hh>
00024 #include <tr1/functional>
00025
00026 namespace paludis
00027 {
00028 template <typename T_>
00029 class DeferredConstructionPtr
00030 {
00031 private:
00032 mutable T_ _ptr;
00033 std::tr1::function<T_ ()> _f;
00034 mutable bool _done;
00035
00036 public:
00037 DeferredConstructionPtr(const std::tr1::function<T_ ()> & f) :
00038 _ptr(),
00039 _f(f),
00040 _done(false)
00041 {
00042 }
00043
00044 DeferredConstructionPtr(const DeferredConstructionPtr & other) :
00045 _ptr(other._ptr),
00046 _f(other._f),
00047 _done(other._done)
00048 {
00049 }
00050
00051 DeferredConstructionPtr &
00052 operator= (const DeferredConstructionPtr & other)
00053 {
00054 if (this != &other)
00055 {
00056 _ptr = other._ptr;
00057 _f = other._f;
00058 _done = other._done;
00059 }
00060 return *this;
00061 }
00062
00063 T_ operator-> () const
00064 {
00065 if (! _done)
00066 {
00067 _ptr = _f();
00068 _done = true;
00069 }
00070
00071 return _ptr;
00072 }
00073 };
00074 }
00075
00076 #endif