00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef STXXL_BID_HEADER
00014 #define STXXL_BID_HEADER
00015
00016 #include <iostream>
00017 #include <iomanip>
00018
00019 #include <stxxl/bits/io/file.h>
00020
00021 #ifndef STXXL_VERBOSE_BLOCK_LIFE_CYCLE
00022 #define STXXL_VERBOSE_BLOCK_LIFE_CYCLE STXXL_VERBOSE2
00023 #endif
00024 #define FMT_BID(_bid_) "[" << (_bid_).storage->get_allocator_id() << "]0x" << std::hex << std::setfill('0') << std::setw(8) << (_bid_).offset << "/0x" << std::setw(8) << (_bid_).size
00025
00026
00027 __STXXL_BEGIN_NAMESPACE
00028
00031
00033
00035 template <unsigned SIZE>
00036 struct BID
00037 {
00038 enum
00039 {
00040 size = SIZE,
00041 t_size = SIZE
00042 };
00043
00044 file * storage;
00045 stxxl::int64 offset;
00046
00047 BID() : storage(NULL), offset(0)
00048 { }
00049
00050 bool valid() const
00051 {
00052 return storage;
00053 }
00054
00055 BID(file * s, stxxl::int64 o) : storage(s), offset(o)
00056 { }
00057
00058 BID(const BID & obj) : storage(obj.storage), offset(obj.offset)
00059 { }
00060
00061 template <unsigned BlockSize>
00062 explicit BID(const BID<BlockSize> & obj) : storage(obj.storage), offset(obj.offset)
00063 { }
00064
00065 template <unsigned BlockSize>
00066 BID & operator = (const BID<BlockSize> & obj)
00067 {
00068 storage = obj.storage;
00069 offset = obj.offset;
00070 return *this;
00071 }
00072
00073 bool is_managed() const
00074 {
00075 return storage->get_allocator_id() != file::NO_ALLOCATOR;
00076 }
00077 };
00078
00079
00081
00083 template <>
00084 struct BID<0>
00085 {
00086 file * storage;
00087 stxxl::int64 offset;
00088 unsigned size;
00089
00090 enum
00091 {
00092 t_size = 0
00093 };
00094
00095 BID() : storage(NULL), offset(0), size(0)
00096 { }
00097
00098 BID(file * f, stxxl::int64 o, unsigned s) : storage(f), offset(o), size(s)
00099 { }
00100
00101 bool valid() const
00102 {
00103 return storage;
00104 }
00105 };
00106
00107 template <unsigned blk_sz>
00108 bool operator == (const BID<blk_sz> & a, const BID<blk_sz> & b)
00109 {
00110 return (a.storage == b.storage) && (a.offset == b.offset) && (a.size == b.size);
00111 }
00112
00113 template <unsigned blk_sz>
00114 bool operator != (const BID<blk_sz> & a, const BID<blk_sz> & b)
00115 {
00116 return (a.storage != b.storage) || (a.offset != b.offset) || (a.size != b.size);
00117 }
00118
00119 template <unsigned blk_sz>
00120 std::ostream & operator << (std::ostream & s, const BID<blk_sz> & bid)
00121 {
00122
00123
00124
00125 s << "[" << bid.storage << "|";
00126 if (bid.storage)
00127 s << bid.storage->get_allocator_id();
00128 else
00129 s << "?";
00130 s << "]0x" << std::hex << std::setfill('0') << std::setw(8) << bid.offset << "/0x" << std::setw(8) << bid.size << std::dec;
00131 return s;
00132 }
00133
00134
00135 #if 0
00136 template <unsigned BLK_SIZE>
00137 class BIDArray : public std::vector<BID<BLK_SIZE> >
00138 {
00139 public:
00140 BIDArray(std::vector<BID<BLK_SIZE> >::size_type size = 0) : std::vector<BID<BLK_SIZE> >(size) { }
00141 };
00142 #endif
00143
00144 template <unsigned BLK_SIZE>
00145 class BIDArray : private noncopyable
00146 {
00147 protected:
00148 unsigned_type _size;
00149 BID<BLK_SIZE> * array;
00150
00151 public:
00152 typedef BID<BLK_SIZE> & reference;
00153 typedef BID<BLK_SIZE> * iterator;
00154 typedef const BID<BLK_SIZE> * const_iterator;
00155
00156 BIDArray() : _size(0), array(NULL)
00157 { }
00158
00159 iterator begin()
00160 {
00161 return array;
00162 }
00163
00164 iterator end()
00165 {
00166 return array + _size;
00167 }
00168
00169 BIDArray(unsigned_type size) : _size(size)
00170 {
00171 array = new BID<BLK_SIZE>[size];
00172 }
00173
00174 unsigned_type size() const
00175 {
00176 return _size;
00177 }
00178
00179 reference operator [] (int_type i)
00180 {
00181 return array[i];
00182 }
00183
00184 void resize(unsigned_type newsize)
00185 {
00186 if (array)
00187 {
00188 STXXL_MSG("Warning: resizing nonempty BIDArray");
00189 BID<BLK_SIZE> * tmp = array;
00190 array = new BID<BLK_SIZE>[newsize];
00191 memcpy((void *)array, (void *)tmp,
00192 sizeof(BID<BLK_SIZE>) * (STXXL_MIN(_size, newsize)));
00193 delete[] tmp;
00194 _size = newsize;
00195 }
00196 else
00197 {
00198 array = new BID<BLK_SIZE>[newsize];
00199 _size = newsize;
00200 }
00201 }
00202
00203 ~BIDArray()
00204 {
00205 if (array)
00206 delete[] array;
00207 }
00208 };
00209
00211
00212 __STXXL_END_NAMESPACE
00213
00214 #endif // !STXXL_BID_HEADER
00215