00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef STXXL_MNG_READ_WRITE_POOL_H
00014 #define STXXL_MNG_READ_WRITE_POOL_H
00015
00016 #include <stxxl/bits/mng/write_pool.h>
00017 #include <stxxl/bits/mng/prefetch_pool.h>
00018
00019
00020 __STXXL_BEGIN_NAMESPACE
00021
00024
00025
00027 template <typename BlockType>
00028 class read_write_pool : private noncopyable
00029 {
00030 public:
00031 typedef BlockType block_type;
00032 typedef typename block_type::bid_type bid_type;
00033 typedef unsigned_type size_type;
00034
00035 protected:
00036 typedef write_pool<block_type> write_pool_type;
00037 typedef prefetch_pool<block_type> prefetch_pool_type;
00038
00039 write_pool_type * w_pool;
00040 prefetch_pool_type * p_pool;
00041 bool delete_pools;
00042
00043 public:
00047 explicit read_write_pool(size_type init_size_prefetch = 1, size_type init_size_write = 1) :
00048 delete_pools(true)
00049 {
00050 w_pool = new write_pool_type(init_size_write);
00051 p_pool = new prefetch_pool_type(init_size_prefetch);
00052 }
00053
00054 _STXXL_DEPRECATED(read_write_pool(prefetch_pool_type & p_pool, write_pool_type & w_pool)) :
00055 w_pool(&w_pool), p_pool(&p_pool), delete_pools(false)
00056 { }
00057
00058 void swap(read_write_pool & obj)
00059 {
00060 std::swap(w_pool, obj.w_pool);
00061 std::swap(p_pool, obj.p_pool);
00062 std::swap(delete_pools, obj.delete_pools);
00063 }
00064
00066 virtual ~read_write_pool()
00067 {
00068 if (delete_pools) {
00069 delete w_pool;
00070 delete p_pool;
00071 }
00072 }
00073
00075 size_type size_write() const { return w_pool->size(); }
00076
00078 size_type size_prefetch() const { return p_pool->size(); }
00079
00082 void resize_write(size_type new_size)
00083 {
00084 w_pool->resize(new_size);
00085 }
00086
00089 void resize_prefetch(size_type new_size)
00090 {
00091 p_pool->resize(new_size);
00092 }
00093
00094
00095
00102 request_ptr write(block_type * & block, bid_type bid)
00103 {
00104 request_ptr result = w_pool->write(block, bid);
00105
00106
00107
00108 if (p_pool->invalidate(bid))
00109 p_pool->hint(bid, *w_pool);
00110
00111 return result;
00112 }
00113
00116 block_type * steal()
00117 {
00118 return w_pool->steal();
00119 }
00120
00121 void add(block_type * & block)
00122 {
00123 w_pool->add(block);
00124 }
00125
00126
00127
00135 bool hint(bid_type bid)
00136 {
00137 return p_pool->hint(bid, *w_pool);
00138 }
00139
00140 bool invalidate(bid_type bid)
00141 {
00142 return p_pool->invalidate(bid);
00143 }
00144
00151 request_ptr read(block_type * & block, bid_type bid)
00152 {
00153 return p_pool->read(block, bid, *w_pool);
00154 }
00155 };
00156
00158
00159 __STXXL_END_NAMESPACE
00160
00161
00162 namespace std
00163 {
00164 template <class BlockType>
00165 void swap(stxxl::read_write_pool<BlockType> & a,
00166 stxxl::read_write_pool<BlockType> & b)
00167 {
00168 a.swap(b);
00169 }
00170 }
00171
00172 #endif // !STXXL_MNG_READ_WRITE_POOL_H
00173