00001
00016
00017 #ifndef NET_INSTAWEB_UTIL_PUBLIC_POOL_H_
00018 #define NET_INSTAWEB_UTIL_PUBLIC_POOL_H_
00019 #include <cstddef>
00020 #include <list>
00021 #include "base/logging.h"
00022 #include "net/instaweb/util/public/basictypes.h"
00023 #include "net/instaweb/util/public/pool_element.h"
00024 #include "net/instaweb/util/public/stl_util.h"
00025
00026 namespace net_instaweb {
00027
00039 template<class T>
00040 class Pool {
00041 public:
00043 typedef typename PoolElement<T>::Position iterator;
00044 typedef typename std::list<T*>::const_iterator const_iterator;
00045
00046 Pool() { }
00047
00048 ~Pool() {
00049 DeleteAll();
00050 }
00051
00053 bool empty() const {
00054 return contents_.empty();
00055 }
00056
00058 size_t size() const {
00059 return contents_.size();
00060 }
00061
00063 iterator begin() {
00064 return contents_.begin();
00065 }
00066
00068 const_iterator begin() const {
00069 return contents_.begin();
00070 }
00071
00073 iterator end() {
00074 return contents_.end();
00075 }
00076
00078 const_iterator end() const {
00079 return contents_.end();
00080 }
00081
00083 void Add(T* object) {
00084 iterator* position = object->pool_position();
00085 contents_.push_back(object);
00088 iterator back_iter = contents_.end();
00089 --back_iter;
00090 *position = back_iter;
00091 }
00092
00095 T* Remove(T* object) {
00096 iterator* position = object->pool_position();
00097 DCHECK(**position == object);
00098 contents_.erase(*position);
00099 *position = contents_.end();
00100 return object;
00101 }
00102
00104 T* oldest() const {
00105 T* result = NULL;
00106 if (!contents_.empty()) {
00107 result = contents_.front();
00108 }
00109 return result;
00110 }
00111
00114 T* RemoveOldest() {
00115 T* result = NULL;
00116 if (!contents_.empty()) {
00117 result = contents_.front();
00118 iterator* position = result->pool_position();
00119 DCHECK(*position == contents_.begin());
00120 contents_.pop_front();
00121 *position = contents_.end();
00122 }
00123 return result;
00124 }
00125
00127 void DeleteAll() {
00128 STLDeleteElements(&contents_);
00129 }
00130
00132 void Clear() {
00133 contents_.clear();
00134 }
00135
00136 private:
00137 std::list<T*> contents_;
00138
00139 DISALLOW_COPY_AND_ASSIGN(Pool);
00140 };
00141
00142 }
00143
00144 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_POOL_H_