15 #ifndef STXXL_VECTOR_HEADER
16 #define STXXL_VECTOR_HEADER
22 #include <stxxl/bits/deprecated.h>
23 #include <stxxl/bits/io/request_operations.h>
24 #include <stxxl/bits/mng/mng.h>
25 #include <stxxl/bits/mng/typed_block.h>
26 #include <stxxl/bits/common/tmeta.h>
27 #include <stxxl/bits/containers/pager.h>
28 #include <stxxl/bits/common/is_sorted.h>
31 __STXXL_BEGIN_NAMESPACE
42 template <
typename size_type,
size_type modulo2,
size_type modulo1>
43 class double_blocked_index
45 static const size_type modulo12 = modulo1 * modulo2;
47 size_type pos, block1, block2, offset;
51 void set(size_type pos)
54 block2 = pos / modulo12;
55 pos -= block2 * modulo12;
56 block1 = pos / modulo1;
57 offset = (pos - block1 * modulo1);
59 assert(block2 * modulo12 + block1 * modulo1 + offset == this->pos);
60 assert( block1 < modulo2);
61 assert( offset < modulo1);
65 double_blocked_index()
70 double_blocked_index(size_type pos)
75 double_blocked_index(size_type block2, size_type block1, size_type offset)
77 assert( block1 < modulo2);
78 assert( offset < modulo1);
80 this->block2 = block2;
81 this->block1 = block1;
82 this->offset = offset;
83 pos = block2 * modulo12 + block1 * modulo1 + offset;
86 double_blocked_index & operator = (size_type pos)
93 double_blocked_index & operator ++ ()
97 if (offset == modulo1)
101 if (block1 == modulo2)
108 assert(block2 * modulo12 + block1 * modulo1 + offset == this->pos);
109 assert( block1 < modulo2);
110 assert( offset < modulo1);
116 double_blocked_index operator ++ (
int)
118 double_blocked_index former(*
this);
124 double_blocked_index & operator -- ()
139 assert(block2 * modulo12 + block1 * modulo1 + offset == this->pos);
140 assert( block1 < modulo2);
141 assert( offset < modulo1);
147 double_blocked_index operator -- (
int)
149 double_blocked_index former(*
this);
154 double_blocked_index operator + (size_type addend)
const
156 return double_blocked_index(pos + addend);
159 double_blocked_index & operator += (size_type addend)
165 double_blocked_index operator - (size_type addend)
const
167 return double_blocked_index(pos - addend);
170 size_type operator - (
const double_blocked_index & dbi2)
const
172 return pos - dbi2.pos;
175 double_blocked_index & operator -= (size_type subtrahend)
177 set(pos - subtrahend);
181 bool operator == (
const double_blocked_index & dbi2)
const
183 return pos == dbi2.pos;
186 bool operator != (
const double_blocked_index & dbi2)
const
188 return pos != dbi2.pos;
191 bool operator < (
const double_blocked_index & dbi2)
const
193 return pos < dbi2.pos;
196 bool operator <= (
const double_blocked_index & dbi2)
const
198 return pos <= dbi2.pos;
201 bool operator > (
const double_blocked_index & dbi2)
const
203 return pos > dbi2.pos;
206 bool operator >= (
const double_blocked_index & dbi2)
const
208 return pos >= dbi2.pos;
211 double_blocked_index & operator >>= (size_type shift)
217 size_type get_pos()
const
222 const size_type & get_block2()
const
227 const size_type & get_block1()
const
232 const size_type & get_offset()
const
239 template <
unsigned BlkSize_>
240 class bid_vector :
public std::vector<BID<BlkSize_> >
243 typedef std::vector<BID<BlkSize_> > _Derived;
244 typedef typename _Derived::size_type size_type;
245 typedef typename _Derived::value_type bid_type;
247 bid_vector(size_type _sz) : _Derived(_sz)
262 template <
typename Tp_,
typename AllocStr_,
typename SzTp_,
typename DiffTp_,
263 unsigned BlkSize_,
typename PgTp_,
unsigned PgSz_>
268 template <
typename Tp_,
typename AllocStr_,
typename SzTp_,
typename DiffTp_,
269 unsigned BlkSize_,
typename PgTp_,
unsigned PgSz_>
281 typedef unsigned block_offset_type;
283 friend class vector<Tp_, PgSz_, PgTp_, BlkSize_, AllocStr_, SzTp_>;
284 typedef typename vector_type::bids_container_type bids_container_type;
285 typedef typename bids_container_type::iterator bids_container_iterator;
286 typedef typename bids_container_type::bid_type bid_type;
288 typedef typename vector_type::blocked_index_type blocked_index_type;
290 typedef std::random_access_iterator_tag iterator_category;
291 typedef typename vector_type::size_type size_type;
292 typedef typename vector_type::difference_type difference_type;
293 typedef typename vector_type::value_type value_type;
294 typedef typename vector_type::reference reference;
295 typedef typename vector_type::const_reference const_reference;
296 typedef typename vector_type::pointer pointer;
297 typedef typename vector_type::const_pointer const_pointer;
300 blocked_index_type offset;
312 p_vector(a.p_vector) { }
314 block_offset_type block_offset()
const
316 return static_cast<block_offset_type
>(offset.get_offset());
318 bids_container_iterator bid()
const
320 return p_vector->bid(offset);
323 difference_type operator - (
const _Self & a)
const
325 return offset - a.offset;
330 return offset - a.offset;
333 _Self operator - (size_type op)
const
335 return _Self(p_vector, offset.get_pos() - op);
338 _Self operator + (size_type op)
const
340 return _Self(p_vector, offset.get_pos() + op);
343 _Self & operator -= (size_type op)
349 _Self & operator += (size_type op)
355 reference operator * ()
357 return p_vector->element(offset);
360 pointer operator -> ()
362 return &(p_vector->element(offset));
365 const_reference operator * ()
const
367 return p_vector->const_element(offset);
370 const_pointer operator -> ()
const
372 return &(p_vector->const_element(offset));
375 reference operator [] (size_type op)
377 return p_vector->element(offset.get_pos() + op);
380 const_reference operator [] (size_type op)
const
382 return p_vector->const_element(offset.get_pos() + op);
385 void block_externally_updated()
387 p_vector->block_externally_updated(offset);
390 _STXXL_DEPRECATED(
void touch())
392 block_externally_updated();
395 _Self & operator ++ ()
400 _Self operator ++ (
int)
406 _Self & operator -- ()
411 _Self operator -- (
int)
417 bool operator == (
const _Self & a)
const
419 assert(p_vector == a.p_vector);
420 return offset == a.offset;
422 bool operator != (
const _Self & a)
const
424 assert(p_vector == a.p_vector);
425 return offset != a.offset;
427 bool operator < (
const _Self & a)
const
429 assert(p_vector == a.p_vector);
430 return offset < a.offset;
432 bool operator <= (
const _Self & a)
const
434 assert(p_vector == a.p_vector);
435 return offset <= a.offset;
437 bool operator > (
const _Self & a)
const
439 assert(p_vector == a.p_vector);
440 return offset > a.offset;
442 bool operator >= (
const _Self & a)
const
444 assert(p_vector == a.p_vector);
445 return offset >= a.offset;
450 assert(p_vector == a.p_vector);
451 return offset == a.offset;
455 assert(p_vector == a.p_vector);
456 return offset != a.offset;
460 assert(p_vector == a.p_vector);
461 return offset < a.offset;
465 assert(p_vector == a.p_vector);
466 return offset <= a.offset;
470 assert(p_vector == a.p_vector);
471 return offset > a.offset;
475 assert(p_vector == a.p_vector);
476 return offset >= a.offset;
484 std::ostream & operator << (std::ostream & o)
const
486 o <<
"vectorpointer: " << ((
void *)p_vector) <<
" offset: " << offset;
493 template <
typename Tp_,
typename AllocStr_,
typename SzTp_,
typename DiffTp_,
494 unsigned BlkSize_,
typename PgTp_,
unsigned PgSz_>
500 friend class vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_>;
503 typedef _Self const_iterator;
504 typedef _NonConstIterator iterator;
506 typedef unsigned block_offset_type;
508 friend class vector<Tp_, PgSz_, PgTp_, BlkSize_, AllocStr_, SzTp_>;
509 typedef typename vector_type::bids_container_type bids_container_type;
510 typedef typename bids_container_type::iterator bids_container_iterator;
511 typedef typename bids_container_type::bid_type bid_type;
512 typedef typename vector_type::block_type block_type;
513 typedef typename vector_type::blocked_index_type blocked_index_type;
515 typedef std::random_access_iterator_tag iterator_category;
516 typedef typename vector_type::size_type size_type;
517 typedef typename vector_type::difference_type difference_type;
518 typedef typename vector_type::value_type value_type;
519 typedef typename vector_type::const_reference reference;
520 typedef typename vector_type::const_reference const_reference;
521 typedef typename vector_type::const_pointer pointer;
522 typedef typename vector_type::const_pointer const_pointer;
525 blocked_index_type offset;
526 const vector_type * p_vector;
546 block_offset_type block_offset()
const
548 return static_cast<block_offset_type
>(offset.get_offset());
550 bids_container_iterator bid()
const
552 return ((vector_type *)p_vector)->bid(offset);
555 difference_type operator - (
const _Self & a)
const
557 return offset - a.offset;
560 difference_type operator - (
const iterator & a)
const
562 return offset - a.offset;
565 _Self operator - (size_type op)
const
567 return _Self(p_vector, offset.get_pos() - op);
570 _Self operator + (size_type op)
const
572 return _Self(p_vector, offset.get_pos() + op);
575 _Self & operator -= (size_type op)
581 _Self & operator += (size_type op)
587 const_reference operator * ()
const
589 return p_vector->const_element(offset);
592 const_pointer operator -> ()
const
594 return &(p_vector->const_element(offset));
597 const_reference operator [] (size_type op)
const
599 return p_vector->const_element(offset.get_pos() + op);
602 void block_externally_updated()
604 p_vector->block_externally_updated(offset);
607 _STXXL_DEPRECATED(
void touch())
609 block_externally_updated();
612 _Self & operator ++ ()
617 _Self operator ++ (
int)
623 _Self & operator -- ()
628 _Self operator -- (
int)
634 bool operator == (
const _Self & a)
const
636 assert(p_vector == a.p_vector);
637 return offset == a.offset;
639 bool operator != (
const _Self & a)
const
641 assert(p_vector == a.p_vector);
642 return offset != a.offset;
644 bool operator < (
const _Self & a)
const
646 assert(p_vector == a.p_vector);
647 return offset < a.offset;
649 bool operator <= (
const _Self & a)
const
651 assert(p_vector == a.p_vector);
652 return offset <= a.offset;
654 bool operator > (
const _Self & a)
const
656 assert(p_vector == a.p_vector);
657 return offset > a.offset;
659 bool operator >= (
const _Self & a)
const
661 assert(p_vector == a.p_vector);
662 return offset >= a.offset;
665 bool operator == (
const iterator & a)
const
667 assert(p_vector == a.p_vector);
668 return offset == a.offset;
670 bool operator != (
const iterator & a)
const
672 assert(p_vector == a.p_vector);
673 return offset != a.offset;
675 bool operator < (
const iterator & a)
const
677 assert(p_vector == a.p_vector);
678 return offset < a.offset;
680 bool operator <= (
const iterator & a)
const
682 assert(p_vector == a.p_vector);
683 return offset <= a.offset;
685 bool operator > (
const iterator & a)
const
687 assert(p_vector == a.p_vector);
688 return offset > a.offset;
690 bool operator >= (
const iterator & a)
const
692 assert(p_vector == a.p_vector);
693 return offset >= a.offset;
702 std::ostream & operator << (std::ostream & o)
const
704 o <<
"vector pointer: " << ((
void *)p_vector) <<
" offset: " << offset;
729 unsigned BlkSize_ = STXXL_DEFAULT_BLOCK_SIZE(Tp_),
730 typename AllocStr_ = STXXL_DEFAULT_ALLOC_STRATEGY,
731 typename SzTp_ = stxxl::uint64
736 typedef Tp_ value_type;
737 typedef value_type & reference;
738 typedef const value_type & const_reference;
739 typedef value_type * pointer;
740 typedef SzTp_ size_type;
741 typedef stxxl::int64 difference_type;
742 typedef const value_type * const_pointer;
744 typedef PgTp_ pager_type;
745 typedef AllocStr_ alloc_strategy_type;
748 block_size = BlkSize_,
750 n_pages = pager_type::n_pages,
755 difference_type, block_size, pager_type, page_size> iterator;
756 friend class vector_iterator<value_type, alloc_strategy_type, size_type, difference_type, block_size, pager_type, page_size>;
758 size_type, difference_type, block_size, pager_type, page_size> const_iterator;
759 friend class const_vector_iterator<value_type, alloc_strategy_type, size_type, difference_type, block_size, pager_type, page_size>;
760 typedef std::reverse_iterator<iterator> reverse_iterator;
761 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
763 typedef bid_vector<block_size> bids_container_type;
764 typedef typename bids_container_type::iterator bids_container_iterator;
765 typedef typename bids_container_type::const_iterator const_bids_container_iterator;
768 typedef double_blocked_index<SzTp_, PgSz_, block_type::size> blocked_index_type;
771 alloc_strategy_type alloc_strategy;
773 bids_container_type _bids;
774 mutable pager_type pager;
776 enum { valid_on_disk = 0, uninitialized = 1, dirty = 2 };
777 mutable std::vector<unsigned char> _page_status;
778 mutable std::vector<int_type> _page_to_slot;
779 mutable simple_vector<int_type> _slot_to_page;
780 mutable std::queue<int_type> _free_slots;
781 mutable simple_vector<block_type> * _cache;
787 size_type size_from_file_length(stxxl::uint64 file_length)
const
792 return (cur_size + rest / stxxl::uint64(
sizeof(value_type)));
795 stxxl::uint64 file_length()
const
797 typedef stxxl::uint64 file_size_type;
798 size_type cur_size = size();
811 _bids(div_ceil(n, block_type::size)),
812 _page_status(div_ceil(_bids.size(), page_size)),
813 _page_to_slot(div_ceil(_bids.size(), page_size)),
814 _slot_to_page(n_pages),
819 bm = block_manager::get_instance();
820 cfg = config::get_instance();
822 allocate_page_cache();
823 int_type all_pages = div_ceil(_bids.size(), page_size);
825 for ( ; i < all_pages; ++i)
827 _page_status[i] = uninitialized;
828 _page_to_slot[i] = on_disk;
831 for (i = 0; i < n_pages; ++i)
834 bm->
new_blocks(alloc_strategy, _bids.begin(), _bids.end(), 0);
839 std::swap(alloc_strategy, obj.alloc_strategy);
840 std::swap(_size, obj._size);
841 std::swap(_bids, obj._bids);
842 std::swap(pager, obj.pager);
843 std::swap(_page_status, obj._page_status);
844 std::swap(_page_to_slot, obj._page_to_slot);
845 std::swap(_slot_to_page, obj._slot_to_page);
846 std::swap(_free_slots, obj._free_slots);
847 std::swap(_cache, obj._cache);
848 std::swap(_from, obj._from);
849 std::swap(exported, obj.exported);
852 void allocate_page_cache()
const
855 _cache =
new simple_vector<block_type>(n_pages * page_size);
859 void deallocate_page_cache()
const
866 size_type capacity()
const
876 void reserve(size_type n)
881 unsigned_type old_bids_size = _bids.size();
883 unsigned_type new_pages = div_ceil(new_bids_size, page_size);
884 _page_status.resize(new_pages, uninitialized);
885 _page_to_slot.resize(new_pages, on_disk);
887 _bids.resize(new_bids_size);
890 bm->
new_blocks(alloc_strategy, _bids.begin() + old_bids_size, _bids.end(), old_bids_size);
895 bids_container_iterator it = _bids.begin() + old_bids_size;
898 (*it).storage = _from;
899 (*it).offset = offset;
901 STXXL_VERBOSE1(
"vector::reserve(): Changing size of file " << ((
void *)_from) <<
" to "
907 void resize(size_type n)
912 void resize(size_type n,
bool shrink_capacity)
915 _resize_shrink_capacity(n);
921 void _resize(size_type n)
926 unsigned_type first_page_to_evict = div_ceil(n,
block_type::size * page_size);
927 for (unsigned_type i = first_page_to_evict; i < _page_status.size(); ++i) {
928 if (_page_to_slot[i] != on_disk) {
929 _free_slots.push(_page_to_slot[i]);
930 _page_to_slot[i] = on_disk;
932 _page_status[i] = uninitialized;
938 void _resize_shrink_capacity(size_type n)
940 unsigned_type old_bids_size = _bids.size();
943 if (new_bids_size > old_bids_size)
947 else if (new_bids_size < old_bids_size)
952 bm->
delete_blocks(_bids.begin() + old_bids_size, _bids.end());
954 _bids.resize(new_bids_size);
955 unsigned_type new_pages = div_ceil(new_bids_size, page_size);
956 _page_status.resize(new_pages);
958 unsigned_type first_page_to_evict = div_ceil(new_bids_size, page_size);
960 std::fill(_page_status.begin() + first_page_to_evict,
961 _page_status.end(), (
unsigned char)valid_on_disk);
975 _page_status.clear();
976 _page_to_slot.clear();
977 while (!_free_slots.empty())
981 for (int_type i = 0; i < n_pages; ++i)
985 void push_back(const_reference obj)
987 size_type old_size = _size;
988 resize(old_size + 1);
989 element(old_size) = obj;
998 return element(_size - 1);
1004 const_reference back()
const
1006 return const_element(_size - 1);
1008 const_reference front()
const
1010 return const_element(0);
1019 _size((size == size_type(-1)) ? size_from_file_length(from->size()) : size),
1020 _bids(div_ceil(_size, size_type(
block_type::size))),
1021 _page_status(div_ceil(_bids.size(), page_size)),
1022 _page_to_slot(div_ceil(_bids.size(), page_size)),
1023 _slot_to_page(n_pages),
1031 std::ostringstream str_;
1032 str_ <<
"The block size for a vector that is mapped to a file must be a multiple of the element size (" <<
1033 sizeof(value_type) <<
") and the page size (4096).";
1034 throw std::runtime_error(str_.str());
1037 bm = block_manager::get_instance();
1038 cfg = config::get_instance();
1040 allocate_page_cache();
1041 int_type all_pages = div_ceil(_bids.size(), page_size);
1043 for ( ; i < all_pages; ++i)
1045 _page_status[i] = valid_on_disk;
1046 _page_to_slot[i] = on_disk;
1049 for (i = 0; i < n_pages; ++i)
1050 _free_slots.push(i);
1054 size_type offset = 0;
1055 bids_container_iterator it = _bids.begin();
1056 for ( ; it != _bids.end(); ++it, offset += size_type(block_type::raw_size))
1058 (*it).storage = from;
1059 (*it).offset = offset;
1066 _bids(div_ceil(obj.size(), block_type::size)),
1067 _page_status(div_ceil(_bids.size(), page_size)),
1068 _page_to_slot(div_ceil(_bids.size(), page_size)),
1069 _slot_to_page(n_pages),
1074 assert(!obj.exported);
1075 bm = block_manager::get_instance();
1076 cfg = config::get_instance();
1078 allocate_page_cache();
1079 int_type all_pages = div_ceil(_bids.size(), page_size);
1081 for ( ; i < all_pages; ++i)
1083 _page_status[i] = uninitialized;
1084 _page_to_slot[i] = on_disk;
1087 for (i = 0; i < n_pages; ++i)
1088 _free_slots.push(i);
1090 bm->
new_blocks(alloc_strategy, _bids.begin(), _bids.end(), 0);
1092 const_iterator inbegin = obj.begin();
1093 const_iterator inend = obj.end();
1094 std::copy(inbegin, inend, begin());
1107 size_type size()
const
1117 return iterator(
this, 0);
1119 const_iterator begin()
const
1121 return const_iterator(
this, 0);
1123 const_iterator cbegin()
const
1129 return iterator(
this, _size);
1131 const_iterator end()
const
1133 return const_iterator(
this, _size);
1135 const_iterator cend()
const
1140 reverse_iterator rbegin()
1142 return reverse_iterator(end());
1144 const_reverse_iterator rbegin()
const
1146 return const_reverse_iterator(end());
1148 const_reverse_iterator crbegin()
const
1150 return const_reverse_iterator(end());
1152 reverse_iterator rend()
1154 return reverse_iterator(begin());
1156 const_reverse_iterator rend()
const
1158 return const_reverse_iterator(begin());
1160 const_reverse_iterator crend()
const
1162 return const_reverse_iterator(begin());
1165 reference operator [] (size_type offset)
1167 return element(offset);
1169 const_reference operator [] (size_type offset)
const
1171 return const_element(offset);
1174 bool is_element_cached(size_type offset)
const
1176 return is_page_cached(blocked_index_type(offset));
1181 simple_vector<bool> non_free_slots(n_pages);
1183 for ( ; i < n_pages; i++)
1184 non_free_slots[i] =
true;
1186 while (!_free_slots.empty())
1188 non_free_slots[_free_slots.front()] =
false;
1192 for (i = 0; i < n_pages; i++)
1194 _free_slots.push(i);
1195 int_type page_no = _slot_to_page[i];
1196 if (non_free_slots[i])
1198 STXXL_VERBOSE1(
"vector: flushing page " << i <<
" at address "
1200 write_page(page_no, i);
1202 _page_to_slot[page_no] = on_disk;
1209 STXXL_VERBOSE(
"~vector()");
1216 STXXL_ERRMSG(
"io_error thrown in ~vector(): " << e.what());
1220 STXXL_ERRMSG(
"Exception thrown in ~vector()");
1229 STXXL_VERBOSE1(
"~vector(): Changing size of file " << ((
void *)_from) <<
" to "
1231 STXXL_VERBOSE1(
"~vector(): size of the vector is " << size());
1238 STXXL_ERRMSG(
"Exception thrown in ~vector()...set_size()");
1250 for (bids_container_iterator i = _bids.begin(); i != _bids.end(); ++i) {
1251 std::ostringstream number;
1252 number << std::setw(9) << std::setfill(
'0') << no;
1253 size_type current_block_size =
1256 block_type::size *
sizeof(value_type);
1257 (*i).storage->export_files((*i).offset, current_block_size, filename_prefix + number.str());
1271 template <
typename ForwardIterator>
1272 void set_content(
const ForwardIterator & bid_begin,
const ForwardIterator & bid_end, size_type n)
1275 _bids.resize(new_bids_size);
1276 std::copy(bid_begin, bid_end, _bids.begin());
1277 unsigned_type new_pages = div_ceil(new_bids_size, page_size);
1278 _page_status.resize(new_pages, valid_on_disk);
1279 _page_to_slot.resize(new_pages, on_disk);
1284 bids_container_iterator bid(
const size_type & offset)
1286 return (_bids.begin() +
1287 static_cast<typename bids_container_type::size_type
>
1290 bids_container_iterator bid(
const blocked_index_type & offset)
1292 return (_bids.begin() +
1293 static_cast<typename bids_container_type::size_type
>
1294 (offset.get_block2() * PgSz_ + offset.get_block1()));
1296 const_bids_container_iterator bid(
const size_type & offset)
const
1298 return (_bids.begin() +
1299 static_cast<typename bids_container_type::size_type
>
1302 const_bids_container_iterator bid(
const blocked_index_type & offset)
const
1304 return (_bids.begin() +
1305 static_cast<typename bids_container_type::size_type
>
1306 (offset.get_block2() * PgSz_ + offset.get_block1()));
1309 void read_page(int_type page_no, int_type cache_slot)
const
1311 if (_page_status[page_no] == uninitialized)
1313 STXXL_VERBOSE1(
"vector " <<
this <<
": reading page_no=" << page_no <<
" cache_slot=" << cache_slot);
1315 int_type block_no = page_no * page_size;
1316 int_type last_block = STXXL_MIN(block_no + page_size, int_type(_bids.size()));
1317 int_type i = cache_slot * page_size, j = 0;
1318 for ( ; block_no < last_block; ++block_no, ++i, ++j)
1320 reqs[j] = (*_cache)[i].read(_bids[block_no]);
1322 assert(last_block - page_no * page_size > 0);
1323 wait_all(reqs, last_block - page_no * page_size);
1326 void write_page(int_type page_no, int_type cache_slot)
const
1328 if (!(_page_status[page_no] & dirty))
1330 STXXL_VERBOSE1(
"vector " <<
this <<
": writing page_no=" << page_no <<
" cache_slot=" << cache_slot);
1332 int_type block_no = page_no * page_size;
1333 int_type last_block = STXXL_MIN(block_no + page_size, int_type(_bids.size()));
1334 int_type i = cache_slot * page_size, j = 0;
1335 for ( ; block_no < last_block; ++block_no, ++i, ++j)
1337 reqs[j] = (*_cache)[i].write(_bids[block_no]);
1339 _page_status[page_no] = valid_on_disk;
1340 assert(last_block - page_no * page_size > 0);
1341 wait_all(reqs, last_block - page_no * page_size);
1345 reference element(size_type offset)
1347 #ifdef STXXL_RANGE_CHECK
1348 assert(offset < size());
1350 return element(blocked_index_type(offset));
1353 reference element(
const blocked_index_type & offset)
1355 #ifdef STXXL_RANGE_CHECK
1356 assert(offset.get_pos() < size());
1358 int_type page_no = offset.get_block2();
1359 assert(page_no < int_type(_page_to_slot.size()));
1360 int_type cache_slot = _page_to_slot[page_no];
1363 if (_free_slots.empty())
1365 int_type kicked_slot = pager.kick();
1366 pager.hit(kicked_slot);
1367 int_type old_page_no = _slot_to_page[kicked_slot];
1368 _page_to_slot[page_no] = kicked_slot;
1369 _page_to_slot[old_page_no] = on_disk;
1370 _slot_to_page[kicked_slot] = page_no;
1372 write_page(old_page_no, kicked_slot);
1373 read_page(page_no, kicked_slot);
1375 _page_status[page_no] = dirty;
1377 return (*_cache)[kicked_slot * page_size + offset.get_block1()][offset.get_offset()];
1381 int_type free_slot = _free_slots.front();
1383 pager.hit(free_slot);
1384 _page_to_slot[page_no] = free_slot;
1385 _slot_to_page[free_slot] = page_no;
1387 read_page(page_no, free_slot);
1389 _page_status[page_no] = dirty;
1391 return (*_cache)[free_slot * page_size + offset.get_block1()][offset.get_offset()];
1396 _page_status[page_no] = dirty;
1397 pager.hit(cache_slot);
1398 return (*_cache)[cache_slot * page_size + offset.get_block1()][offset.get_offset()];
1403 void page_externally_updated(unsigned_type page_no)
const
1406 assert(page_no < _page_status.size());
1408 assert(!(_page_status[page_no] & dirty));
1409 if (_page_to_slot[page_no] != on_disk) {
1411 _free_slots.push(_page_to_slot[page_no]);
1412 _page_to_slot[page_no] = on_disk;
1414 _page_status[page_no] = valid_on_disk;
1417 void block_externally_updated(size_type offset)
const
1422 void block_externally_updated(
const blocked_index_type & offset)
const
1424 page_externally_updated(offset.get_block2());
1427 _STXXL_DEPRECATED(
void touch(size_type offset)
const)
1432 _STXXL_DEPRECATED(
void touch(
const blocked_index_type & offset)
const)
1434 page_externally_updated(offset.get_block2());
1437 const_reference const_element(size_type offset)
const
1439 return const_element(blocked_index_type(offset));
1442 const_reference const_element(
const blocked_index_type & offset)
const
1444 int_type page_no = offset.get_block2();
1445 assert(page_no < int_type(_page_to_slot.size()));
1446 int_type cache_slot = _page_to_slot[page_no];
1449 if (_free_slots.empty())
1451 int_type kicked_slot = pager.kick();
1452 pager.hit(kicked_slot);
1453 int_type old_page_no = _slot_to_page[kicked_slot];
1454 _page_to_slot[page_no] = kicked_slot;
1455 _page_to_slot[old_page_no] = on_disk;
1456 _slot_to_page[kicked_slot] = page_no;
1458 write_page(old_page_no, kicked_slot);
1459 read_page(page_no, kicked_slot);
1461 return (*_cache)[kicked_slot * page_size + offset.get_block1()][offset.get_offset()];
1465 int_type free_slot = _free_slots.front();
1467 pager.hit(free_slot);
1468 _page_to_slot[page_no] = free_slot;
1469 _slot_to_page[free_slot] = page_no;
1471 read_page(page_no, free_slot);
1473 return (*_cache)[free_slot * page_size + offset.get_block1()][offset.get_offset()];
1478 pager.hit(cache_slot);
1479 return (*_cache)[cache_slot * page_size + offset.get_block1()][offset.get_offset()];
1483 bool is_page_cached(
const blocked_index_type & offset)
const
1485 int_type page_no = offset.get_block2();
1486 assert(page_no < int_type(_page_to_slot.size()));
1487 int_type cache_slot = _page_to_slot[page_no];
1488 return (cache_slot >= 0);
1499 inline bool operator == (stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1500 AllocStr_, SzTp_> & a,
1501 stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1502 AllocStr_, SzTp_> & b)
1504 return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());
1514 inline bool operator != (stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1515 AllocStr_, SzTp_> & a,
1516 stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1517 AllocStr_, SzTp_> & b)
1529 inline bool operator < (stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1530 AllocStr_, SzTp_> & a,
1531 stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1532 AllocStr_, SzTp_> & b)
1534 return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
1544 inline bool operator > (stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1545 AllocStr_, SzTp_> & a,
1546 stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1547 AllocStr_, SzTp_> & b)
1559 inline bool operator <= (stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1560 AllocStr_, SzTp_> & a,
1561 stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1562 AllocStr_, SzTp_> & b)
1574 inline bool operator >= (stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1575 AllocStr_, SzTp_> & a,
1576 stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_,
1577 AllocStr_, SzTp_> & b)
1587 template <
typename Tp_,
typename AllocStr_,
typename SzTp_,
typename DiffTp_,
1588 unsigned BlkSize_,
typename PgTp_,
unsigned PgSz_>
1590 stxxl::vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_> __first,
1591 stxxl::vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_> __last)
1593 return is_sorted_helper(
1594 stxxl::const_vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_>(__first),
1595 stxxl::const_vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_>(__last));
1598 template <
typename Tp_,
typename AllocStr_,
typename SzTp_,
typename DiffTp_,
1599 unsigned BlkSize_,
typename PgTp_,
unsigned PgSz_,
typename _StrictWeakOrdering>
1601 stxxl::vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_> __first,
1602 stxxl::vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_> __last,
1603 _StrictWeakOrdering __comp)
1605 return is_sorted_helper(
1606 stxxl::const_vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_>(__first),
1607 stxxl::const_vector_iterator<Tp_, AllocStr_, SzTp_, DiffTp_, BlkSize_, PgTp_, PgSz_>(__last),
1642 unsigned Pages_ = 8,
1643 unsigned BlkSize_ = STXXL_DEFAULT_BLOCK_SIZE(Tp_),
1644 typename AllocStr_ = STXXL_DEFAULT_ALLOC_STRATEGY,
1645 pager_type Pager_ = lru
1649 typedef typename IF<Pager_ == lru,
1658 __STXXL_END_NAMESPACE
1670 void swap(stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_, AllocStr_, SzTp_> & a,
1671 stxxl::vector<Tp_, PgSz_, PgTp_, BlkSize_, AllocStr_, SzTp_> & b)
1677 #endif // !STXXL_VECTOR_HEADER
virtual void set_size(offset_type newsize)=0
Changes the size of the file.
Defines interface of file.
Definition: file.h:90
file * get_file() const
Get the file associated with this vector, or NULL.
Definition: vector.h:1264
Block containing elements of fixed length.
Definition: typed_block.h:223
size of block in bytes
Definition: typed_block.h:239
number of elements in block
Definition: typed_block.h:240
no meta info, bids or (non-empty) fillers included in the block, allows value_type array addressing a...
Definition: typed_block.h:241
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...
Definition: vector.h:1272
void export_files(std::string filename_prefix)
Export data such that it is persistent on the file system. Resulting files will be numbered ascending...
Definition: vector.h:1247
void delete_blocks(const BIDIteratorClass &bidbegin, const BIDIteratorClass &bidend)
Deallocates blocks.
Definition: mng.h:218
Pager with random replacement strategy.
Definition: pager.h:38
External vector container.
Definition: vector.h:259
void new_blocks(const DiskAssignFunctor &functor, BIDIteratorClass bidbegin, BIDIteratorClass bidend, unsigned_type offset=0)
Allocates new blocks.
Definition: mng.h:90
Implemented as reference counting smart pointer.
Definition: request_ptr.h:34
void wait_all(request_iterator_ reqs_begin, request_iterator_ reqs_end)
Collection of functions to track statuses of a number of requests.
Definition: request_operations.h:36
size_type raw_capacity() const
Returns the number of bytes that the vector has allocated on disks.
Definition: vector.h:871
vector(file *from, size_type size=size_type(-1))
Construct vector from a file.
Definition: vector.h:1018
Const external vector iterator, model of ext_random_access_iterator concept.
Definition: vector.h:264
Block manager class.
Definition: mng.h:59
IF template metaprogramming statement.
Definition: tmeta.h:31
External vector type generator.
Definition: vector.h:1647
Access point to disks properties.
Definition: config.h:31
External vector iterator, model of ext_random_access_iterator concept.
Definition: vector.h:270