16 #ifndef STXXL_CONTAINERS_VECTOR_HEADER 
   17 #define STXXL_CONTAINERS_VECTOR_HEADER 
   36 #define STXXL_VERBOSE_VECTOR(msg) STXXL_VERBOSE1("vector[" << static_cast<const void*>(this) << "]::" << msg) 
   47 template <
typename SizeType, SizeType modulo2, SizeType modulo1>
 
   52     static const size_type modulo12 = modulo1 * modulo2;
 
   63         pos -= block2 * modulo12;
 
   65         offset = (
int_type)(pos - block1 * modulo1);
 
   67         assert(block2 * modulo12 + block1 * modulo1 + offset == this->pos);
 
   68         assert( block1 < modulo2);
 
   69         assert( offset < modulo1);
 
   85         assert( block1 < modulo2);
 
   86         assert( offset < modulo1);
 
   88         this->block2 = block2;
 
   89         this->block1 = block1;
 
   90         this->offset = offset;
 
   91         pos = block2 * modulo12 + block1 * modulo1 + offset;
 
  105         if (offset == modulo1)
 
  109             if (block1 == modulo2)
 
  116         assert(block2 * modulo12 + block1 * modulo1 + offset == this->pos);
 
  117         assert( block1 < modulo2);
 
  118         assert( offset < modulo1);
 
  147         assert(block2 * modulo12 + block1 * modulo1 + offset == this->pos);
 
  148         assert( block1 < modulo2);
 
  149         assert( offset < modulo1);
 
  180         return pos - dbi2.
pos;
 
  185         set(pos - subtrahend);
 
  191         return pos == dbi2.
pos;
 
  196         return pos != dbi2.
pos;
 
  201         return pos < dbi2.
pos;
 
  206         return pos <= dbi2.
pos;
 
  211         return pos > dbi2.
pos;
 
  216         return pos >= dbi2.
pos;
 
  257 template <
typename ValueType, 
typename AllocStr, 
typename SizeType, 
typename DiffType,
 
  258           unsigned BlockSize, 
typename PagerType, 
unsigned PageSize>
 
  261 template <
typename VectorIteratorType>
 
  264 template <
typename VectorIteratorType>
 
  267 template <
typename VectorIteratorType>
 
  273 template <
typename ValueType, 
typename AllocStr, 
typename SizeType, 
typename DiffType,
 
  274           unsigned BlockSize, 
typename PagerType, 
unsigned PageSize>
 
  284                                        DiffType, BlockSize, PagerType, PageSize>;
 
  295     friend class vector<ValueType, PageSize, PagerType, BlockSize, AllocStr, SizeType>;
 
  320         : offset(o), p_vector(v)
 
  326         : offset(0), p_vector(NULL)
 
  350         return p_vector->bid(offset);
 
  361         return p_vector->element(offset);
 
  366         return &(p_vector->element(offset));
 
  371         return p_vector->const_element(offset);
 
  376         return &(p_vector->const_element(offset));
 
  381         return p_vector->element(offset.get_pos() + i);
 
  384 #ifdef _LIBCPP_VERSION 
  394         return p_vector->const_element(offset.get_pos() + i);
 
  415         return self_type(p_vector, offset.get_pos() - i);
 
  420         return self_type(p_vector, offset.get_pos() + i);
 
  469         return offset == a.
offset;
 
  474         return offset != a.
offset;
 
  484         return offset <= a.
offset;
 
  494         return offset >= a.
offset;
 
  500         return offset == a.
offset;
 
  505         return offset != a.
offset;
 
  515         return offset <= a.
offset;
 
  525         return offset >= a.
offset;
 
  535         p_vector->block_externally_updated(offset);
 
  549 template <
typename ValueType, 
typename AllocStr, 
typename SizeType, 
typename DiffType,
 
  550           unsigned BlockSize, 
typename PagerType, 
unsigned PageSize>
 
  551 class const_vector_iterator
 
  553     typedef const_vector_iterator<ValueType, AllocStr, SizeType, DiffType,
 
  560                                  BlockSize, PagerType, PageSize>;
 
  571     friend class vector<ValueType, PageSize, PagerType, BlockSize, AllocStr, SizeType>;
 
  596         : offset(o), p_vector(v)
 
  602         : offset(0), p_vector(NULL)
 
  606         : offset(a.offset), p_vector(a.p_vector)
 
  610         : offset(a.offset), p_vector(a.p_vector)
 
  640         return p_vector->const_element(offset);
 
  645         return &(p_vector->const_element(offset));
 
  650         return p_vector->const_element(offset.get_pos() + i);
 
  671         return self_type(p_vector, offset.get_pos() - i);
 
  676         return self_type(p_vector, offset.get_pos() + i);
 
  725         return offset == a.
offset;
 
  730         return offset != a.
offset;
 
  740         return offset <= a.
offset;
 
  750         return offset >= a.
offset;
 
  756         return offset == a.
offset;
 
  761         return offset != a.
offset;
 
  771         return offset <= a.
offset;
 
  781         return offset >= a.
offset;
 
  791         p_vector->block_externally_updated(offset);
 
  822     unsigned PageSize = 4,
 
  823     typename PagerType = lru_pager<8>,
 
  852         block_size = BlockSize,
 
  853         page_size = PageSize,
 
  913     enum { valid_on_disk = 0, uninitialized = 1, dirty = 2 };
 
  928         stxxl::uint64 rest = file_length - blocks_fit * 
stxxl::uint64(block_type::raw_size);
 
  929         return (cur_size + rest / stxxl::uint64(
sizeof(
value_type)));
 
  936         size_type num_full_blocks = cur_size / block_type::size;
 
  937         if (cur_size % block_type::size != 0)
 
  939             size_type rest = cur_size - num_full_blocks * block_type::size;
 
  940             return file_size_type(num_full_blocks) * block_type::raw_size + rest * 
sizeof(
value_type);
 
  942         return file_size_type(num_full_blocks) * block_type::raw_size;
 
  957           m_page_status(
div_ceil(m_bids.size(), page_size)),
 
  958           m_page_to_slot(
div_ceil(m_bids.size(), page_size)),
 
  959           m_slot_to_page(npages),
 
  964         m_bm = block_manager::get_instance();
 
  966         allocate_page_cache();
 
  968         for (
size_t i = 0; i < m_page_status.size(); ++i)
 
  970             m_page_status[i] = uninitialized;
 
  971             m_page_to_slot[i] = on_disk;
 
  975             m_free_slots.push(i);
 
  977         m_bm->new_blocks(m_alloc_strategy, m_bids.begin(), m_bids.end(), 0);
 
  988         std::swap(m_alloc_strategy, obj.m_alloc_strategy);
 
  989         std::swap(m_size, obj.m_size);
 
  990         std::swap(m_bids, obj.m_bids);
 
  991         std::swap(m_pager, obj.m_pager);
 
  992         std::swap(m_page_status, obj.m_page_status);
 
  993         std::swap(m_page_to_slot, obj.m_page_to_slot);
 
  994         std::swap(m_slot_to_page, obj.m_slot_to_page);
 
  995         std::swap(m_free_slots, obj.m_free_slots);
 
  996         std::swap(m_cache, obj.m_cache);
 
  997         std::swap(m_from, obj.m_from);
 
  998         std::swap(m_exported, obj.m_exported);
 
 1010         if (!m_cache && numpages() > 0)
 
 1041         return size_type(m_bids.size()) * block_type::size;
 
 1046         return size_type(m_bids.size()) * block_type::raw_size;
 
 1059         if (n <= capacity())
 
 1065         m_page_status.resize(new_pages, uninitialized);
 
 1066         m_page_to_slot.resize(new_pages, on_disk);
 
 1068         m_bids.resize(new_bids_size);
 
 1071             m_bm->new_blocks(m_alloc_strategy,
 
 1072                              m_bids.begin() + old_bids_size, m_bids.end(),
 
 1079                  it != m_bids.end(); ++it, offset += 
size_type(block_type::raw_size))
 
 1081                 (*it).storage = m_from;
 
 1082                 (*it).offset = offset;
 
 1085                                  ((
void*)m_from) << 
" to " << offset);
 
 1086             m_from->set_size(offset);
 
 1102         if (shrink_capacity)
 
 1103             _resize_shrink_capacity(n);
 
 1118             for (
size_t i = first_page_to_evict; i < m_page_status.size(); ++i) {
 
 1119                 if (m_page_to_slot[i] != on_disk) {
 
 1120                     m_free_slots.push(m_page_to_slot[i]);
 
 1121                     m_page_to_slot[i] = on_disk;
 
 1123                 m_page_status[i] = uninitialized;
 
 1135         if (new_bids_size > old_bids_size)
 
 1139         else if (new_bids_size < old_bids_size)
 
 1144                                  new_bids_size << 
" blocks = from " <<
 
 1145                                  m_page_status.size() << 
" to " <<
 
 1146                                  new_pages_size << 
" pages");
 
 1150                 m_from->set_size(new_bids_size * block_type::raw_size);
 
 1152                 m_bm->delete_blocks(m_bids.begin() + old_bids_size, m_bids.end());
 
 1154             m_bids.resize(new_bids_size);
 
 1161             std::fill(m_page_status.begin() + new_pages_size,
 
 1162                       m_page_status.end(), (
unsigned char)valid_on_disk);
 
 1178             m_bm->delete_blocks(m_bids.begin(), m_bids.end());
 
 1181         m_page_status.clear();
 
 1182         m_page_to_slot.clear();
 
 1183         while (!m_free_slots.empty())
 
 1187             m_free_slots.push(i);
 
 1197         resize(old_size + 1);
 
 1198         element(old_size) = obj;
 
 1214         return element(m_size - 1);
 
 1224         return const_element(m_size - 1);
 
 1229         return const_element(0);
 
 1245         : m_size((size == 
size_type(-1)) ? size_from_file_length(from->size()) : size),
 
 1248           m_page_status(
div_ceil(m_bids.size(), page_size)),
 
 1249           m_page_to_slot(
div_ceil(m_bids.size(), page_size)),
 
 1250           m_slot_to_page(npages),
 
 1256         if (!block_type::has_only_data)
 
 1258             std::ostringstream str;
 
 1259             str << 
"The block size for a vector that is mapped to a file must be a multiple of the element size (" <<
 
 1260                 sizeof(
value_type) << 
") and the page size (4096).";
 
 1261             throw std::runtime_error(str.str());
 
 1264         m_bm = block_manager::get_instance();
 
 1266         allocate_page_cache();
 
 1268         for (
size_t i = 0; i < m_page_status.size(); ++i)
 
 1270             m_page_status[i] = valid_on_disk;
 
 1271             m_page_to_slot[i] = on_disk;
 
 1275             m_free_slots.push(i);
 
 1280              it != m_bids.end(); ++it, offset += 
size_type(block_type::raw_size))
 
 1282             (*it).storage = from;
 
 1283             (*it).offset = offset;
 
 1290         : m_size(obj.size()),
 
 1292           m_pager(obj.numpages()),
 
 1293           m_page_status(
div_ceil(m_bids.size(), page_size)),
 
 1294           m_page_to_slot(
div_ceil(m_bids.size(), page_size)),
 
 1295           m_slot_to_page(obj.numpages()),
 
 1300         assert(!obj.m_exported);
 
 1301         m_bm = block_manager::get_instance();
 
 1303         allocate_page_cache();
 
 1305         for (
size_t i = 0; i < m_page_status.size(); ++i)
 
 1307             m_page_status[i] = uninitialized;
 
 1308             m_page_to_slot[i] = on_disk;
 
 1312             m_free_slots.push(i);
 
 1314         m_bm->new_blocks(m_alloc_strategy, m_bids.begin(), m_bids.end(), 0);
 
 1318         std::copy(inbegin, inend, begin());
 
 1412         return element(offset);
 
 1417         return const_element(offset);
 
 1424         return element(offset);
 
 1430         return const_element(offset);
 
 1450             non_free_slots[i] = 
true;
 
 1452         while (!m_free_slots.empty())
 
 1454             non_free_slots[m_free_slots.front()] = 
false;
 
 1460             m_free_slots.push(i);
 
 1461             int_type page_no = m_slot_to_page[i];
 
 1462             if (non_free_slots[i])
 
 1466                 write_page(page_no, i);
 
 1468                 m_page_to_slot[page_no] = on_disk;
 
 1487             STXXL_ERRMSG(
"io_error thrown in ~vector(): " << e.what());
 
 1496             if (m_from == NULL) {
 
 1497                 m_bm->delete_blocks(m_bids.begin(), m_bids.end());
 
 1502                                      ((
void*)m_from) << 
" to " << file_length());
 
 1506                     m_from->set_size(file_length());
 
 1510                     STXXL_ERRMSG(
"Exception thrown in ~vector()...set_size()");
 
 1528             std::ostringstream number;
 
 1529             number << std::setw(9) << std::setfill(
'0') << no;
 
 1531                 ((i + 1) == m_bids.end() && m_size % block_type::size > 0) ?
 
 1532                 (m_size % block_type::size) * 
sizeof(
value_type) :
 
 1534             (*i).storage->export_files((*i).offset, current_block_size, filename_prefix + number.str());
 
 1553     template <
typename ForwardIterator>
 
 1557         m_bids.resize(new_bids_size);
 
 1558         std::copy(bid_begin, bid_end, m_bids.begin());
 
 1560         m_page_status.resize(new_pages, valid_on_disk);
 
 1561         m_page_to_slot.resize(new_pages, on_disk);
 
 1568         return m_pager.size();
 
 1576         return (m_bids.begin() +
 
 1577                 static_cast<typename bids_container_type::size_type
> 
 1578                 (offset / block_type::size));
 
 1582         return (m_bids.begin() +
 
 1583                 static_cast<typename bids_container_type::size_type
> 
 1588         return (m_bids.begin() +
 
 1589                 static_cast<typename bids_container_type::size_type
> 
 1590                 (offset / block_type::size));
 
 1594         return (m_bids.begin() +
 
 1595                 static_cast<typename bids_container_type::size_type
> 
 1601         assert(page_no < (
int_type)m_page_status.size());
 
 1602         if (m_page_status[page_no] == uninitialized)
 
 1606         int_type block_no = page_no * page_size;
 
 1608         int_type i = cache_slot * page_size, j = 0;
 
 1609         for ( ; block_no < last_block; ++block_no, ++i, ++j)
 
 1611             reqs[j] = (*m_cache)[i].read(m_bids[block_no]);
 
 1613         assert(last_block - page_no * page_size > 0);
 
 1614         wait_all(reqs, last_block - page_no * page_size);
 
 1619         assert(page_no < (
int_type)m_page_status.size());
 
 1620         if (!(m_page_status[page_no] & dirty))
 
 1624         int_type block_no = page_no * page_size;
 
 1626         assert(block_no < last_block);
 
 1627         int_type i = cache_slot * page_size, j = 0;
 
 1628         for ( ; block_no < last_block; ++block_no, ++i, ++j)
 
 1630             reqs[j] = (*m_cache)[i].write(m_bids[block_no]);
 
 1632         m_page_status[page_no] = valid_on_disk;
 
 1633         assert(last_block - page_no * page_size > 0);
 
 1634         wait_all(reqs, last_block - page_no * page_size);
 
 1640 #ifdef STXXL_RANGE_CHECK 
 1648 #ifdef STXXL_RANGE_CHECK 
 1649         assert(offset.
get_pos() < size());
 
 1652         assert(page_no < m_page_to_slot.size());   
 
 1653         int_type cache_slot = m_page_to_slot[page_no];
 
 1656             if (m_free_slots.empty())              
 
 1658                 int_type kicked_slot = m_pager.kick();
 
 1659                 m_pager.hit(kicked_slot);
 
 1660                 int_type old_page_no = m_slot_to_page[kicked_slot];
 
 1661                 m_page_to_slot[page_no] = kicked_slot;
 
 1662                 m_page_to_slot[old_page_no] = on_disk;
 
 1663                 m_slot_to_page[kicked_slot] = page_no;
 
 1665                 write_page(old_page_no, kicked_slot);
 
 1666                 read_page(page_no, kicked_slot);
 
 1668                 m_page_status[page_no] = dirty;
 
 1674                 int_type free_slot = m_free_slots.front();
 
 1676                 m_pager.hit(free_slot);
 
 1677                 m_page_to_slot[page_no] = free_slot;
 
 1678                 m_slot_to_page[free_slot] = page_no;
 
 1680                 read_page(page_no, free_slot);
 
 1682                 m_page_status[page_no] = dirty;
 
 1689             m_page_status[page_no] = dirty;
 
 1690             m_pager.hit(cache_slot);
 
 1699         assert(page_no < m_page_status.size());
 
 1701         assert(!(m_page_status[page_no] & dirty));
 
 1702         if (m_page_to_slot[page_no] != on_disk) {
 
 1704             m_free_slots.push(m_page_to_slot[page_no]);
 
 1705             m_page_to_slot[page_no] = on_disk;
 
 1706             STXXL_VERBOSE_VECTOR(
"page_externally_updated(): page_no=" << page_no << 
" flushed from cache.");
 
 1709             STXXL_VERBOSE_VECTOR(
"page_externally_updated(): page_no=" << page_no << 
" no need to flush.");
 
 1711         m_page_status[page_no] = valid_on_disk;
 
 1716         page_externally_updated(
 
 1723         page_externally_updated(offset.
get_block2());
 
 1734         assert(page_no < m_page_to_slot.size());   
 
 1735         int_type cache_slot = m_page_to_slot[page_no];
 
 1738             if (m_free_slots.empty())              
 
 1740                 int_type kicked_slot = m_pager.kick();
 
 1741                 m_pager.hit(kicked_slot);
 
 1742                 int_type old_page_no = m_slot_to_page[kicked_slot];
 
 1743                 m_page_to_slot[page_no] = kicked_slot;
 
 1744                 m_page_to_slot[old_page_no] = on_disk;
 
 1745                 m_slot_to_page[kicked_slot] = page_no;
 
 1747                 write_page(old_page_no, kicked_slot);
 
 1748                 read_page(page_no, kicked_slot);
 
 1754                 int_type free_slot = m_free_slots.front();
 
 1756                 m_pager.hit(free_slot);
 
 1757                 m_page_to_slot[page_no] = free_slot;
 
 1758                 m_slot_to_page[free_slot] = page_no;
 
 1760                 read_page(page_no, free_slot);
 
 1767             m_pager.hit(cache_slot);
 
 1775         assert(page_no < m_page_to_slot.size());   
 
 1776         int_type cache_slot = m_page_to_slot[page_no];
 
 1777         return (cache_slot >= 0);                  
 
 1789                                        AllocStr, SizeType>& a,
 
 1791                                        AllocStr, SizeType>& b)
 
 1793     return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());
 
 1804                                        AllocStr, SizeType>& a,
 
 1806                                        AllocStr, SizeType>& b)
 
 1819                                       AllocStr, SizeType>& a,
 
 1821                                       AllocStr, SizeType>& b)
 
 1823     return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
 
 1834                                       AllocStr, SizeType>& a,
 
 1836                                       AllocStr, SizeType>& b)
 
 1849                                        AllocStr, SizeType>& a,
 
 1851                                        AllocStr, SizeType>& b)
 
 1864                                        AllocStr, SizeType>& a,
 
 1866                                        AllocStr, SizeType>& b)
 
 1874 template <
typename ValueType, 
typename AllocStr, 
typename SizeType, 
typename DiffType,
 
 1875           unsigned BlockSize, 
typename PagerType, 
unsigned PageSize>
 
 1885 template <
typename ValueType, 
typename AllocStr, 
typename SizeType, 
typename DiffType,
 
 1886           unsigned BlockSize, 
typename PagerType, 
unsigned PageSize, 
typename StrictWeakOrdering>
 
 1890     StrictWeakOrdering comp)
 
 1900 template <
typename VectorBufReaderType>
 
 1919 template <
typename VectorIterator>
 
 1973         : m_begin(begin), m_end(end),
 
 1975           m_nbuffers(nbuffers)
 
 1979         if (m_nbuffers == 0)
 
 1980             m_nbuffers = 2 * config::get_instance()->disks_number();
 
 1989         : m_begin(vec.begin()), m_end(vec.end()),
 
 1991           m_nbuffers(nbuffers)
 
 1995         if (m_nbuffers == 0)
 
 1996             m_nbuffers = 2 * config::get_instance()->disks_number();
 
 2006         if (empty()) 
return;
 
 2008         if (m_bufin) 
delete m_bufin;
 
 2019         for ( ; curr != m_begin; ++
curr)
 
 2026         if (m_bufin) 
delete m_bufin;
 
 2038         return &(*(*m_bufin));
 
 2068         assert(m_begin <= m_iter && m_iter <= m_end);
 
 2075         return (m_iter == m_end);
 
 2106 template <
typename VectorBufReaderType>
 
 2107 class vector_bufreader_iterator
 
 2129         : m_bufreader(bufreader), m_iter(iter)
 
 2135         assert(m_bufreader.m_iter == m_iter);
 
 2136         return m_bufreader.operator * ();
 
 2142         assert(m_bufreader.m_iter == m_iter);
 
 2143         return m_bufreader.operator -> ();
 
 2150         assert(m_bufreader.m_iter == m_iter);
 
 2151         m_bufreader.operator ++ ();
 
 2159         assert(&m_bufreader == &vbi.m_bufreader);
 
 2160         return (m_iter == vbi.m_iter);
 
 2166         assert(&m_bufreader == &vbi.m_bufreader);
 
 2167         return (m_iter != vbi.m_iter);
 
 2190 template <
typename VectorIterator>
 
 2191 class vector_bufreader_reverse : 
public noncopyable
 
 2238         : m_begin(begin), m_end(end),
 
 2240           m_nbuffers(nbuffers)
 
 2244         if (m_nbuffers == 0)
 
 2245             m_nbuffers = 2 * config::get_instance()->disks_number();
 
 2254         : m_begin(vec.begin()), m_end(vec.end()),
 
 2256           m_nbuffers(nbuffers)
 
 2260         if (m_nbuffers == 0)
 
 2261             m_nbuffers = 2 * config::get_instance()->disks_number();
 
 2271         if (empty()) 
return;
 
 2273         if (m_bufin) 
delete m_bufin;
 
 2289             for ( ; endoff != block_type::size; endoff++)
 
 2297         if (m_bufin) 
delete m_bufin;
 
 2309         return &(*(*m_bufin));
 
 2339         assert(m_begin <= m_iter && m_iter <= m_end);
 
 2346         return (m_iter == m_begin);
 
 2367 template <
typename VectorIterator>
 
 2368 class vector_bufwriter : 
public noncopyable
 
 2420           m_end(m_iter.parent_vector()->end()),
 
 2423           m_nbuffers(nbuffers)
 
 2425         if (m_nbuffers == 0)
 
 2426             m_nbuffers = 2 * config::get_instance()->disks_number();
 
 2428         assert(m_iter <= m_end);
 
 2436         : m_iter(vec.begin()),
 
 2437           m_end(m_iter.parent_vector()->end()),
 
 2440           m_nbuffers(nbuffers)
 
 2442         if (m_nbuffers == 0)
 
 2443             m_nbuffers = 2 * config::get_instance()->disks_number();
 
 2445         assert(m_iter <= m_end);
 
 2466                 if (m_iter.block_offset() != 0)
 
 2472                 if (m_iter.block_offset() != 0)
 
 2473                     m_iter.block_externally_updated();
 
 2477             if (v.size() < 2 * block_type::size) {
 
 2478                 v.resize(2 * block_type::size);
 
 2481                 v.resize(2 * v.size());
 
 2487         assert(m_iter < m_end);
 
 2491             if (m_iter.block_offset() != 0)
 
 2514         if (
UNLIKELY(m_iter.block_offset() == 0)) {
 
 2515             if (m_prevblk != m_iter) {
 
 2516                 m_prevblk.block_externally_updated();
 
 2521         return m_bufout->operator * ();
 
 2531         if (
LIKELY(m_bufout != NULL)) m_bufout->operator ++ ();
 
 2554             while (const_out.block_offset() != 0)
 
 2556                 m_bufout->operator * () = *const_out;
 
 2557                 m_bufout->operator ++ ();
 
 2562             if (m_prevblk != m_iter) {
 
 2563                 m_prevblk.block_externally_updated();
 
 2574             v.resize(m_iter - v.begin());
 
 2596     unsigned PageSize = 4,
 
 2597     unsigned CachePages = 8,
 
 2604     typedef typename IF<Pager == 
lru,
 
 2631 #endif // !STXXL_CONTAINERS_VECTOR_HEADER 
vector_bufreader< const_iterator > bufreader_type
vector_bufreader compatible with this vector 
vector_type::reference reference
vector_iterator m_end
iterator to the end of the range. 
vector_bufreader_reverse(vector_iterator begin, vector_iterator end, unsigned_type nbuffers=0)
Create overlapped reader for the given iterator range. 
const_reverse_iterator crbegin() const 
returns a reverse_iterator pointing to the end of the vector. 
bids_container_type::bid_type bid_type
Const external vector iterator, model of ext_random_access_iterator concept. 
vector_iterator()
constructs invalid iterator 
size_type size() const 
Return remaining size. 
void _resize(size_type n)
Resize vector, only allow capacity growth. 
void read_page(int_type page_no, int_type cache_slot) const 
size_type capacity() const 
Return the number of elelemtsn for which external memory has been allocated. capacity() is always gre...
compat::remove_const< Integral >::type div_ceil(Integral n, Integral2 d)
#define STXXL_DEFAULT_BLOCK_SIZE(type)
virtual void set_size(offset_type newsize)=0
Changes the size of the file. 
std::random_access_iterator_tag iterator_category
bids_container_iterator bid(const size_type &offset)
value_type & reference
reference to value_type 
bool empty() const 
true if the vector's size is zero. 
~vector_bufreader_reverse()
Finish reading and free buffered reader. 
friend std::ostream & operator<<(std::ostream &os, const uint_pair &a)
make a uint_pair outputtable via iostreams, using unsigned long long. 
iterator::vector_type vector_type
type of the output vector 
vector< ValueType, PageSize, PagerType, BlockSize, AllocStr, SizeType > vector_type
vector_iterator< ValueType, AllocStr, SizeType, DiffType, BlockSize, PagerType, PageSize > mutable_self_type
std::vector< unsigned char > m_page_status
status of each page (valid_on_disk, uninitialized or dirty) 
std::vector< BID< block_size > > super_type
Buffered sequential reverse reader from a vector using overlapped I/O. 
const Type & STXXL_MIN(const Type &a, const Type &b)
~vector_bufwriter()
Finish writing and flush output back to vector. 
vector_iterator::bids_container_iterator bids_container_iterator
block identifier iterator of the vector 
vector_iterator::value_type value_type
value type of the output vector 
iterator end()
returns an iterator pointing beyond the end of the vector, see More Notes. 
const_vector_iterator< ValueType, AllocStr, SizeType, DiffType, BlockSize, PagerType, PageSize > self_type
void export_files(std::string filename_prefix)
Export data such that it is persistent on the file system. Resulting files will be numbered ascending...
file * get_file() const 
Get the file associated with this vector, or NULL. 
vector_iterator::block_type block_type
block type used in the vector 
super_type::size_type size_type
vector_iterator m_begin
iterator to the beginning of the range. 
#define STXXL_VERBOSE_VECTOR(msg)
void clear()
Erases all of the elements and deallocates all external memory that is occupied. 
block_offset_type block_offset() const 
return block offset of current element 
unsigned long long int uint64
vector_type::blocked_index_type blocked_index_type
iterator::iterator vector_iterator
iterator type of vector 
ValueType value_type
The type of elements stored in the vector. 
const value_type & const_reference
constant reference to value_type 
vector_bufreader(vector_iterator begin, vector_iterator end, unsigned_type nbuffers=0)
Create overlapped reader for the given iterator range. 
void rewind()
Rewind stream back to begin. Note that this recreates the buffered reader and is thus not cheap...
const_vector_iterator< ValueType, AllocStr, SizeType, DiffType, BlockSize, PagerType, PageSize > const_self_type
vector_iterator::vector_type vector_type
type of the input vector 
const vector_type * p_vector
vector_iterator m_iter
Use vector_iterator to reference a point in the vector. 
vector_bufreader_reverse(const vector_type &vec, unsigned_type nbuffers=0)
Create overlapped reader for the whole vector's content. 
reverse_iterator rend()
returns a reverse_iterator pointing beyond the beginning of the vector. 
vector(file *from, size_type size=size_type(-1), unsigned_type npages=pager_type().size())
Construct vector from a file. 
const_iterator end() const 
returns a const_iterator pointing beyond the end of the vector, see More Notes. 
Buffered sequential writer to a vector using overlapped I/O. 
bids_container_type m_bids
const_reference at(size_type offset) const 
access the element at the given vector's offset 
#define STXXL_DEFAULT_ALLOC_STRATEGY
iterator::block_type block_type
block type used in the vector 
Adapter for vector_bufreader to match iterator requirements of C++11 range-based loop construct...
vector_iterator m_iter
internal "current" iterator into the vector. 
vector_type::size_type size_type
size of remaining data 
const unsigned_type & get_block1() const 
size_type size() const 
return the size of the vector. 
vector_type::size_type size_type
Buffered sequential reader from a vector using overlapped I/O. 
vector_bufreader(const vector_type &vec, unsigned_type nbuffers=0)
Create overlapped reader for the whole vector's content. 
const_iterator cend() const 
returns a const_iterator pointing beyond the end of the vector, see More Notes. 
unsigned block_offset_type
External vector container.  Introduction to vector container: see STXXL Vector tutorial.  Design and Internals of vector container: see Vector. 
std::reverse_iterator< iterator > reverse_iterator
vector(size_type n=0, unsigned_type npages=pager_type().size())
Constructs external vector with n elements. 
unsigned_type m_nbuffers
number of blocks to use as buffers. 
Pager with random replacement strategy. 
bool is_page_cached(const blocked_index_type &offset) const 
bool empty() const 
Returns true once the whole range has been read. 
vector_iterator::vector_type vector_type
type of the input vector 
uint_pair & operator++()
prefix increment operator (directly manipulates the integer parts) 
bids_container_type::const_iterator const_bids_container_iterator
vector< ValueType, PageSize, PagerType, BlockSize, AllocStr, SizeType > vector_type
const unsigned_type & get_offset() const 
std::random_access_iterator_tag iterator_category
void reserve(size_type n)
Reserves at least n elements in external memory. 
size_type get_pos() const 
iterator::value_type value_type
value type of the output vector 
vector_bufwriter< iterator > bufwriter_type
vector_bufwriter compatible with this vector 
vector_type * parent_vector() const 
return pointer to vector containing iterator 
std::vector< int_type > m_page_to_slot
const_reference const_element(const blocked_index_type &offset) const 
vector_iterator< value_type, alloc_strategy_type, size_type, difference_type, block_size, pager_type, page_size > iterator
iterator used to iterate through a vector, see More Notes. 
void resize(size_type n)
Resize vector contents to n items. 
vector_type::size_type size_type
size of remaining data 
void page_externally_updated(unsigned_type page_no) const 
vector_type::blocked_index_type blocked_index_type
void pop_back()
Removes the last element (without returning it, see back()). 
vector_type::const_pointer pointer
bids_container_type::bid_type bid_type
vector_const_iterator m_end
iterator to the current end of the vector. 
void resize(size_type n, bool shrink_capacity)
Resize vector contents to n items, and allow the allocated external memory to shrink. Internal memory allocation remains unchanged. 
vector_type::const_reference const_reference
bids_container_type::iterator bids_container_iterator
vector(const vector &obj)
copy-constructor 
void allocate_page_cache() const 
Allocate page cache, must be called to allow access to elements. 
const_vector_iterator()
constructs invalid iterator 
void block_externally_updated(const blocked_index_type &offset) const 
const_bids_container_iterator bid(const blocked_index_type &offset) const 
const vector_type * parent_vector() const 
return pointer to vector containing iterator 
uint_pair & operator+=(const uint_pair &b)
addition operator (uses 64-bit arithmetic) 
vector_iterator(vector_type *v, size_type o)
private constructor for initializing other iterators 
iterator begin()
returns an iterator pointing to the beginning of the vector, see More Notes. 
typed_block< BlockSize, ValueType > block_type
type of the block used in disk-memory transfers 
const_reverse_iterator rbegin() const 
returns a reverse_iterator pointing to the end of the vector. 
double_blocked_index< SizeType, PageSize, block_type::size > blocked_index_type
double-index type to reference individual elements in a block 
Block containing elements of fixed length. 
reverse_iterator rbegin()
returns a reverse_iterator pointing to the end of the vector. 
unsigned block_offset_type
VectorIterator iterator
template parameter: the vector iterator type 
~vector_bufreader()
Finish reading and free buffered reader. 
Defines interface of file. 
void deallocate_page_cache() const 
allows to free the cache, but you may not access any element until call allocate_page_cache() again ...
bufreader_iterator end()
Return vector_bufreader_iterator for C++11 range-based for loop. 
vector_type::pointer pointer
vector_iterator m_iter
internal "current" iterator into the vector. 
bool operator!=(const uint_pair &b) const 
inequality checking operator 
bool operator<=(const uint_pair &b) const 
less-or-equal comparison operator 
vector_type::size_type size_type
choose_int_types< my_pointer_size >::int_type int_type
bool operator>(const uint_pair &b) const 
greater comparison operator 
vector_type::block_type block_type
iterator::const_iterator vector_const_iterator
const value_type * const_pointer
constant pointer to value_type 
size_type raw_capacity() const 
Returns the number of bytes that the vector has allocated on disks. 
blocked_index_type offset
void block_externally_updated()
super_type::value_type bid_type
Buffered input stream, reading the items in the blocks in reverse order. 
vector_type::bids_container_type bids_container_type
vector_type::bids_container_type bids_container_type
alloc_strategy_type m_alloc_strategy
unsigned_type numpages() const 
Number of pages used by the pager. 
bool operator>=(const uint_pair &b) const 
greater-or-equal comparison operator 
const_reverse_iterator crend() const 
returns a reverse_iterator pointing beyond the beginning of the vector. 
void rewind()
Rewind stream back to begin. Note that this recreates the buffered reader and is thus not cheap...
vector_type::value_type value_type
bool operator<(const uint_pair &b) const 
less-than comparison operator 
vector_type::difference_type difference_type
buf_ostream_type * m_bufout
buffered output stream used to overlapped I/O. 
#define STXXL_BEGIN_NAMESPACE
vector_iterator::bids_container_iterator bids_container_iterator
block identifier iterator of the vector 
bids_container_type::iterator bids_container_iterator
mutable_self_type iterator
vector_bufwriter(vector_iterator begin, unsigned_type nbuffers=0)
Create overlapped writer beginning at the given iterator. 
const_vector_iterator(const mutable_self_type &a)
copy-constructor from mutable iterator 
uint_pair & operator--()
prefix decrement operator (directly manipulates the integer parts) 
bids_container_type::iterator bids_container_iterator
vector_type::difference_type difference_type
bids_container_iterator bid() const 
return iterator to BID containg current element 
vector_bufreader_reverse< const_iterator > bufreader_reverse_type
vector_bufreader compatible with this vector 
vector_iterator::value_type value_type
value type of the output vector 
AllocStr alloc_strategy_type
reference element(size_type offset)
void push_back(const_reference obj)
Append a new element at the end. 
bufreader_iterator begin()
Return vector_bufreader_iterator for C++11 range-based for loop. 
double_blocked_index(size_type pos)
bool is_sorted(ForwardIterator first, ForwardIterator last, StrictWeakOrdering comp)
vector_type::const_reference reference
External vector iterator, model of ext_random_access_iterator concept. 
vector_iterator m_begin
iterator to the beginning of the range. 
value_type * pointer
pointer to value_type 
vector_bufreader_type & m_bufreader
Buffered reader used to access elements in vector. 
buf_istream< block_type, bids_container_iterator > buf_istream_type
construct output buffered stream used for overlapped reading 
buf_istream_type * m_bufin
buffered input stream used to overlapped I/O. 
vector_iterator(const self_type &a)
copy-constructor 
stxxl::int64 difference_type
unsigned_type m_nbuffers
number of blocks to use as buffers. 
buf_ostream< block_type, bids_container_iterator > buf_ostream_type
construct output buffered stream used for overlapped writing 
VectorBufReaderType vector_bufreader_type
The underlying buffered reader type. 
vector_iterator m_end
iterator to the end of the range. 
blocked_index_type offset
bids_container_iterator bid() const 
return iterator to BID containg current element 
vector_bufreader_iterator(vector_bufreader_type &bufreader, const vector_iterator &iter)
Construct iterator using vector_iterator. 
const_vector_iterator< value_type, alloc_strategy_type, size_type, difference_type, block_size, pager_type, page_size > const_iterator
constant iterator used to iterate through a vector, see More Notes. 
double_blocked_index(unsigned_type block2, unsigned_type block1, unsigned_type offset)
vector_type::const_reference const_reference
bids_container_iterator bid(const blocked_index_type &offset)
iterator::bids_container_iterator bids_container_iterator
block identifier iterator of the vector 
void write_page(int_type page_no, int_type cache_slot) const 
void wait_all(RequestIterator reqs_begin, RequestIterator reqs_end)
Collection of functions to track statuses of a number of requests. 
choose_int_types< my_pointer_size >::unsigned_type unsigned_type
block_offset_type block_offset() const 
return block offset of current element 
bool empty() const 
Returns true once the whole range has been read. 
const_reference back() const 
Returns a constant reference to the last element, see More Notes. 
reference at(size_type offset)
access the element at the given vector's offset 
IF< Pager==lru, lru_pager< CachePages >, random_pager< CachePages > >::result PagerType
void _resize_shrink_capacity(size_type n)
Resize vector, also allow reduction of external memory capacity. 
vector_iterator::block_type block_type
block type used in the vector 
SizeType size_type
an unsigned 64-bit integral type 
void finish()
Finish writing and flush output back to vector. 
vector_type::block_type block_type
vector_bufreader_type::value_type value_type
Value type of vector. 
vector< ValueType, PageSize, PagerType, BlockSize, AllocStr > result
size_type size() const 
Return remaining size. 
const_reference const_element(size_type offset) const 
const_reverse_iterator rend() const 
returns a reverse_iterator pointing beyond the beginning of the vector. 
IF template metaprogramming statement. 
const_iterator cbegin() const 
returns a const_iterator pointing to the beginning of the vector, see More Notes. ...
void block_externally_updated()
const_self_type const_iterator
std::reverse_iterator< const_iterator > const_reverse_iterator
VectorIterator vector_iterator
template parameter: the vector iterator type 
vector_type::const_pointer const_pointer
bid_vector bids_container_type
const_vector_iterator(const self_type &a)
copy-constructor 
vector_bufwriter(vector_type &vec, unsigned_type nbuffers=0)
Create overlapped writer for the vector's beginning. 
VectorIterator vector_iterator
template parameter: the vector iterator type 
stxxl::uint64 file_length() const 
void set_content(const ForwardIterator &bid_begin, const ForwardIterator &bid_end, size_type n)
Set the blocks and the size of this container explicitly. The vector must be completely empty before...
std::queue< int_type > m_free_slots
bool is_element_cached(size_type offset) const 
return true if the given vector offset is in cache 
buf_istream_reverse< block_type, bids_container_iterator > buf_istream_type
construct output buffered stream used for overlapped reading 
vector_bufreader_iterator< vector_bufreader > bufreader_iterator
construct an iterator for vector_bufreader (for C++11 range-based for loop) 
unsigned_type m_nbuffers
number of blocks to use as buffers. 
void block_externally_updated(size_type offset) const 
const_vector_iterator(const vector_type *v, size_type o)
private constructor for initializing other iterators 
vector_type::value_type value_type
size_type size_from_file_length(stxxl::uint64 file_length) const 
reference element(const blocked_index_type &offset)
vector_iterator m_iter
internal iterator into the vector. 
External vector type generator. 
simple_vector< int_type > m_slot_to_page
const_bids_container_iterator bid(const size_type &offset) const 
reference back()
Returns a reference to the last element, see More Notes. 
bool m_grown
boolean whether the vector was grown, will shorten at finish(). 
void flush() const 
Flushes the cache pages to the external memory. 
vector_type::const_pointer const_pointer
const unsigned_type & get_block2() const 
bool operator==(const uint_pair &b) const 
equality checking operator 
vector_const_iterator m_prevblk
iterator into vector of the last block accessed (used to issue updates when the block is switched)...
reference front()
Returns a reference to the first element, see More Notes. 
const_reference front() const 
Returns a constant reference to the first element, see More Notes. 
#define STXXL_END_NAMESPACE
simple_vector< block_type > * m_cache
const_iterator begin() const 
returns a const_iterator pointing to the beginning of the vector, see More Notes. ...
vector_iterator< ValueType, AllocStr, SizeType, DiffType, BlockSize, PagerType, PageSize > self_type
vector_bufreader_type::vector_iterator vector_iterator
Use vector_iterator to reference a point in the vector. 
buf_istream_type * m_bufin
buffered input stream used to overlapped I/O. 
void swap(vector &obj)
swap content