summaryrefslogtreecommitdiff
path: root/shared/loki/ScopeGuard.h
diff options
context:
space:
mode:
Diffstat (limited to 'shared/loki/ScopeGuard.h')
-rw-r--r--shared/loki/ScopeGuard.h1220
1 files changed, 610 insertions, 610 deletions
diff --git a/shared/loki/ScopeGuard.h b/shared/loki/ScopeGuard.h
index b530068d..0b5445f5 100644
--- a/shared/loki/ScopeGuard.h
+++ b/shared/loki/ScopeGuard.h
@@ -4,12 +4,12 @@
// Copyright (c) 2000 Petru Marginean
// Copyright (c) 2005 Joshua Lehrer
//
-// Permission to use, copy, modify, distribute and sell this software for any
-// purpose is hereby granted without fee, provided that the above copyright
-// notice appear in all copies and that both that copyright notice and this
+// Permission to use, copy, modify, distribute and sell this software for any
+// purpose is hereby granted without fee, provided that the above copyright
+// notice appear in all copies and that both that copyright notice and this
// permission notice appear in supporting documentation.
-// The author makes no representations about the
-// suitability of this software for any purpose. It is provided "as is"
+// The author makes no representations about the
+// suitability of this software for any purpose. It is provided "as is"
// without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////
#ifndef LOKI_SCOPEGUARD_INC_
@@ -25,634 +25,634 @@
namespace Loki
{
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ScopeGuardImplBase
- /// \ingroup ExceptionGroup
- ///
- /// Base class used by all ScopeGuard implementations. All commonly used
- /// functions are in this class (e.g. - Dismiss and SafeExecute).
- ///
- /// See Andrei's and Petru Marginean's CUJ article
- /// http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/alexandr.htm
- ///
- /// Changes to the original code by Joshua Lehrer:
- /// http://www.lehrerfamily.com/scopeguard.html
- ////////////////////////////////////////////////////////////////
-
- class ScopeGuardImplBase
- {
- /// Copy-assignment operator is not implemented and private.
- ScopeGuardImplBase& operator =(const ScopeGuardImplBase&);
-
- protected:
-
- ~ScopeGuardImplBase()
- {}
-
- /// Copy-constructor takes over responsibility from other ScopeGuard.
- ScopeGuardImplBase(const ScopeGuardImplBase& other) throw()
- : dismissed_(other.dismissed_)
- {
- other.Dismiss();
- }
-
- template <typename J>
- static void SafeExecute(J& j) throw()
- {
- if (!j.dismissed_)
- try
- {
- j.Execute();
- }
- catch(...)
+////////////////////////////////////////////////////////////////
+///
+/// \class ScopeGuardImplBase
+/// \ingroup ExceptionGroup
+///
+/// Base class used by all ScopeGuard implementations. All commonly used
+/// functions are in this class (e.g. - Dismiss and SafeExecute).
+///
+/// See Andrei's and Petru Marginean's CUJ article
+/// http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/alexandr.htm
+///
+/// Changes to the original code by Joshua Lehrer:
+/// http://www.lehrerfamily.com/scopeguard.html
+////////////////////////////////////////////////////////////////
+
+class ScopeGuardImplBase
+{
+ /// Copy-assignment operator is not implemented and private.
+ ScopeGuardImplBase& operator =(const ScopeGuardImplBase&);
+
+protected:
+
+ ~ScopeGuardImplBase()
+ {}
+
+ /// Copy-constructor takes over responsibility from other ScopeGuard.
+ ScopeGuardImplBase(const ScopeGuardImplBase& other) throw()
+ : dismissed_(other.dismissed_)
+ {
+ other.Dismiss();
+ }
+
+ template <typename J>
+ static void SafeExecute(J& j) throw()
+ {
+ if (!j.dismissed_)
+ try
+ {
+ j.Execute();
+ }
+ catch(...)
{}
- }
-
- mutable bool dismissed_;
-
- public:
- ScopeGuardImplBase() throw() : dismissed_(false)
- {}
-
- void Dismiss() const throw()
- {
- dismissed_ = true;
- }
- };
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \typedef typedef const ScopeGuardImplBase& ScopeGuard
- /// \ingroup ExceptionGroup
- ///
- ////////////////////////////////////////////////////////////////
-
- typedef const ScopeGuardImplBase& ScopeGuard;
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ScopeGuardImpl0
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a standalone function or class static function
- /// with no parameters. ScopeGuard ignores any value returned from the
- /// call within the Execute function.
- ///
- /// This class has a single standalone helper function, MakeGuard which
- /// creates and returns a ScopeGuard.
- ///
- ////////////////////////////////////////////////////////////////
-
- template <typename F>
- class ScopeGuardImpl0 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl0<F> MakeGuard(F fun)
- {
- return ScopeGuardImpl0<F>(fun);
- }
-
- ~ScopeGuardImpl0() throw()
- {
- SafeExecute(*this);
- }
-
- void Execute()
- {
- fun_();
- }
-
- protected:
- ScopeGuardImpl0(F fun) : fun_(fun)
- {}
-
- F fun_;
- };
-
- template <typename F>
- inline ScopeGuardImpl0<F> MakeGuard(F fun)
- {
- return ScopeGuardImpl0<F>::MakeGuard(fun);
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ScopeGuardImpl1
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a standalone function or class static function
- /// with one parameter. Each parameter is copied by value - use
- /// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
- /// any value returned from the call within the Execute function.
- ///
- /// This class has a single standalone helper function, MakeGuard which
- /// creates and returns a ScopeGuard.
- ///
- ////////////////////////////////////////////////////////////////
-
- template <typename F, typename P1>
- class ScopeGuardImpl1 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
- {
- return ScopeGuardImpl1<F, P1>(fun, p1);
- }
-
- ~ScopeGuardImpl1() throw()
- {
- SafeExecute(*this);
- }
-
- void Execute()
- {
- fun_(p1_);
- }
-
- protected:
- ScopeGuardImpl1(F fun, P1 p1) : fun_(fun), p1_(p1)
- {}
-
- F fun_;
- const P1 p1_;
- };
-
- template <typename F, typename P1>
- inline ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
- {
- return ScopeGuardImpl1<F, P1>::MakeGuard(fun, p1);
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ScopeGuardImpl2
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a standalone function or class static function
- /// with two parameters. Each parameter is copied by value - use
- /// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
- /// any value returned from the call within the Execute function.
- ///
- /// This class has a single standalone helper function, MakeGuard which
- /// creates and returns a ScopeGuard.
- ///
- ////////////////////////////////////////////////////////////////
-
- template <typename F, typename P1, typename P2>
- class ScopeGuardImpl2: public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
- {
- return ScopeGuardImpl2<F, P1, P2>(fun, p1, p2);
- }
-
- ~ScopeGuardImpl2() throw()
- {
- SafeExecute(*this);
- }
-
- void Execute()
- {
- fun_(p1_, p2_);
- }
-
- protected:
- ScopeGuardImpl2(F fun, P1 p1, P2 p2) : fun_(fun), p1_(p1), p2_(p2)
- {}
-
- F fun_;
- const P1 p1_;
- const P2 p2_;
- };
-
- template <typename F, typename P1, typename P2>
- inline ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
- {
- return ScopeGuardImpl2<F, P1, P2>::MakeGuard(fun, p1, p2);
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ScopeGuardImpl3
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a standalone function or class static function
- /// with three parameters. Each parameter is copied by value - use
- /// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
- /// any value returned from the call within the Execute function.
- ///
- /// This class has a single standalone helper function, MakeGuard which
- /// creates and returns a ScopeGuard.
- ///
- ////////////////////////////////////////////////////////////////
-
- template <typename F, typename P1, typename P2, typename P3>
- class ScopeGuardImpl3 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
- {
- return ScopeGuardImpl3<F, P1, P2, P3>(fun, p1, p2, p3);
- }
-
- ~ScopeGuardImpl3() throw()
- {
- SafeExecute(*this);
- }
-
- void Execute()
- {
- fun_(p1_, p2_, p3_);
- }
-
- protected:
- ScopeGuardImpl3(F fun, P1 p1, P2 p2, P3 p3) : fun_(fun), p1_(p1), p2_(p2), p3_(p3)
- {}
-
- F fun_;
- const P1 p1_;
- const P2 p2_;
- const P3 p3_;
- };
-
- template <typename F, typename P1, typename P2, typename P3>
- inline ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
- {
- return ScopeGuardImpl3<F, P1, P2, P3>::MakeGuard(fun, p1, p2, p3);
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ScopeGuardImpl4
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a standalone function or class static function
- /// with four parameters. Each parameter is copied by value - use
- /// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
- /// any value returned from the call within the Execute function.
- ///
- /// This class has a single standalone helper function, MakeGuard which
- /// creates and returns a ScopeGuard.
- ///
- ////////////////////////////////////////////////////////////////
-
- template < typename F, typename P1, typename P2, typename P3, typename P4 >
- class ScopeGuardImpl4 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl4< F, P1, P2, P3, P4 > MakeGuard(
- F fun, P1 p1, P2 p2, P3 p3, P4 p4 )
- {
- return ScopeGuardImpl4< F, P1, P2, P3, P4 >( fun, p1, p2, p3, p4 );
- }
-
- ~ScopeGuardImpl4() throw()
- {
- SafeExecute( *this );
- }
-
- void Execute()
- {
- fun_( p1_, p2_, p3_, p4_ );
- }
-
- protected:
- ScopeGuardImpl4( F fun, P1 p1, P2 p2, P3 p3, P4 p4 ) :
- fun_( fun ), p1_( p1 ), p2_( p2 ), p3_( p3 ), p4_( p4 )
- {}
-
- F fun_;
- const P1 p1_;
- const P2 p2_;
- const P3 p3_;
- const P4 p4_;
- };
-
- template < typename F, typename P1, typename P2, typename P3, typename P4 >
- inline ScopeGuardImpl4< F, P1, P2, P3, P4 > MakeGuard( F fun, P1 p1, P2 p2, P3 p3, P4 p4 )
- {
- return ScopeGuardImpl4< F, P1, P2, P3, P4 >::MakeGuard( fun, p1, p2, p3, p4 );
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ScopeGuardImpl5
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a standalone function or class static function
- /// with five parameters. Each parameter is copied by value - use
- /// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
- /// any value returned from the call within the Execute function.
- ///
- /// This class has a single standalone helper function, MakeGuard which
- /// creates and returns a ScopeGuard.
- ///
- ////////////////////////////////////////////////////////////////
-
- template < typename F, typename P1, typename P2, typename P3, typename P4, typename P5 >
- class ScopeGuardImpl5 : public ScopeGuardImplBase
- {
- public:
- static ScopeGuardImpl5< F, P1, P2, P3, P4, P5 > MakeGuard(
- F fun, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 )
- {
- return ScopeGuardImpl5< F, P1, P2, P3, P4, P5 >( fun, p1, p2, p3, p4, p5 );
- }
-
- ~ScopeGuardImpl5() throw()
- {
- SafeExecute( *this );
- }
-
- void Execute()
- {
- fun_( p1_, p2_, p3_, p4_, p5_ );
- }
-
- protected:
- ScopeGuardImpl5( F fun, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 ) :
- fun_( fun ), p1_( p1 ), p2_( p2 ), p3_( p3 ), p4_( p4 ), p5_( p5 )
- {}
-
- F fun_;
- const P1 p1_;
- const P2 p2_;
- const P3 p3_;
- const P4 p4_;
- const P5 p5_;
- };
-
- template < typename F, typename P1, typename P2, typename P3, typename P4, typename P5 >
- inline ScopeGuardImpl5< F, P1, P2, P3, P4, P5 > MakeGuard( F fun, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 )
- {
- return ScopeGuardImpl5< F, P1, P2, P3, P4, P5 >::MakeGuard( fun, p1, p2, p3, p4, p5 );
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ObjScopeGuardImpl0
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a class per-instance member function with no
- /// parameters. ScopeGuard ignores any value returned from the call within
- /// the Execute function.
- ///
- /// This class has 3 standalone helper functions which create a ScopeGuard.
- /// One is MakeObjGuard, which is deprecated but provided for older code.
- /// The other two are MakeGuard overloads, one which takes a pointer to an
- /// object, and the other which takes a reference.
- ///
- ////////////////////////////////////////////////////////////////
-
- template <class Obj, typename MemFun>
- class ObjScopeGuardImpl0 : public ScopeGuardImplBase
- {
- public:
- static ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
- {
- return ObjScopeGuardImpl0<Obj, MemFun>(obj, memFun);
- }
-
- ~ObjScopeGuardImpl0() throw()
- {
- SafeExecute(*this);
- }
-
- void Execute()
- {
- (obj_.*memFun_)();
- }
-
- protected:
- ObjScopeGuardImpl0(Obj& obj, MemFun memFun) : obj_(obj), memFun_(memFun)
- {}
-
- Obj& obj_;
- MemFun memFun_;
- };
-
- template <class Obj, typename MemFun>
- inline ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
- {
- return ObjScopeGuardImpl0<Obj, MemFun>::MakeObjGuard(obj, memFun);
- }
-
- template <typename Ret, class Obj1, class Obj2>
- inline ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1 &obj)
- {
- return ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()>::MakeObjGuard(obj,memFun);
- }
-
- template <typename Ret, class Obj1, class Obj2>
- inline ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1 *obj)
- {
- return ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()>::MakeObjGuard(*obj,memFun);
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ObjScopeGuardImpl1
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a class per-instance member function with one
- /// parameter. The parameter is copied by value - use ::Loki::ByRef if you
- /// must use a reference instead. ScopeGuard ignores any value returned
- /// from the call within the Execute function.
- ///
- /// This class has 3 standalone helper functions which create a ScopeGuard.
- /// One is MakeObjGuard, which is deprecated but provided for older code.
- /// The other two are MakeGuard overloads, one which takes a pointer to an
- /// object, and the other which takes a reference.
- ///
- ////////////////////////////////////////////////////////////////
-
- template <class Obj, typename MemFun, typename P1>
- class ObjScopeGuardImpl1 : public ScopeGuardImplBase
- {
- public:
- static ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
- {
- return ObjScopeGuardImpl1<Obj, MemFun, P1>(obj, memFun, p1);
- }
+ }
+
+ mutable bool dismissed_;
+
+public:
+ ScopeGuardImplBase() throw() : dismissed_(false)
+ {}
+
+ void Dismiss() const throw()
+ {
+ dismissed_ = true;
+ }
+};
+
+////////////////////////////////////////////////////////////////
+///
+/// \typedef typedef const ScopeGuardImplBase& ScopeGuard
+/// \ingroup ExceptionGroup
+///
+////////////////////////////////////////////////////////////////
+
+typedef const ScopeGuardImplBase& ScopeGuard;
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ScopeGuardImpl0
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a standalone function or class static function
+/// with no parameters. ScopeGuard ignores any value returned from the
+/// call within the Execute function.
+///
+/// This class has a single standalone helper function, MakeGuard which
+/// creates and returns a ScopeGuard.
+///
+////////////////////////////////////////////////////////////////
+
+template <typename F>
+class ScopeGuardImpl0 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl0<F> MakeGuard(F fun)
+ {
+ return ScopeGuardImpl0<F>(fun);
+ }
- ~ObjScopeGuardImpl1() throw()
- {
- SafeExecute(*this);
- }
+ ~ScopeGuardImpl0() throw()
+ {
+ SafeExecute(*this);
+ }
+
+ void Execute()
+ {
+ fun_();
+ }
- void Execute()
- {
- (obj_.*memFun_)(p1_);
- }
+protected:
+ ScopeGuardImpl0(F fun) : fun_(fun)
+ {}
- protected:
- ObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1) : obj_(obj), memFun_(memFun), p1_(p1)
- {}
-
- Obj& obj_;
- MemFun memFun_;
- const P1 p1_;
- };
-
- template <class Obj, typename MemFun, typename P1>
- inline ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
- {
- return ObjScopeGuardImpl1<Obj, MemFun, P1>::MakeObjGuard(obj, memFun, p1);
- }
-
- template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b>
- inline ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1 &obj, P1b p1)
+ F fun_;
+};
+
+template <typename F>
+inline ScopeGuardImpl0<F> MakeGuard(F fun)
+{
+ return ScopeGuardImpl0<F>::MakeGuard(fun);
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ScopeGuardImpl1
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a standalone function or class static function
+/// with one parameter. Each parameter is copied by value - use
+/// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
+/// any value returned from the call within the Execute function.
+///
+/// This class has a single standalone helper function, MakeGuard which
+/// creates and returns a ScopeGuard.
+///
+////////////////////////////////////////////////////////////////
+
+template <typename F, typename P1>
+class ScopeGuardImpl1 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
{
- return ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b>::MakeObjGuard(obj,memFun,p1);
- }
-
- template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b>
- inline ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1 *obj, P1b p1)
- {
- return ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b>::MakeObjGuard(*obj,memFun,p1);
- }
-
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ObjScopeGuardImpl2
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a class per-instance member function with two
- /// parameters. Each parameter is copied by value - use ::Loki::ByRef if you
- /// must use a reference instead. ScopeGuard ignores any value returned
- /// from the call within the Execute function.
- ///
- /// This class has 3 standalone helper functions which create a ScopeGuard.
- /// One is MakeObjGuard, which is deprecated but provided for older code.
- /// The other two are MakeGuard overloads, one which takes a pointer to an
- /// object, and the other which takes a reference.
- ///
- ////////////////////////////////////////////////////////////////
-
- template <class Obj, typename MemFun, typename P1, typename P2>
- class ObjScopeGuardImpl2 : public ScopeGuardImplBase
- {
- public:
- static ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
- {
- return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>(obj, memFun, p1, p2);
- }
-
- ~ObjScopeGuardImpl2() throw()
- {
- SafeExecute(*this);
- }
-
- void Execute()
- {
- (obj_.*memFun_)(p1_, p2_);
- }
-
- protected:
- ObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2) : obj_(obj), memFun_(memFun), p1_(p1), p2_(p2)
- {}
-
- Obj& obj_;
- MemFun memFun_;
- const P1 p1_;
- const P2 p2_;
- };
-
- template <class Obj, typename MemFun, typename P1, typename P2>
- inline ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
- {
- return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>::MakeObjGuard(obj, memFun, p1, p2);
- }
+ return ScopeGuardImpl1<F, P1>(fun, p1);
+ }
- template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b, typename P2a, typename P2b>
- inline ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b> MakeGuard(Ret(Obj2::*memFun)(P1a,P2a), Obj1 &obj, P1b p1, P2b p2)
- {
- return ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b>::MakeObjGuard(obj,memFun,p1,p2);
+ ~ScopeGuardImpl1() throw()
+ {
+ SafeExecute(*this);
}
-
- template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b, typename P2a, typename P2b>
- inline ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b> MakeGuard(Ret(Obj2::*memFun)(P1a,P2a), Obj1 *obj, P1b p1, P2b p2)
+
+ void Execute()
{
- return ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b>::MakeObjGuard(*obj,memFun,p1,p2);
+ fun_(p1_);
}
- ////////////////////////////////////////////////////////////////
- ///
- /// \class ObjScopeGuardImpl3
- /// \ingroup ExceptionGroup
- ///
- /// Implementation class for a class per-instance member function with three
- /// parameters. Each parameter is copied by value - use ::Loki::ByRef if you
- /// must use a reference instead. ScopeGuard ignores any value returned
- /// from the call within the Execute function.
- ///
- /// This class has 3 standalone helper functions which create a ScopeGuard.
- /// One is MakeObjGuard, which is deprecated but provided for older code.
- /// The other two are MakeGuard overloads, one which takes a pointer to an
- /// object, and the other which takes a reference.
- ///
- ////////////////////////////////////////////////////////////////
+protected:
+ ScopeGuardImpl1(F fun, P1 p1) : fun_(fun), p1_(p1)
+ {}
- template < class Obj, typename MemFun, typename P1, typename P2, typename P3 >
- class ObjScopeGuardImpl3 : public ScopeGuardImplBase
+ F fun_;
+ const P1 p1_;
+};
+
+template <typename F, typename P1>
+inline ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
+{
+ return ScopeGuardImpl1<F, P1>::MakeGuard(fun, p1);
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ScopeGuardImpl2
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a standalone function or class static function
+/// with two parameters. Each parameter is copied by value - use
+/// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
+/// any value returned from the call within the Execute function.
+///
+/// This class has a single standalone helper function, MakeGuard which
+/// creates and returns a ScopeGuard.
+///
+////////////////////////////////////////////////////////////////
+
+template <typename F, typename P1, typename P2>
+class ScopeGuardImpl2: public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
{
- public:
- static ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 > MakeObjGuard(
- Obj & obj, MemFun memFun, P1 p1, P2 p2, P3 p3 )
- {
- return ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 >( obj, memFun, p1, p2, p3 );
- }
+ return ScopeGuardImpl2<F, P1, P2>(fun, p1, p2);
+ }
- ~ObjScopeGuardImpl3() throw()
- {
- SafeExecute( *this );
- }
-
- void Execute()
- {
- ( obj_.*memFun_ )( p1_, p2_, p3_ );
- }
-
- protected:
- ObjScopeGuardImpl3( Obj & obj, MemFun memFun, P1 p1, P2 p2, P3 p3 ) :
- obj_( obj ), memFun_( memFun ), p1_( p1 ), p2_( p2 ), p3_( p3 )
- {}
-
- Obj& obj_;
- MemFun memFun_;
- const P1 p1_;
- const P2 p2_;
- const P3 p3_;
- };
+ ~ScopeGuardImpl2() throw()
+ {
+ SafeExecute(*this);
+ }
- template < class Obj, typename MemFun, typename P1, typename P2, typename P3 >
- inline ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 > MakeObjGuard(
- Obj & obj, MemFun memFun, P1 p1, P2 p2, P3 p3 )
+ void Execute()
+ {
+ fun_(p1_, p2_);
+ }
+
+protected:
+ ScopeGuardImpl2(F fun, P1 p1, P2 p2) : fun_(fun), p1_(p1), p2_(p2)
+ {}
+
+ F fun_;
+ const P1 p1_;
+ const P2 p2_;
+};
+
+template <typename F, typename P1, typename P2>
+inline ScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2)
+{
+ return ScopeGuardImpl2<F, P1, P2>::MakeGuard(fun, p1, p2);
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ScopeGuardImpl3
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a standalone function or class static function
+/// with three parameters. Each parameter is copied by value - use
+/// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
+/// any value returned from the call within the Execute function.
+///
+/// This class has a single standalone helper function, MakeGuard which
+/// creates and returns a ScopeGuard.
+///
+////////////////////////////////////////////////////////////////
+
+template <typename F, typename P1, typename P2, typename P3>
+class ScopeGuardImpl3 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
+ {
+ return ScopeGuardImpl3<F, P1, P2, P3>(fun, p1, p2, p3);
+ }
+
+ ~ScopeGuardImpl3() throw()
+ {
+ SafeExecute(*this);
+ }
+
+ void Execute()
+ {
+ fun_(p1_, p2_, p3_);
+ }
+
+protected:
+ ScopeGuardImpl3(F fun, P1 p1, P2 p2, P3 p3) : fun_(fun), p1_(p1), p2_(p2), p3_(p3)
+ {}
+
+ F fun_;
+ const P1 p1_;
+ const P2 p2_;
+ const P3 p3_;
+};
+
+template <typename F, typename P1, typename P2, typename P3>
+inline ScopeGuardImpl3<F, P1, P2, P3> MakeGuard(F fun, P1 p1, P2 p2, P3 p3)
+{
+ return ScopeGuardImpl3<F, P1, P2, P3>::MakeGuard(fun, p1, p2, p3);
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ScopeGuardImpl4
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a standalone function or class static function
+/// with four parameters. Each parameter is copied by value - use
+/// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
+/// any value returned from the call within the Execute function.
+///
+/// This class has a single standalone helper function, MakeGuard which
+/// creates and returns a ScopeGuard.
+///
+////////////////////////////////////////////////////////////////
+
+template < typename F, typename P1, typename P2, typename P3, typename P4 >
+class ScopeGuardImpl4 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl4< F, P1, P2, P3, P4 > MakeGuard(
+ F fun, P1 p1, P2 p2, P3 p3, P4 p4 )
+ {
+ return ScopeGuardImpl4< F, P1, P2, P3, P4 >( fun, p1, p2, p3, p4 );
+ }
+
+ ~ScopeGuardImpl4() throw()
+ {
+ SafeExecute( *this );
+ }
+
+ void Execute()
+ {
+ fun_( p1_, p2_, p3_, p4_ );
+ }
+
+protected:
+ ScopeGuardImpl4( F fun, P1 p1, P2 p2, P3 p3, P4 p4 ) :
+ fun_( fun ), p1_( p1 ), p2_( p2 ), p3_( p3 ), p4_( p4 )
+ {}
+
+ F fun_;
+ const P1 p1_;
+ const P2 p2_;
+ const P3 p3_;
+ const P4 p4_;
+};
+
+template < typename F, typename P1, typename P2, typename P3, typename P4 >
+inline ScopeGuardImpl4< F, P1, P2, P3, P4 > MakeGuard( F fun, P1 p1, P2 p2, P3 p3, P4 p4 )
+{
+ return ScopeGuardImpl4< F, P1, P2, P3, P4 >::MakeGuard( fun, p1, p2, p3, p4 );
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ScopeGuardImpl5
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a standalone function or class static function
+/// with five parameters. Each parameter is copied by value - use
+/// ::Loki::ByRef if you must use a reference instead. ScopeGuard ignores
+/// any value returned from the call within the Execute function.
+///
+/// This class has a single standalone helper function, MakeGuard which
+/// creates and returns a ScopeGuard.
+///
+////////////////////////////////////////////////////////////////
+
+template < typename F, typename P1, typename P2, typename P3, typename P4, typename P5 >
+class ScopeGuardImpl5 : public ScopeGuardImplBase
+{
+public:
+ static ScopeGuardImpl5< F, P1, P2, P3, P4, P5 > MakeGuard(
+ F fun, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 )
{
- return ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 >::MakeObjGuard(
- obj, memFun, p1, p2, p3 );
+ return ScopeGuardImpl5< F, P1, P2, P3, P4, P5 >( fun, p1, p2, p3, p4, p5 );
}
- template < typename Ret, class Obj1, class Obj2, typename P1a, typename P1b,
- typename P2a, typename P2b, typename P3a, typename P3b >
- inline ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
- MakeGuard( Ret( Obj2::*memFun )( P1a, P2a, P3a ), Obj1 & obj, P1b p1, P2b p2, P3b p3 )
+ ~ScopeGuardImpl5() throw()
{
- return ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
- ::MakeObjGuard( obj, memFun, p1, p2, p3 );
+ SafeExecute( *this );
}
- template < typename Ret, class Obj1, class Obj2, typename P1a, typename P1b,
- typename P2a, typename P2b, typename P3a, typename P3b >
- inline ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
- MakeGuard( Ret( Obj2::*memFun )( P1a, P2a, P3a ), Obj1 * obj, P1b p1, P2b p2, P3b p3 )
+ void Execute()
{
- return ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
- ::MakeObjGuard( *obj, memFun, p1, p2, p3 );
+ fun_( p1_, p2_, p3_, p4_, p5_ );
}
+protected:
+ ScopeGuardImpl5( F fun, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 ) :
+ fun_( fun ), p1_( p1 ), p2_( p2 ), p3_( p3 ), p4_( p4 ), p5_( p5 )
+ {}
+
+ F fun_;
+ const P1 p1_;
+ const P2 p2_;
+ const P3 p3_;
+ const P4 p4_;
+ const P5 p5_;
+};
+
+template < typename F, typename P1, typename P2, typename P3, typename P4, typename P5 >
+inline ScopeGuardImpl5< F, P1, P2, P3, P4, P5 > MakeGuard( F fun, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 )
+{
+ return ScopeGuardImpl5< F, P1, P2, P3, P4, P5 >::MakeGuard( fun, p1, p2, p3, p4, p5 );
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ObjScopeGuardImpl0
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a class per-instance member function with no
+/// parameters. ScopeGuard ignores any value returned from the call within
+/// the Execute function.
+///
+/// This class has 3 standalone helper functions which create a ScopeGuard.
+/// One is MakeObjGuard, which is deprecated but provided for older code.
+/// The other two are MakeGuard overloads, one which takes a pointer to an
+/// object, and the other which takes a reference.
+///
+////////////////////////////////////////////////////////////////
+
+template <class Obj, typename MemFun>
+class ObjScopeGuardImpl0 : public ScopeGuardImplBase
+{
+public:
+ static ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
+ {
+ return ObjScopeGuardImpl0<Obj, MemFun>(obj, memFun);
+ }
+
+ ~ObjScopeGuardImpl0() throw()
+ {
+ SafeExecute(*this);
+ }
+
+ void Execute()
+ {
+ (obj_.*memFun_)();
+ }
+
+protected:
+ ObjScopeGuardImpl0(Obj& obj, MemFun memFun) : obj_(obj), memFun_(memFun)
+ {}
+
+ Obj& obj_;
+ MemFun memFun_;
+};
+
+template <class Obj, typename MemFun>
+inline ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun)
+{
+ return ObjScopeGuardImpl0<Obj, MemFun>::MakeObjGuard(obj, memFun);
+}
+
+template <typename Ret, class Obj1, class Obj2>
+inline ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1& obj)
+{
+ return ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()>::MakeObjGuard(obj,memFun);
+}
+
+template <typename Ret, class Obj1, class Obj2>
+inline ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1* obj)
+{
+ return ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()>::MakeObjGuard(*obj,memFun);
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ObjScopeGuardImpl1
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a class per-instance member function with one
+/// parameter. The parameter is copied by value - use ::Loki::ByRef if you
+/// must use a reference instead. ScopeGuard ignores any value returned
+/// from the call within the Execute function.
+///
+/// This class has 3 standalone helper functions which create a ScopeGuard.
+/// One is MakeObjGuard, which is deprecated but provided for older code.
+/// The other two are MakeGuard overloads, one which takes a pointer to an
+/// object, and the other which takes a reference.
+///
+////////////////////////////////////////////////////////////////
+
+template <class Obj, typename MemFun, typename P1>
+class ObjScopeGuardImpl1 : public ScopeGuardImplBase
+{
+public:
+ static ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
+ {
+ return ObjScopeGuardImpl1<Obj, MemFun, P1>(obj, memFun, p1);
+ }
+
+ ~ObjScopeGuardImpl1() throw()
+ {
+ SafeExecute(*this);
+ }
+
+ void Execute()
+ {
+ (obj_.*memFun_)(p1_);
+ }
+
+protected:
+ ObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1) : obj_(obj), memFun_(memFun), p1_(p1)
+ {}
+
+ Obj& obj_;
+ MemFun memFun_;
+ const P1 p1_;
+};
+
+template <class Obj, typename MemFun, typename P1>
+inline ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1)
+{
+ return ObjScopeGuardImpl1<Obj, MemFun, P1>::MakeObjGuard(obj, memFun, p1);
+}
+
+template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b>
+inline ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1& obj, P1b p1)
+{
+ return ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b>::MakeObjGuard(obj,memFun,p1);
+}
+
+template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b>
+inline ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1* obj, P1b p1)
+{
+ return ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b>::MakeObjGuard(*obj,memFun,p1);
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ObjScopeGuardImpl2
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a class per-instance member function with two
+/// parameters. Each parameter is copied by value - use ::Loki::ByRef if you
+/// must use a reference instead. ScopeGuard ignores any value returned
+/// from the call within the Execute function.
+///
+/// This class has 3 standalone helper functions which create a ScopeGuard.
+/// One is MakeObjGuard, which is deprecated but provided for older code.
+/// The other two are MakeGuard overloads, one which takes a pointer to an
+/// object, and the other which takes a reference.
+///
+////////////////////////////////////////////////////////////////
+
+template <class Obj, typename MemFun, typename P1, typename P2>
+class ObjScopeGuardImpl2 : public ScopeGuardImplBase
+{
+public:
+ static ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
+ {
+ return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>(obj, memFun, p1, p2);
+ }
+
+ ~ObjScopeGuardImpl2() throw()
+ {
+ SafeExecute(*this);
+ }
+
+ void Execute()
+ {
+ (obj_.*memFun_)(p1_, p2_);
+ }
+
+protected:
+ ObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2) : obj_(obj), memFun_(memFun), p1_(p1), p2_(p2)
+ {}
+
+ Obj& obj_;
+ MemFun memFun_;
+ const P1 p1_;
+ const P2 p2_;
+};
+
+template <class Obj, typename MemFun, typename P1, typename P2>
+inline ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2)
+{
+ return ObjScopeGuardImpl2<Obj, MemFun, P1, P2>::MakeObjGuard(obj, memFun, p1, p2);
+}
+
+template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b, typename P2a, typename P2b>
+inline ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b> MakeGuard(Ret(Obj2::*memFun)(P1a,P2a), Obj1& obj, P1b p1, P2b p2)
+{
+ return ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b>::MakeObjGuard(obj,memFun,p1,p2);
+}
+
+template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b, typename P2a, typename P2b>
+inline ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b> MakeGuard(Ret(Obj2::*memFun)(P1a,P2a), Obj1* obj, P1b p1, P2b p2)
+{
+ return ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b>::MakeObjGuard(*obj,memFun,p1,p2);
+}
+
+////////////////////////////////////////////////////////////////
+///
+/// \class ObjScopeGuardImpl3
+/// \ingroup ExceptionGroup
+///
+/// Implementation class for a class per-instance member function with three
+/// parameters. Each parameter is copied by value - use ::Loki::ByRef if you
+/// must use a reference instead. ScopeGuard ignores any value returned
+/// from the call within the Execute function.
+///
+/// This class has 3 standalone helper functions which create a ScopeGuard.
+/// One is MakeObjGuard, which is deprecated but provided for older code.
+/// The other two are MakeGuard overloads, one which takes a pointer to an
+/// object, and the other which takes a reference.
+///
+////////////////////////////////////////////////////////////////
+
+template < class Obj, typename MemFun, typename P1, typename P2, typename P3 >
+class ObjScopeGuardImpl3 : public ScopeGuardImplBase
+{
+public:
+ static ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 > MakeObjGuard(
+ Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3 )
+ {
+ return ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 >( obj, memFun, p1, p2, p3 );
+ }
+
+ ~ObjScopeGuardImpl3() throw()
+ {
+ SafeExecute( *this );
+ }
+
+ void Execute()
+ {
+ ( obj_.*memFun_ )( p1_, p2_, p3_ );
+ }
+
+protected:
+ ObjScopeGuardImpl3( Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3 ) :
+ obj_( obj ), memFun_( memFun ), p1_( p1 ), p2_( p2 ), p3_( p3 )
+ {}
+
+ Obj& obj_;
+ MemFun memFun_;
+ const P1 p1_;
+ const P2 p2_;
+ const P3 p3_;
+};
+
+template < class Obj, typename MemFun, typename P1, typename P2, typename P3 >
+inline ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 > MakeObjGuard(
+ Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3 )
+{
+ return ObjScopeGuardImpl3< Obj, MemFun, P1, P2, P3 >::MakeObjGuard(
+ obj, memFun, p1, p2, p3 );
+}
+
+template < typename Ret, class Obj1, class Obj2, typename P1a, typename P1b,
+ typename P2a, typename P2b, typename P3a, typename P3b >
+inline ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
+MakeGuard( Ret( Obj2::*memFun )( P1a, P2a, P3a ), Obj1& obj, P1b p1, P2b p2, P3b p3 )
+{
+ return ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
+ ::MakeObjGuard( obj, memFun, p1, p2, p3 );
+}
+
+template < typename Ret, class Obj1, class Obj2, typename P1a, typename P1b,
+ typename P2a, typename P2b, typename P3a, typename P3b >
+inline ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
+MakeGuard( Ret( Obj2::*memFun )( P1a, P2a, P3a ), Obj1* obj, P1b p1, P2b p2, P3b p3 )
+{
+ return ObjScopeGuardImpl3< Obj1, Ret( Obj2::* )( P1a, P2a, P3a ), P1b, P2b, P3b >
+ ::MakeObjGuard( *obj, memFun, p1, p2, p3 );
+}
+
} // namespace Loki
#define LOKI_CONCATENATE_DIRECT(s1, s2) s1##s2
bgstack15