4 #ifndef CONTAINER_CLASSES_H_
5 #define CONTAINER_CLASSES_H_
7 void do_dump_state(
const void* buf,
size_t nelem,
size_t size, FILE* out, int32 magic);
8 void do_restore_state(
void* buf,
size_t nelem,
size_t size, FILE *in, int32 magic);
18 static const int32
MA_VERS[
ML_TOP] = { 120070905, 220070803, 320071126 };
21 #define MEM_LAYOUT_VAL C_TYPE
23 #define MEM_LAYOUT_VAL ARPA_TYPE
28 template<
class T,
bool lgBC>
31 static const int p_nd = lgBC ? 3 : 1;
39 # pragma warning( disable : 4127 )
43 if( t <
p_p[1] || t >=
p_p[2] )
52 # pragma warning( disable : 4127 )
133 template<
class T,
bool lgBC>
154 template<
class T,
bool lgBC>
163 template<
class T,
bool lgBC>
201 template<
class T,
bool lgBC>
274 return getvec(i-1,index).
d[index[i-1]];
281 return getvec(i-1,index).
d[index[i-1]];
287 template<
int d,mem_layout ALLOC=MEM_LAYOUT_VAL>
308 for(
int i=0; i < d; ++i )
342 for(
int i=0; i < d; ++i )
369 s[n-1] =
max(
s[n-1],index[n-1]);
370 nsl[n-1] += index[n-1];
397 # pragma warning( disable : 4127 )
405 for(
int dim=0; dim < d; ++dim )
406 n1[dim] = n2[dim] = 0L;
409 for(
int dim=0; dim < d-1; ++dim )
413 else if( ALLOC ==
C_TYPE )
416 for(
int i = d-2; i >= 0; --i )
417 st[i] =
st[i+1]*
s[i];
551 template<
class T,
int N, mem_layout ALLOC,
bool lgBC>
class n_pointer;
554 template<
class T,
int N>
569 template<
class T,
int N>
614 template<
class T,
int N>
627 return value_type( *((T**)p_p+i), NULL, &p_v->d[i] );
631 template<
class T,
int N>
644 return value_type( p_p+i*p_st[0], p_st+1, &p_v->d[i] );
682 template<
class T,
int N>
697 template<
class T,
int N>
742 template<
class T,
int N>
755 return value_type( *((T**)p_p+i), NULL, &p_v->d[i] );
759 template<
class T,
int N>
772 return value_type( p_p+i*p_st[0], p_st+1, &p_v->d[i] );
937 template<
class T,
int d, mem_layout ALLOC=MEM_LAYOUT_VAL,
bool lgBC=lgBOUNDSCHECKVAL>
969 for(
int i=0; i < d-1; ++i )
975 for(
int i=0; i < d-1; ++i )
1016 size_type index[] = { d1, d2, d3, d4, d5 };
1022 size_type index[] = { d1, d2, d3, d4, d5, d6 };
1052 memset(
data(), 0,
p_g.size*
sizeof(T) );
1081 p_g.reserve( 1, index );
1087 p_g.reserve( 2, index );
1092 const size_type index[] = { i1, i2, i3 };
1093 p_g.reserve( 3, index );
1098 const size_type index[] = { i1, i2, i3, i4 };
1099 p_g.reserve( 4, index );
1104 const size_type index[] = { i1, i2, i3, i4, i5 };
1105 p_g.reserve( 5, index );
1110 const size_type index[] = { i1, i2, i3, i4, i5, i6 };
1111 p_g.reserve( 6, index );
1118 # pragma warning( disable : 4127 )
1126 for(
int dim=0; dim < d; ++dim )
1128 n1[dim] = n2[dim] = 0L;
1132 if(
p_g.nsl[dim] > 0 )
1133 p_psl[dim] =
new T*[
p_g.nsl[dim] ];
1145 else if( ALLOC ==
C_TYPE )
1147 for(
int i=0; i < d-1; ++i )
1191 size_type index[] = { d1, d2, d3, d4, d5 };
1196 size_type index[] = { d1, d2, d3, d4, d5, d6 };
1201 for(
int n=0; n < d; n++ )
1204 p_g.reserve_recursive( 0, index );
1235 # pragma warning( disable : 4127 )
1248 if(
p_g.lgInbounds( 1, index ) )
1252 T* s = ( n > 0 ) ? &(*t)[i1][0] : NULL;
1265 # pragma warning( disable : 4127 )
1272 return iterator( &(*t)[i1][i2][i3] );
1278 if(
p_g.lgInbounds( 2, index ) )
1282 T* s = ( n > 0 ) ? &(*t)[i1][i2][0] : NULL;
1295 # pragma warning( disable : 4127 )
1302 return iterator( &(*t)[i1][i2][i3][i4] );
1308 if(
p_g.lgInbounds( 3, index ) )
1312 T* s = ( n > 0 ) ? &(*t)[i1][i2][i3][0] : NULL;
1325 # pragma warning( disable : 4127 )
1332 return iterator( &(*t)[i1][i2][i3][i4][i5] );
1338 if(
p_g.lgInbounds( 4, index ) )
1342 T* s = ( n > 0 ) ? &(*t)[i1][i2][i3][i4][0] : NULL;
1355 # pragma warning( disable : 4127 )
1362 return iterator( &(*t)[i1][i2][i3][i4][i5][i6] );
1367 size_type index[] = { i1, i2, i3, i4, i5 };
1368 if(
p_g.lgInbounds( 5, index ) )
1372 T* s = ( n > 0 ) ? &(*t)[i1][i2][i3][i4][i5][0] : NULL;
1405 if( !
p_g.lgInbounds( 2, index ) )
1407 return (*
this)[i1][i2];
1412 if( !
p_g.lgInbounds( 2, index ) )
1414 return (*
this)[i1][i2];
1419 if( !
p_g.lgInbounds( 3, index ) )
1421 return (*
this)[i1][i2][i3];
1426 if( !
p_g.lgInbounds( 3, index ) )
1428 return (*
this)[i1][i2][i3];
1433 if( !
p_g.lgInbounds( 4, index ) )
1435 return (*
this)[i1][i2][i3][i4];
1440 if( !
p_g.lgInbounds( 4, index ) )
1442 return (*
this)[i1][i2][i3][i4];
1446 size_type index[] = { i1, i2, i3, i4, i5 };
1447 if( !
p_g.lgInbounds( 5, index ) )
1449 return (*
this)[i1][i2][i3][i4][i5];
1453 size_type index[] = { i1, i2, i3, i4, i5 };
1454 if( !
p_g.lgInbounds( 5, index ) )
1456 return (*
this)[i1][i2][i3][i4][i5];
1460 size_type index[] = { i1, i2, i3, i4, i5, i6 };
1461 if( !
p_g.lgInbounds( 6, index ) )
1463 return (*
this)[i1][i2][i3][i4][i5][i6];
1467 size_type index[] = { i1, i2, i3, i4, i5, i6 };
1468 if( !
p_g.lgInbounds( 6, index ) )
1470 return (*
this)[i1][i2][i3][i4][i5][i6];
1559 # pragma warning( disable : 4127 )
1570 # pragma warning( disable : 4127 )
1581 # pragma warning( disable : 4127 )
1592 # pragma warning( disable : 4127 )
1603 # pragma warning( disable : 4127 )
1614 # pragma warning( disable : 4127 )
1625 # pragma warning( disable : 4127 )
1630 return p_iterator(i1, i2, i3, i4,
p_g.v.d[i1].d[i2].d[i3].d[i4].n);
1636 # pragma warning( disable : 4127 )
1641 return p_iterator(i1, i2, i3, i4,
p_g.v.d[i1].d[i2].d[i3].d[i4].n);
1647 # pragma warning( disable : 4127 )
1652 return p_iterator(i1, i2, i3, i4, i5,
p_g.v.d[i1].d[i2].d[i3].d[i4].d[i5].n);
1658 # pragma warning( disable : 4127 )
1663 return p_iterator(i1, i2, i3, i4, i5,
p_g.v.d[i1].d[i2].d[i3].d[i4].d[i5].n);
1676 return *
begin(i1, i2);
1680 return *
begin(i1, i2);
1684 return *
begin(i1, i2, i3);
1688 return *
begin(i1, i2, i3);
1692 return *
begin(i1, i2, i3, i4);
1696 return *
begin(i1, i2, i3, i4);
1700 return *
begin(i1, i2, i3, i4, i5);
1704 return *
begin(i1, i2, i3, i4, i5);
1709 return *(
end(i1) - 1);
1713 return *(
end(i1) - 1);
1717 return *(
end(i1, i2) - 1);
1721 return *(
end(i1, i2) - 1);
1725 return *(
end(i1, i2, i3) - 1);
1729 return *(
end(i1, i2, i3) - 1);
1733 return *(
end(i1, i2, i3, i4) - 1);
1737 return *(
end(i1, i2, i3, i4) - 1);
1741 return *(
end(i1, i2, i3, i4, i5) - 1);
1745 return *(
end(i1, i2, i3, i4, i5) - 1);
1758 for(
int i=0; i < d-1; ++i )
1759 if(
p_psl[i] != NULL )
1761 return (
p_g.size == 0UL &&
p_dsl.size() == 0 );
1840 #define INSTANTIATE_MULTI_ARR( TYPE, BC ) \
1841 template class pntr<TYPE,BC>; \
1842 template class const_pntr<TYPE,BC>;
1844 template<
class T,
bool lgBC=lgBOUNDSCHECKVAL>
1899 alloc( begin, end );
1970 # pragma warning( disable : 4127 )
1990 p_size = (size_t)(end-begin);
2009 T* nptr = nptr_alloc -
p_begin;
2022 p_size = (size_t)(end-p_begin);
2038 # pragma warning( disable : 4127 )
2055 # pragma warning( disable : 4127 )
2145 return (
size() == 0 );
const_pointer data() const
const_iterator end(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
multi_arr< realnum, 2 >::const_iterator mr2ci
iterator begin(size_type i1)
random_access_iterator_tag iterator_category
iterator p_iterator_bc(size_type i1, size_type i2, size_type i3) const
multi_arr< double, 2 >::const_iterator md2ci
void p_setupArray(size_type n1[], size_type n2[], const tree_vec *g, size_type l)
void alloc(size_type d1, size_type d2, size_type d3, size_type d4, size_type d5)
const_n_pointer(const T *p, const size_t *st=NULL, const tree_vec *v=NULL)
iterator p_iterator(size_type i1, size_type i2) const
reference at(size_type i)
reference back(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5)
multi_arr< long, 5 >::iterator ml5i
reference back(size_type i1, size_type i2, size_type i3)
multi_arr< realnum, 6 >::iterator mr6i
const_reference back(size_type i1, size_type i2, size_type i3) const
n_pointer(T *p, const size_t *st, const tree_vec *v=NULL)
const_iterator ptr(size_type i1, size_type i2, size_type i3) const
const_reference at(size_type i1, size_type i2, size_type i3, size_type i4) const
void state_do(FILE *io, bool lgGet)
const_pntr & operator--()
multi_geom(const multi_geom &m)
pntr - interface class to replace normal pointers
const_pntr(const pntr< T, lgBC > &t)
iterator begin(size_type i1, size_type i2)
iterator ptr(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5, size_type i6)
const_iterator begin(size_type i1, size_type i2, size_type i3) const
const_reference at(size_type i) const
NORETURN void TotalInsanity(void)
T & operator[](const ptrdiff_t n) const
ptrdiff_t difference_type
flex_arr< realnum >::const_iterator farci
void p_set_vals(T *p0, T *p1, T *p2)
static const size_type npos
const_iterator ptr(size_type i1, size_type i2, size_type i3, size_type i4) const
multi_arr< bool, 5 >::const_iterator mb5ci
const_reference at(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
iterator p_iterator(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5, size_type i6) const
const_reference back(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
bool operator!=(const basic_pntr &t) const
const_pointer data() const
multi_arr< long, 3 >::iterator ml3i
reference at(size_type i1, size_type i2)
reference front(size_type i1, size_type i2)
multi_arr< long, 2 >::const_iterator ml2ci
multi_arr< long, 2 >::iterator ml2i
const_iterator ptr(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
const tree_vec & getvec(const size_type i, const size_type index[]) const
void invalidate_array(T *p, size_t size)
const_pntr - same as pntr, except that it replaces const pointers rather than normal pointers ...
const_pntr< T, lgBC > const_iterator
void reserve(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5, size_type i6)
void reserve(const size_type n, const size_type index[])
bool operator<=(const basic_pntr &t) const
reference front(size_type i1)
basic_pntr & operator++()
void reserve(size_type i1, size_type i2)
size_type st[d]
size of each dimension (only used in C_TYPE layout)
iterator p_iterator(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
const_n_pointer(const T *p, const size_t *st, const tree_vec *v=NULL)
reference operator[](size_type i)
multi_arr< realnum, 3 >::const_iterator mr3ci
flex_arr< realnum >::iterator fari
void do_dump_state(const void *buf, size_t nelem, size_t size, FILE *out, int32 magic)
n_pointer(T *p, const size_t *st, const tree_vec *v)
const_n_pointer< T, d-1, ALLOC, lgBC > const_indexed_type
iterator ptr(size_type i1, size_type i2)
const_iterator begin(size_type i1) const
iterator end(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5)
void reserve(size_type size)
const T & operator[](const ptrdiff_t n) const
const_reference back(size_type i1) const
NORETURN void OUT_OF_RANGE(const char *str)
random_access_iterator_tag iterator_category
reference at(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5, size_type i6)
multi_arr< long, 4 >::const_iterator ml4ci
tree_vec & getvec(const size_type i, const size_type index[])
flex_arr(const flex_arr &f)
multi_arr< long, 3 >::const_iterator ml3ci
multi_arr< bool, 5 >::iterator mb5i
const_pointer ptr0() const
n_pointer< T, N-1, C_TYPE, true > value_type
multi_arr< bool, 4 >::iterator mb4i
void reserve(size_type i1, size_type i2, size_type i3)
multi_arr< bool, 2 >::const_iterator mb2ci
const_reference front(size_type i1, size_type i2, size_type i3) const
size_type capacity() const
basic_pntr & operator+=(const ptrdiff_t n)
iterator end(size_type i1, size_type i2, size_type i3, size_type i4)
bool operator>=(const basic_pntr &t) const
const_n_pointer(const T *p, const size_t *st=NULL, const tree_vec *v=NULL)
const_reference front(size_type i1, size_type i2, size_type i3, size_type i4) const
const_reference front(size_type i1, size_type i2) const
basic_pntr(T *p0, T *p1, T *p2)
const const_n_pointer< T, d, ALLOC, lgBC > n_ptr() const
n_pointer(T *p, const size_t *st=NULL, const tree_vec *v=NULL)
const_pntr(T *p0, T *p1, T *p2)
const_pntr & operator+=(const ptrdiff_t n)
flex_arr(size_type begin, size_type end)
void p_clear0()
sizes of each of the pointer arrays
const_reference back(size_type i1, size_type i2, size_type i3, size_type i4) const
const_iterator end(size_type i1) const
n_pointer< T, N-1, C_TYPE, false > value_type
const_iterator end(size_type i1, size_type i2, size_type i3, size_type i4) const
const_iterator begin() const
random_access_iterator_tag iterator_category
multi_arr(size_type d1, size_type d2, size_type d3, size_type d4)
multi_arr< bool, 2 >::iterator mb2i
const flex_arr & operator=(const flex_arr &f)
const multi_geom< d, ALLOC > & clone() const
basic_pntr & operator--()
void state_do(FILE *out, bool lgGet)
reference at(size_type i1, size_type i2, size_type i3, size_type i4)
const_reference at(size_type i1, size_type i2) const
size_type capacity() const
flex_arr< double >::iterator fadi
iterator ptr(size_type i1, size_type i2, size_type i3, size_type i4)
const_n_pointer< T, N-1, C_TYPE, true > value_type
void p_setupArray(size_type n1[], size_type n2[], const tree_vec *w, size_type l)
pointer p_pointer(size_type i) const
n_pointer(T *p, const size_t *st, const tree_vec *v)
multi_arr(size_type d1, size_type d2, size_type d3, size_type d4, size_type d5, size_type d6)
const_iterator ptr(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5, size_type i6) const
multi_arr< long, 6 >::iterator ml6i
multi_geom< d, ALLOC > p_g
bool operator==(const basic_pntr &t) const
void alloc(size_type d1, size_type d2)
const_pntr< T, lgBC > const_iterator
iterator ptr(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5)
void do_restore_state(void *buf, size_t nelem, size_t size, FILE *in, int32 magic)
iterator end(size_type i1, size_type i2, size_type i3)
void alloc(size_type d1, size_type d2, size_type d3, size_type d4)
multi_arr< bool, 3 >::iterator mb3i
iterator p_iterator(size_type i1, size_type i2, size_type i3) const
const_iterator begin(size_type i1, size_type i2, size_type i3, size_type i4) const
const indexed_type operator[](size_type i)
ptrdiff_t difference_type
const_n_pointer< T, N-1, ARPA_TYPE, true > value_type
ptrdiff_t difference_type
const T * operator->() const
iterator p_iterator_bc(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5, size_type i6) const
multi_arr< double, 5 >::const_iterator md5ci
const pntr operator-(const ptrdiff_t n) const
multi_arr< double, 5 >::iterator md5i
const T & const_reference
iterator p_iterator(size_type i1, size_type i2, size_type i3, size_type i4) const
const tree_vec & operator=(const tree_vec &m)
const T & operator*() const
multi_arr(const multi_geom< d, ALLOC > &g)
reference p_index(size_type i) const
flex_arr< double >::const_iterator fadci
const_iterator begin(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
const_reference front(size_type i1) const
const pntr< T, lgBC > operator+(const ptrdiff_t n, const pntr< T, lgBC > &t)
reference at(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5)
const n_pointer< T, d, ALLOC, lgBC > n_ptr()
const_iterator end(size_type i1, size_type i2, size_type i3) const
const_iterator begin(size_type i1, size_type i2) const
flex_arr< long >::const_iterator falci
const_pntr & operator-=(const ptrdiff_t n)
const_iterator end() const
void restore_state(FILE *in)
bool p_lgInbounds(size_type i) const
multi_arr< realnum, 3 >::iterator mr3i
void dump_state(FILE *out) const
multi_arr(const multi_arr &m)
size_type nsl[d]
stride for each dimension (only used in C_TYPE layout)
const_n_pointer(const T *p, const size_t *st, const tree_vec *v)
const multi_geom & operator=(const multi_geom &m)
reference back(size_type i1)
multi_arr(size_type d1, size_type d2, size_type d3, size_type d4, size_type d5)
const_n_pointer(const T *p, const size_t *st, const tree_vec *v)
basic_pntr & operator-=(const ptrdiff_t n)
bool lgInbounds(const size_type n, const size_type index[]) const
const_reference front() const
multi_arr< realnum, 4 >::iterator mr4i
tree_vec(const tree_vec &m)
reference back(size_type i1, size_type i2)
n_pointer(T *p, const size_t *st, const tree_vec *v)
reference front(size_type i1, size_type i2, size_type i3)
const_reference back() const
iterator p_iterator_bc(size_type i1, size_type i2, size_type i3, size_type i4) const
const_pntr & operator++()
reference at(size_type i1, size_type i2, size_type i3)
multi_arr< double, 4 >::iterator md4i
iterator p_iterator_bc(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
iterator begin(size_type i1, size_type i2, size_type i3)
void reserve_recursive(const size_type n, size_type index[])
bool operator>(const basic_pntr &t) const
multi_arr(size_type d1, size_type d2, size_type d3)
multi_arr< realnum, 2 >::iterator mr2i
T * p_alloc(size_t size) const
multi_arr< realnum, 4 >::const_iterator mr4ci
iterator end(size_type i1, size_type i2)
void reserve(size_type i1)
multi_arr< bool, 6 >::const_iterator mb6ci
void realloc(size_type end)
iterator begin(size_type i1, size_type i2, size_type i3, size_type i4)
n_pointer< T, N-1, ARPA_TYPE, true > value_type
const_iterator ptr(size_type i1, size_type i2) const
n_pointer(T *p, const size_t *st=NULL, const tree_vec *v=NULL)
iterator end(size_type i1)
pntr(T *p0, T *p1, T *p2)
iterator p_iterator_bc(size_type i1, size_type i2) const
multi_arr< double, 2 >::iterator md2i
n_pointer(T *p, const size_t *st, const tree_vec *v=NULL)
n_pointer(T *p, const size_t *st, const tree_vec *v)
static const int32 MA_VERS[ML_TOP]
const_iterator end(size_type i1, size_type i2) const
multi_arr< long, 5 >::const_iterator ml5ci
void alloc(size_type d1, size_type d2, size_type d3, size_type d4, size_type d5, size_type d6)
const_n_pointer(const T *p, const size_t *st, const tree_vec *v)
multi_arr< double, 6 >::const_iterator md6ci
const_reference at(size_type i1, size_type i2, size_type i3) const
multi_arr< bool, 4 >::const_iterator mb4ci
const T & const_reference
iterator begin(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5)
multi_arr< bool, 3 >::const_iterator mb3ci
multi_arr< double, 3 >::const_iterator md3ci
reference front(size_type i1, size_type i2, size_type i3, size_type i4)
T * p_index_checked(const ptrdiff_t n) const
multi_arr(size_type d1, size_type d2)
const valarray< T > & vals() const
void reserve(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5)
flex_arr< long >::iterator fali
const_iterator ptr(size_type i) const
multi_arr< long, 6 >::const_iterator ml6ci
reference front(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5)
n_pointer< T, N-1, ARPA_TYPE, false > value_type
const_reference at(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5, size_type i6) const
const_n_pointer(const T *p, const size_t *st, const tree_vec *v=NULL)
multi_arr< double, 6 >::iterator md6i
n_pointer< T, d-1, ALLOC, lgBC > indexed_type
multi_arr< double, 4 >::const_iterator md4ci
void alloc(size_type begin, size_type end)
multi_arr< double, 3 >::iterator md3i
void alloc(size_type index[])
const const_pntr operator-(const ptrdiff_t n) const
const T & const_reference
void alloc(size_type d1, size_type d2, size_type d3)
void alloc(const multi_geom< d, ALLOC > &g)
void reserve(size_type i1, size_type i2, size_type i3, size_type i4)
const_reference back(size_type i1, size_type i2) const
tree_vec - a simple class to store the bounds checking information for multi_arr
reference back(size_type i1, size_type i2, size_type i3, size_type i4)
basic_pntr(const basic_pntr &t)
void restore_state(FILE *in)
flex_arr< bool >::const_iterator fabci
iterator ptr(size_type i1, size_type i2, size_type i3)
bool operator<(const basic_pntr &t) const
const_n_pointer< T, N-1, C_TYPE, false > value_type
const_reference front(size_type i1, size_type i2, size_type i3, size_type i4, size_type i5) const
multi_arr< realnum, 6 >::const_iterator mr6ci
const_n_pointer(const T *p, const size_t *st, const tree_vec *v)
flex_arr< bool >::iterator fabi
multi_arr< realnum, 5 >::iterator mr5i
const_n_pointer< T, N-1, ARPA_TYPE, false > value_type
multi_arr< realnum, 5 >::const_iterator mr5ci
void dump_state(FILE *out) const
multi_arr< bool, 6 >::iterator mb6i
iterator ptr(size_type i)
const multi_arr & operator=(const multi_arr &m)
multi_arr< long, 4 >::iterator ml4i
const const_pntr operator+(const ptrdiff_t n) const
iterator p_iterator(size_type i) const
size_type s[d]
allocated size (number of data elements, pointers are not counted)
const pntr operator+(const ptrdiff_t n) const