00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SST_QUEUE_H
00014 #define SST_QUEUE_H
00015
00016 #include <deque>
00017 #include <map>
00018 #include <sst/core/cache.h>
00019 #include <sst/core/pool.h>
00020
00021 namespace SST {
00022
00023 #define _EQ_DBG( fmt, args...) __DBG( DBG_QUEUE, Queue, fmt, ## args )
00024
00025 template <typename KeyT, typename DataT>
00026 class Queue {
00027 private:
00028 typedef std::deque<DataT> queue_t;
00029
00030 public:
00031 void insert( KeyT key, DataT data ) {
00032
00033 _EQ_DBG("this=%p start key=%lu\n",this,(unsigned long)key);
00034 queue_t *q_ptr;
00035 if ( ! cache.Read( key, &q_ptr ) ) {
00036 if ( map.find( key ) == map.end() ) {
00037 map[key] = q_ptr = q_pool.Alloc();
00038 _EQ_DBG("new q_ptr=%p\n",q_ptr);
00039 } else {
00040 q_ptr = map[key];
00041 }
00042 cache.Inject( key, q_ptr );
00043 }
00044 q_ptr->push_front(data);
00045 _EQ_DBG("q_ptr=%p size=%lu\n",q_ptr,(unsigned long)q_ptr->size());
00046 }
00047
00048 void pop() {
00049 _EQ_DBG("start %ld\n",(unsigned long)map.begin()->second->size());
00050 map.begin()->second->pop_front();
00051 if ( map.begin()->second->empty() ) {
00052 _EQ_DBG("empty\n");
00053 q_pool.Dealloc( map.begin()->second );
00054 cache.Invalidate( map.begin()->first );
00055 map.erase( map.begin() );
00056 }
00057 _EQ_DBG("done\n");
00058 }
00059
00060 DataT top() { return map.begin()->second->front(); }
00061 KeyT key() { return map.begin()->first; }
00062 bool empty() { return map.empty(); }
00063
00064 private:
00065 std::map<KeyT,queue_t*> map;
00066 Cache<KeyT,queue_t*> cache;
00067
00068
00069 Pool<queue_t> q_pool;
00070
00071 friend class boost::serialization::access;
00072 template<class Archive>
00073 void serialize(Archive & ar, const unsigned int version )
00074 {
00075 ar & BOOST_SERIALIZATION_NVP(map);
00076 ar & BOOST_SERIALIZATION_NVP(cache);
00077 }
00078 };
00079
00080 }
00081
00082 #endif