• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List

bid.h

00001 /***************************************************************************
00002  *  include/stxxl/bits/mng/bid.h
00003  *
00004  *  Part of the STXXL. See http://stxxl.sourceforge.net
00005  *
00006  *  Copyright (C) 2002-2004 Roman Dementiev <[email protected]>
00007  *
00008  *  Distributed under the Boost Software License, Version 1.0.
00009  *  (See accompanying file LICENSE_1_0.txt or copy at
00010  *  http://www.boost.org/LICENSE_1_0.txt)
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     // [0x12345678|0]0x00100000/0x00010000
00123     // [file ptr|file id]offset/size
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 // vim: et:ts=4:sw=4

Generated by  doxygen 1.7.1