46 template<
class T,
unsigned char pks = 5>
class dynamic_array;
51 typedef value_type* pointer;
52 typedef value_type& reference;
53 typedef size_t size_type;
54 typedef ptrdiff_t difference_type;
55 typedef std::random_access_iterator_tag iterator_category;
57 # define DNAMPKS__ ((size_type(1) << pks) - 1)
64 { p = &da; in = ii; pT = p->pt_to(in); }
66 inline size_type index(
void)
const {
return in; }
70 if ((++in)&DNAMPKS__) pT++;
else pT=p->pt_to(in);
return tmp;
75 if ((in--)&DNAMPKS__) pT--;
else pT=p->pt_to(in);
return tmp;
79 {
if ((++in)&DNAMPKS__) pT++;
else pT=p->pt_to(in);
return *
this; }
82 {
if ((in--)&DNAMPKS__) pT--;
else pT=p->pt_to(in);
return *
this; }
85 { in += i; pT=p->pt_to(in);
return *
this; }
88 { in -= i; pT=p->pt_to(in);
return *
this; }
97 {
return difference_type(in - i.in); }
99 reference operator *()
const {
return (*pT); }
100 pointer operator ->()
const {
return pT; }
101 reference operator [](size_type ii)
const {
return (*p)[in+ii]; }
103 bool operator ==(
const dna_iterator &i)
const {
return (i.in==in);}
104 bool operator !=(
const dna_iterator &i)
const {
return (i.in!=in);}
105 bool operator < (
const dna_iterator &i)
const {
return ( in<i.in);}
106 bool operator >=(
const dna_iterator &i)
const {
return ( in>=i.in);}
107 bool operator > (
const dna_iterator &i)
const {
return ( in>i.in);}
112 typedef T value_type;
113 typedef const value_type* pointer;
114 typedef const value_type& reference;
115 typedef size_t size_type;
116 typedef ptrdiff_t difference_type;
117 typedef std::random_access_iterator_tag iterator_category;
119 # define DNAMPKS__ ((size_type(1) << pks) - 1)
126 { p = &da; in = ii; pT = p->pt_to(in); }
128 : p(it.p), in(it.in), pT(it.pT) {}
130 inline size_type index(
void)
const {
return in; }
133 if ((++in)&DNAMPKS__) pT++;
else pT=p->pt_to(in);
return tmp;
137 if ((in--)&DNAMPKS__) pT--;
else pT=p->pt_to(in);
return tmp;
140 {
if ((++in)&DNAMPKS__) pT++;
else pT=p->pt_to(in);
return *
this; }
142 {
if ((in--)&DNAMPKS__) pT--;
else pT=p->pt_to(in);
return *
this; }
144 { in += i; pT=p->pt_to(in);
return *
this; }
146 { in -= i; pT=p->pt_to(in);
return *
this; }
152 {
return difference_type(in - i.in); }
154 reference operator *()
const {
return (*pT); }
155 pointer operator ->()
const {
return pT; }
156 reference operator [](size_type ii)
const {
return (*p)[in+ii]; }
159 {
return (i.in == in); }
161 {
return (i.in != in); }
163 {
return (in < i.in); }
165 {
return (i.in >= in); }
167 {
return (in > i.in); }
198 typedef T value_type;
199 typedef value_type* pointer;
200 typedef const value_type* const_pointer;
201 typedef value_type& reference;
202 typedef const value_type& const_reference;
203 typedef size_t size_type;
204 typedef ptrdiff_t difference_type;
205 typedef unsigned char pack_size_type;
206 typedef std::vector<std::unique_ptr<T[]>> pointer_array;
209 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
210 typedef std::reverse_iterator<iterator> reverse_iterator;
214 # define DNAMPKS__ ((size_type(1) << pks) - 1)
219 size_type last_accessed;
224 size_type
size(
void)
const {
return last_accessed; }
225 size_type capacity(
void)
const {
return last_ind; }
226 size_type max_size(
void)
const {
return (size_type(-1)) / 2; }
228 bool empty(
void)
const {
return last_accessed == 0; }
238 reverse_iterator rbegin(
void) {
return reverse_iterator(
end()); }
239 const_reverse_iterator rbegin(
void)
const
240 {
return const_reverse_iterator(
end()); }
241 reverse_iterator rend(
void) {
return reverse_iterator(
begin()); }
242 const_reverse_iterator rend(
void)
const
243 {
return const_reverse_iterator(
begin()); }
245 reference front(
void) {
return *
begin(); }
246 const_reference front(
void)
const {
return *
begin(); }
247 reference back(
void) {
return *(
end() - 1); }
248 const_reference back(
void)
const {
return *(
end() - 1); }
250 void swap(dynamic_array<T,pks> &da);
258 { last_accessed = last_ind = 0; array.resize(8); ppks = 3; m_ppks = 7; }
264 dynamic_array(
void) { init(); }
266 inline pointer pt_to(size_type ii)
267 {
return (ii >=last_ind) ? NULL : &((array[ii>>pks])[ii&DNAMPKS__]); }
268 inline const_pointer pt_to(size_type ii)
const
269 {
return (ii >=last_ind) ? NULL : &((array[ii>>pks])[ii&DNAMPKS__]); }
275 void resize(size_type i) { (*this)[i-1]; }
279 return sizeof(pointer) * array.capacity()
284 void swap(size_type i1, size_type i2)
285 { std::swap((*
this)[i1], (*
this)[i2]); }
294 template<
class T,
unsigned char pks>
295 void dynamic_array<T,pks>::swap(dynamic_array<T,pks> &da) {
296 array.swap(da.array);
297 std::swap(last_ind, da.last_ind);
298 std::swap(last_accessed, da.last_accessed);
299 std::swap(ppks, da.ppks); std::swap(m_ppks, da.m_ppks);
302 template<
class T,
unsigned char pks>
307 array.clear(); init();
312 array.resize(da.array.size());
313 last_ind = da.last_ind;
314 last_accessed = da.last_accessed;
315 ppks = da.ppks; m_ppks = da.m_ppks;
316 typename pointer_array::iterator it = array.begin();
317 typename pointer_array::const_iterator ita = da.array.begin();
318 typename pointer_array::iterator ite = it+ ((last_ind + DNAMPKS__) >> pks);
320 *it = std::unique_ptr<T[]>(
new T[DNAMPKS__+1]);
321 pointer p = it->get(); ++it;
322 pointer pe = p + (DNAMPKS__+1);
323 const_pointer pa = (ita++)->get();
324 while (p != pe) *p++ = *pa++;
329 template<
class T,
unsigned char pks>
330 typename dynamic_array<T,pks>::const_reference
332 THREAD_SAFE_STATIC T f;
333 return (ii<last_ind) ? (array[ii>>pks])[ii&DNAMPKS__] : f;
336 template<
class T,
unsigned char pks>
typename dynamic_array<T,pks>::reference
338 if (ii >= last_accessed) {
339 GMM_ASSERT2(ii < INT_MAX,
"out of range");
341 last_accessed = ii + 1;
342 if (ii >= last_ind) {
343 if ((ii >> (pks+ppks)) > 0) {
344 while ((ii >> (pks+ppks)) > 0) ppks++;
345 array.resize(m_ppks = (
size_type(1) << ppks)); m_ppks--;
347 for (size_type jj = (last_ind >> pks); ii >= last_ind;
348 jj++, last_ind += (DNAMPKS__ + 1)){
349 array[jj] = std::unique_ptr<T[]>(
new T[DNAMPKS__+1]);
353 return (array[ii >> pks])[ii & DNAMPKS__];
361 template<
class T,
unsigned char pks>
366 typename dynamic_array<T,pks>::size_type d = std::min(itxe-itxb,itye-ityb);
369 if (!std::equal(itxb, itxc, ityb))
return false;
370 for (; itxc != itxe; itxc++)
if (*itxc != T())
return false;
371 for (; ityc != itye; ityc++)
if (*ityc != T())
return false;
375 template<
class T,
unsigned char pks>
376 bool operator < (
const dynamic_array<T,pks> &x,
377 const dynamic_array<T,pks> &y)
378 {
return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end()); }
380 template<
class T,
unsigned char pks>
inline
381 void swap(
const dynamic_array<T,pks> &x,
const dynamic_array<T,pks> &y)
size_type memsize(void) const
Gives the total memory occupied by the array.
const_iterator end(void) const
Constant iterator on the last + 1 element.
iterator begin(void)
Iterator on the first element.
bool empty(void) const
True if no space is allocated.
size_type size(void) const
Number of allocated elements.
void clear(void)
Clear and desallocate all the elements.
iterator end(void)
Iterator on the last + 1 element.
const_iterator begin(void) const
Constant iterator on the first element.
void swap(size_type i1, size_type i2)
Swap element i1 and i2.
const_reference operator[](size_type ii) const
Gives a constant reference on element ii.
defines and typedefs for namespace dal
Tools for multithreaded, OpenMP and Boost based parallelization.
size_t size_type
used as the common size type in the library
Constant iterator class for dynamic array.
Iterator class for dynamic array.
dna_iterator & operator++()
next element.
dna_iterator & operator+=(difference_type i)
go i elements forward.
dna_iterator operator-(difference_type i) const
gives an iterator pointing i elements backward.
dna_iterator & operator--()
previous element.
dna_iterator operator+(difference_type i) const
gives an iterator pointing i elements forward.
dna_iterator & operator-=(difference_type i)
go i elements backward.