00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef STXXL_ADDRESSABLE_QUEUES_HEADER
00014 #define STXXL_ADDRESSABLE_QUEUES_HEADER
00015
00016 #include <set>
00017 #include <list>
00018 #include <map>
00019
00020 #include <stxxl/bits/namespace.h>
00021
00022 __STXXL_BEGIN_NAMESPACE
00023
00026 template <typename KeyType>
00027 class addressable_fifo_queue
00028 {
00029 typedef std::list<KeyType> container_t;
00030 typedef typename container_t::iterator container_iter_t;
00031 typedef std::map<KeyType, container_iter_t> meta_t;
00032 typedef typename meta_t::iterator meta_iter_t;
00033
00034 container_t vals;
00035 meta_t meta;
00036
00037 public:
00039 typedef meta_iter_t handle;
00040
00042 addressable_fifo_queue() {}
00043 ~addressable_fifo_queue() {}
00044
00047 bool empty() const
00048 { return vals.empty(); }
00049
00053 std::pair<handle, bool> insert(const KeyType & e)
00054 {
00055 container_iter_t ei = vals.insert(vals.end(), e);
00056 std::pair<handle, bool> r = meta.insert(std::make_pair(e, ei));
00057 if (! r.second)
00058 {
00059
00060 vals.erase(r.first->second);
00061 r.first->second = ei;
00062 }
00063 return r;
00064 }
00065
00069 bool erase(const KeyType & e)
00070 {
00071 handle mi = meta.find(e);
00072 if (mi == meta.end())
00073 return false;
00074 vals.erase(mi->second);
00075 meta.erase(mi);
00076 return true;
00077 }
00078
00081 void erase(handle i)
00082 {
00083 vals.erase(i->second);
00084 meta.erase(i);
00085 }
00086
00089 const KeyType & top() const
00090 { return vals.front(); }
00091
00094 KeyType pop()
00095 {
00096 assert(! empty());
00097 const KeyType e = top();
00098 meta.erase(e);
00099 vals.pop_front();
00100 return e;
00101 }
00102 };
00103
00107 template < typename KeyType, typename PriorityType, class Cmp = std::less<PriorityType> >
00108 class addressable_priority_queue
00109 {
00110 struct cmp
00111 {
00112 bool operator()(const std::pair<PriorityType, KeyType> & left,
00113 const std::pair<PriorityType, KeyType> & right) const
00114 {
00115 Cmp c;
00116 return c(left.first, right.first) ||
00117 ((! c(right.first, left.first)) && left.second < right.second);
00118 }
00119 };
00120
00121 typedef std::set<std::pair<PriorityType, KeyType>, cmp> container_t;
00122 typedef typename container_t::iterator container_iter_t;
00123 typedef std::map<KeyType, container_iter_t> meta_t;
00124 typedef typename meta_t::iterator meta_iter_t;
00125
00126 container_t vals;
00127 meta_t meta;
00128
00129 public:
00131 typedef meta_iter_t handle;
00132
00134 addressable_priority_queue() {}
00135 ~addressable_priority_queue() {}
00136
00139 bool empty() const
00140 { return vals.empty(); }
00141
00146 std::pair<handle, bool> insert(const KeyType & e, const PriorityType o)
00147 {
00148 std::pair<container_iter_t ,bool> s = vals.insert(std::make_pair(o, e));
00149 std::pair<handle, bool> r = meta.insert(std::make_pair(e, s.first));
00150 if (! r.second && s.second)
00151 {
00152
00153 vals.erase(r.first->second);
00154 r.first->second = s.first;
00155 }
00156 return r;
00157 }
00158
00162 bool erase(const KeyType & e)
00163 {
00164 handle mi = meta.find(e);
00165 if (mi == meta.end())
00166 return false;
00167 vals.erase(mi->second);
00168 meta.erase(mi);
00169 return true;
00170 }
00171
00174 void erase(handle i)
00175 {
00176 vals.erase(i->second);
00177 meta.erase(i);
00178 }
00179
00182 const KeyType & top() const
00183 { return vals.begin()->second; }
00184
00187 KeyType pop()
00188 {
00189 assert(! empty());
00190 const KeyType e = top();
00191 meta.erase(e);
00192 vals.erase(vals.begin());
00193 return e;
00194 }
00195 };
00196
00197 __STXXL_END_NAMESPACE
00198
00199 #endif