lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
scoped_lock.h
00001 /*****************************************************/
00002 /* lean Smart                   (c) Tobias Zirr 2011 */
00003 /*****************************************************/
00004 
00005 #ifndef LEAN_SMART_SCOPED_LOCK
00006 #define LEAN_SMART_SCOPED_LOCK
00007 
00008 #include "../lean.h"
00009 #include "../tags/noncopyable.h"
00010 
00011 namespace lean
00012 {
00013 namespace smart
00014 {
00015 
00017 template <class Lockable>
00018 struct default_lock_policy
00019 {
00021     static LEAN_INLINE bool try_lock(Lockable &lock)
00022     {
00023         return lock.try_lock();
00024     }
00026     static LEAN_INLINE void lock(Lockable &lock)
00027     {
00028         lock.lock();
00029     }
00031     static LEAN_INLINE void unlock(Lockable &lock)
00032     {
00033         lock.unlock();
00034     }
00035 };
00036 
00038 template < class Lockable, class Policy = default_lock_policy<Lockable> >
00039 class scoped_lock : public noncopyable
00040 {
00041 private:
00042     Lockable &m_lock;
00043 
00044 public:
00046     typedef Lockable lock_type;
00048     typedef Policy policy_type;
00049 
00051     enum adopt_lock_t
00052     {
00053         adopt_lock  
00054     };
00055 
00057     LEAN_INLINE explicit scoped_lock(lock_type &lock)
00058         : m_lock(lock)
00059     {
00060         policy_type::lock(m_lock);
00061     }
00063     LEAN_INLINE scoped_lock(lock_type &lock, adopt_lock_t)
00064         : m_lock(lock) { }
00066     LEAN_INLINE ~scoped_lock()
00067     {
00068         policy_type::unlock(m_lock);
00069     }
00070     
00072     LEAN_INLINE lock_type& get(void) { return m_lock; };
00074     LEAN_INLINE const lock_type& get(void) const { return m_lock; };
00075 };
00076 
00077 } // namespace
00078 
00079 using smart::default_lock_policy;
00080 using smart::scoped_lock;
00081 
00082 } // namespace
00083 
00084 #endif