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