00001 /* 00002 * Secure list header 00003 * 00004 * This file is part of the "SoftPixel Engine" (Copyright (c) 2008 by Lukas Hermanns) 00005 * See "SoftPixelEngine.hpp" for license information. 00006 */ 00007 00008 #ifndef __SP_DIMENSION_SECURELIST_H__ 00009 #define __SP_DIMENSION_SECURELIST_H__ 00010 00011 00012 #include "Base/spStandard.hpp" 00013 #include "Base/spCriticalSection.hpp" 00014 00015 #include <list> 00016 00017 00018 namespace sp 00019 { 00020 namespace dim 00021 { 00022 00023 00025 template < class T, class Allocator = std::allocator<T> > class SecureList : private std::list<T, Allocator> 00026 { 00027 00028 public: 00029 00030 #define CALL_LOCKED(f) lock(); f; unlock(); 00031 00032 /* Typedefinitions */ 00033 00034 typedef typename std::list<T> L; 00035 typedef typename L::iterator iterator; 00036 typedef typename L::const_iterator const_iterator; 00037 typedef typename L::reference reference; 00038 typedef typename L::const_reference const_reference; 00039 typedef typename L::size_type size_type; 00040 00041 /* Functions */ 00042 00043 SecureList() 00044 { 00045 } 00046 ~SecureList() 00047 { 00048 } 00049 00050 inline void lock() 00051 { 00052 Section_.lock(); 00053 } 00054 inline void unlock() 00055 { 00056 Section_.unlock(); 00057 } 00058 00059 inline const_iterator begin() const 00060 { 00061 return L::begin(); 00062 } 00063 inline const_iterator end() const 00064 { 00065 return L::end(); 00066 } 00067 00068 inline iterator begin() 00069 { 00070 return L::begin(); 00071 } 00072 inline iterator end() 00073 { 00074 return L::end(); 00075 } 00076 00077 /*inline const_reference front() const 00078 { 00079 CALL_LOCKED(const_reference Result = L::front()) 00080 return Result; 00081 } 00082 inline const_reference back() const 00083 { 00084 CALL_LOCKED(const_reference Result = L::back()) 00085 return Result; 00086 }*/ 00087 00088 inline reference front() 00089 { 00090 CALL_LOCKED(reference Result = L::front()) 00091 return Result; 00092 } 00093 inline reference back() 00094 { 00095 CALL_LOCKED(reference Result = L::back()) 00096 return Result; 00097 } 00098 00099 inline iterator erase(iterator it) 00100 { 00101 CALL_LOCKED(it = L::erase(it)) 00102 return it; 00103 } 00104 00105 inline void clear() 00106 { 00107 CALL_LOCKED(L::clear()) 00108 } 00109 00110 inline void push_back(const T &Element) 00111 { 00112 CALL_LOCKED(L::push_back(Element)) 00113 } 00114 inline void push_front(const T &Element) 00115 { 00116 CALL_LOCKED(L::push_front(Element)) 00117 } 00118 00119 inline void pop_back() 00120 { 00121 CALL_LOCKED(L::pop_back()) 00122 } 00123 inline void pop_front() 00124 { 00125 CALL_LOCKED(L::pop_front()) 00126 } 00127 00128 inline void remove(const T &Element) 00129 { 00130 CALL_LOCKED(L::remove(Element)) 00131 } 00132 00133 inline void sort() 00134 { 00135 CALL_LOCKED(L::sort()) 00136 } 00137 inline void unique() 00138 { 00139 CALL_LOCKED(L::unique()) 00140 } 00141 00142 inline size_type size()// const 00143 { 00144 CALL_LOCKED(size_type Result = L::size()) 00145 return Result; 00146 } 00147 inline bool empty()// const 00148 { 00149 CALL_LOCKED(bool Result = L::empty()) 00150 return Result; 00151 } 00152 00153 inline iterator insert(iterator it, const T &Element) 00154 { 00155 CALL_LOCKED(it = L::insert(it, Element)) 00156 return it; 00157 } 00158 00159 #undef CALL_LOCKED 00160 00161 private: 00162 00163 /* Members */ 00164 00165 CriticalSection Section_; 00166 00167 }; 00168 00169 00170 } // /namespace dim 00171 00172 } // /namespace sp 00173 00174 00175 #endif 00176 00177 00178 00179 // ================================================================================