lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
noncopyable.h
00001 /*****************************************************/
00002 /* lean Tags                    (c) Tobias Zirr 2011 */
00003 /*****************************************************/
00004 
00005 #ifndef LEAN_TAGS_NONCOPYABLE
00006 #define LEAN_TAGS_NONCOPYABLE
00007 
00008 #include "../lean.h"
00009 
00010 namespace lean
00011 {
00012 namespace tags
00013 {
00014 
00016 template <class Base>
00017 class noncopyable_chain : public Base
00018 {
00019 private:
00020 #ifndef LEAN0X_NO_DELETE_METHODS
00021     noncopyable_chain(const noncopyable_chain&) = delete;
00022     noncopyable_chain& operator =(const noncopyable_chain&) = delete;
00023 #else
00024     noncopyable_chain(const noncopyable_chain&);
00025     noncopyable_chain& operator =(const noncopyable_chain&);
00026 #endif
00027 
00028 protected:
00029     noncopyable_chain() { }
00030 #ifndef LEAN_OPTIMIZE_DEFAULT_DESTRUCTOR
00031     ~noncopyable_chain() throw() { }
00032 #endif
00033 };
00034 
00036 class noncopyable
00037 {
00038 private:
00039 #ifndef LEAN0X_NO_DELETE_METHODS
00040     noncopyable(const noncopyable&) = delete;
00041     noncopyable& operator =(const noncopyable&) = delete;
00042 #else
00043     noncopyable(const noncopyable&);
00044     noncopyable& operator =(const noncopyable&);
00045 #endif
00046 
00047 protected:
00048     noncopyable() { }
00049 #ifndef LEAN_OPTIMIZE_DEFAULT_DESTRUCTOR
00050     ~noncopyable() throw() { }
00051 #endif
00052 };
00053 
00055 template <class Base>
00056 class nonassignable_chain : public Base
00057 {
00058 private:
00059 #ifndef LEAN0X_NO_DELETE_METHODS
00060     nonassignable_chain& operator =(const nonassignable_chain&) = delete;
00061 #else
00062     nonassignable_chain& operator =(const nonassignable_chain&);
00063 #endif
00064 
00065 protected:
00066     nonassignable_chain() { }
00067     nonassignable_chain(const nonassignable_chain&) { }
00068 #ifndef LEAN_OPTIMIZE_DEFAULT_DESTRUCTOR
00069     ~nonassignable_chain() throw() { }
00070 #endif
00071 };
00072 
00074 class nonassignable
00075 {
00076 private:
00077 #ifndef LEAN0X_NO_DELETE_METHODS
00078     nonassignable& operator =(const nonassignable&) = delete;
00079 #else
00080     nonassignable& operator =(const nonassignable&);
00081 #endif
00082 
00083 protected:
00084     nonassignable() { }
00085     nonassignable(const nonassignable&) { }
00086 #ifndef LEAN_OPTIMIZE_DEFAULT_DESTRUCTOR
00087     ~nonassignable() throw() { }
00088 #endif
00089 };
00090 
00092 template <class Base>
00093 class noncopyable_assignable_chain : public Base
00094 {
00095 private:
00096 #ifndef LEAN0X_NO_DELETE_METHODS
00097     noncopyable_assignable_chain(const noncopyable_assignable_chain&) = delete;
00098 #else
00099     noncopyable_assignable_chain(const noncopyable_assignable_chain&);
00100 #endif
00101 
00102 protected:
00103     noncopyable_assignable_chain() { }
00104     noncopyable_assignable_chain& operator =(const noncopyable_assignable_chain&) { return *this; }
00105 #ifndef LEAN_OPTIMIZE_DEFAULT_DESTRUCTOR
00106     ~noncopyable_assignable_chain() throw() { }
00107 #endif
00108 };
00109 
00111 class noncopyable_assignable
00112 {
00113 private:
00114 #ifndef LEAN0X_NO_DELETE_METHODS
00115     noncopyable_assignable(const noncopyable_assignable&) = delete;
00116 #else
00117     noncopyable_assignable(const noncopyable_assignable&);
00118 #endif
00119 
00120 protected:
00121     noncopyable_assignable() { }
00122     noncopyable_assignable& operator =(const noncopyable_assignable&) { return *this; };
00123 #ifndef LEAN_OPTIMIZE_DEFAULT_DESTRUCTOR
00124     ~noncopyable_assignable() throw() { }
00125 #endif
00126 };
00127 
00128 } // namespace
00129 
00130 using tags::noncopyable_chain;
00131 using tags::noncopyable;
00132 using tags::nonassignable_chain;
00133 using tags::nonassignable;
00134 using tags::noncopyable_assignable_chain;
00135 using tags::noncopyable_assignable;
00136 
00137 } // namespace
00138 
00139 #endif