lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
|
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