15 #ifndef STK_UTIL_DIAG_FArray_h 16 #define STK_UTIL_DIAG_FArray_h 25 #include <stk_util/util/StaticAssert.hpp> 28 # define SIERRA_ARRAY_BOUNDS_CHECK 40 array_dimension_error(
41 const std::type_info & typeinfo,
77 template<
class ElementType,
int Dimension>
85 template<
class ElementType,
int Dimension,
class A = std::allocator<ElementType> >
92 template<
unsigned N>
struct ArrayHelper;
101 inline static void fill(
const T, T *)
105 inline static void copy(
const T *, T *)
109 inline static void prefix(
const T *, T *)
112 inline static void get_index(
const unsigned *
const,
unsigned *index,
int offset) {
117 inline static T *index(T * ptr,
const unsigned *
const,
const unsigned *
const,
const unsigned *
const index) {
118 return ptr + index[0];
123 struct ArrayHelper<1>
126 inline static bool equal(
const T * x,
const T * y) {
131 inline static void fill(
const T x, T * y) {
136 inline static void copy(
const T * x, T * y) {
141 inline static void prefix(
const T * x, T * p) {
146 static void copy(
const unsigned *
const dim,
147 T * a_ptr,
const unsigned *
const a_inc,
148 T
const * b_ptr,
const unsigned *
const b_inc)
150 const unsigned ia = *a_inc;
151 const unsigned ib = *b_inc;
152 T *
const a_end = a_ptr + *dim * ia;
153 while (a_end != a_ptr) {
161 static void fill(
const unsigned *
const dim,
162 T * a_ptr,
const unsigned *
const a_inc,
165 const unsigned ia = *a_inc;
166 T *
const a_end = a_ptr + *dim * ia;
167 while (a_end != a_ptr) {
174 static bool equal(
const unsigned *
const dim,
175 const T * a_ptr,
const unsigned *
const a_inc,
176 const T * b_ptr,
const unsigned *
const b_inc)
178 const unsigned ia = *a_inc;
179 const unsigned ib = *b_inc;
180 const T *
const a_end = a_ptr + *dim * ia;
182 while (a_end != a_ptr && (result = *a_ptr == *b_ptr)) {
189 inline static void get_index(
const unsigned *
const inc,
unsigned *index,
int offset) {
190 index[1] = offset/inc[1];
191 index[0] = offset%inc[1];
195 inline static T *index(T * ptr,
const unsigned *
const inc,
const unsigned *
const,
const unsigned *
const index) {
196 return ptr + index[0] + index[1]*inc[1];
205 typedef ArrayHelper<N-1> M;
209 inline static bool equal(
const T * x,
const T * y) {
210 return *x == *y && M::equal(x + 1, y + 1);
214 inline static void fill(
const T x, T * y) {
220 inline static void copy(
const T * x, T * y) {
226 inline static void prefix(
const T * x, T * p) {
228 M::prefix(x + 1, p + 1);
232 static void copy(
const unsigned *
const dim,
233 T * a_ptr,
const unsigned *
const a_inc,
234 T
const * b_ptr,
const unsigned *
const b_inc)
236 const unsigned ia = *a_inc;
237 const unsigned ib = *b_inc;
238 T *
const a_end = a_ptr + *dim * ia;
239 while (a_end != a_ptr) {
240 M::copy(dim + 1, a_ptr, a_inc + 1, b_ptr, b_inc + 1);
247 static void fill(
const unsigned *
const dim,
248 T * a_ptr,
const unsigned *
const a_inc,
251 const unsigned ia = *a_inc;
252 T *
const a_end = a_ptr + *dim * ia;
253 while (a_end != a_ptr) {
254 M::fill(dim + 1, a_ptr, a_inc + 1, value);
260 static bool equal(
const unsigned *
const dim,
261 const T * a_ptr,
const unsigned *
const a_inc,
262 const T * b_ptr,
const unsigned *
const b_inc)
264 const unsigned ia = *a_inc;
265 const unsigned ib = *b_inc;
266 const T *
const a_end = a_ptr + *dim * ia;
268 while (a_end != a_ptr &&
269 (result = M::equal(dim+1, a_ptr, a_inc+1, b_ptr, b_inc+1))){
276 inline static void get_index(
const unsigned *
const inc,
unsigned *index,
int offset) {
277 index[N] = offset/inc[N];
278 M::get_index(inc, index, offset%inc[N]);
282 inline static T *index(T * ptr,
const unsigned *
const inc,
const unsigned *
const dim,
const unsigned *
const index) {
283 return M::index(ptr, inc, dim, index) + index[N]*inc[N];
290 template<
int Dimension>
291 class FArray<void, Dimension> {};
293 template <
class ElementType>
294 class FArray<ElementType, 0>
297 typedef ElementType value_type;
299 typedef FArray<value_type, 0> SelfType;
301 typedef FArray<const value_type, 0> Const;
306 class FArrayBootstrap
312 template<
class ElementType,
int Dimension>
313 class FArray :
public FArrayBootstrap
316 enum { NumDim = Dimension };
318 typedef ElementType value_type;
319 typedef size_t size_type;
320 typedef ptrdiff_t difference_type;
322 typedef value_type * pointer;
323 typedef const value_type * const_pointer;
324 typedef value_type & reference;
325 typedef const value_type & const_reference;
327 typedef pointer iterator;
328 typedef const_pointer const_iterator;
329 typedef typename std::reverse_iterator<iterator> reverse_iterator;
330 typedef typename std::reverse_iterator<const_iterator> const_reverse_iterator;
332 typedef FArray<ElementType, Dimension> SelfType;
333 typedef FArrayContainer<ElementType, Dimension> Container;
334 typedef FArray<ElementType, Dimension - 1> Trunc;
339 const unsigned &operator[](
unsigned i)
const {
343 unsigned &operator[](
unsigned i) {
348 unsigned m_index[NumDim];
351 const unsigned * dimension()
const {
355 const unsigned * stride()
const {
359 #ifdef SIERRA_ARRAY_BOUNDS_CHECK 360 inline void array_dimension_verify(
unsigned l_dimension,
unsigned value,
unsigned upper)
const {
363 array_dimension_error(
typeid(*
this), l_dimension, value, upper);
367 inline void array_dimension_verify(
unsigned,
unsigned,
unsigned)
const {}
371 unsigned dimension()
const {
377 unsigned stride()
const {
384 array_dimension_verify(0, i, NumDim);
388 unsigned stride(
const unsigned i)
const {
389 array_dimension_verify(0, i, NumDim);
393 unsigned size()
const {
394 return m_stride[NumDim];
399 bool operator==(
const SelfType & a)
const {
400 return ArrayHelper<NumDim>::equal(m_dim, a.m_dim) &&
401 ArrayHelper<NumDim>::equal(m_dim, m_ptr, m_stride, a.m_ptr, a.m_stride);
405 bool operator==(
const FArray<T, Dimension> & a)
const {
406 return ArrayHelper<NumDim>::equal(m_dim, a.dimension()) &&
407 ArrayHelper<NumDim>::equal(m_dim, m_ptr, m_stride, a.ptr(), a.stride());
410 bool operator!=(
const SelfType & a)
const {
411 return ! operator==(a); }
414 bool operator!=(
const FArray<T, Dimension> & a)
const {
415 return ! operator==(a);
418 value_type &operator()(
const Index &index) {
419 for (
unsigned i = 0; i < NumDim; ++i)
420 array_dimension_verify(i, index[i], m_dim[i]);
422 value_type *l_ptr = ArrayHelper<NumDim - 1>::index(m_ptr, m_stride, m_dim, &index[0]);
427 value_type & operator()(
const unsigned i0,
const unsigned i1,
428 const unsigned i2,
const unsigned i3,
429 const unsigned i4,
const unsigned i5,
430 const unsigned i6,
const unsigned i7)
434 array_dimension_verify(0, i0, m_dim[0]);
435 array_dimension_verify(1, i1, m_dim[1]);
436 array_dimension_verify(2, i2, m_dim[2]);
437 array_dimension_verify(3, i3, m_dim[3]);
438 array_dimension_verify(4, i4, m_dim[4]);
439 array_dimension_verify(5, i5, m_dim[5]);
440 array_dimension_verify(6, i6, m_dim[6]);
441 array_dimension_verify(7, i7, m_dim[7]);
443 return *(m_ptr + i0 + m_stride[1] * i1 +
444 m_stride[2] * i2 + m_stride[3] * i3 +
445 m_stride[4] * i4 + m_stride[5] * i5 +
446 m_stride[6] * i6 + m_stride[7] * i7);
449 value_type & operator()(
const unsigned i0,
const unsigned i1,
450 const unsigned i2,
const unsigned i3,
451 const unsigned i4,
const unsigned i5,
456 array_dimension_verify(0, i0, m_dim[0]);
457 array_dimension_verify(1, i1, m_dim[1]);
458 array_dimension_verify(2, i2, m_dim[2]);
459 array_dimension_verify(3, i3, m_dim[3]);
460 array_dimension_verify(4, i4, m_dim[4]);
461 array_dimension_verify(5, i5, m_dim[5]);
462 array_dimension_verify(6, i6, m_dim[6]);
464 return *(m_ptr + i0 + m_stride[1] * i1 +
465 m_stride[2] * i2 + m_stride[3] * i3 +
466 m_stride[4] * i4 + m_stride[5] * i5 +
470 value_type & operator()(
const unsigned i0,
const unsigned i1,
471 const unsigned i2,
const unsigned i3,
472 const unsigned i4,
const unsigned i5)
476 array_dimension_verify(0, i0, m_dim[0]);
477 array_dimension_verify(1, i1, m_dim[1]);
478 array_dimension_verify(2, i2, m_dim[2]);
479 array_dimension_verify(3, i3, m_dim[3]);
480 array_dimension_verify(4, i4, m_dim[4]);
481 array_dimension_verify(5, i5, m_dim[5]);
483 return *(m_ptr + i0 + m_stride[1] * i1 +
484 m_stride[2] * i2 + m_stride[3] * i3 +
485 m_stride[4] * i4 + m_stride[5] * i5);
488 value_type & operator()(
const unsigned i0,
const unsigned i1,
489 const unsigned i2,
const unsigned i3,
494 array_dimension_verify(0, i0, m_dim[0]);
495 array_dimension_verify(1, i1, m_dim[1]);
496 array_dimension_verify(2, i2, m_dim[2]);
497 array_dimension_verify(3, i3, m_dim[3]);
498 array_dimension_verify(4, i4, m_dim[4]);
500 return *(m_ptr + i0 + m_stride[1] * i1 +
501 m_stride[2] * i2 + m_stride[3] * i3 +
505 value_type & operator()(
const unsigned i0,
const unsigned i1,
506 const unsigned i2,
const unsigned i3)
510 array_dimension_verify(0, i0, m_dim[0]);
511 array_dimension_verify(1, i1, m_dim[1]);
512 array_dimension_verify(2, i2, m_dim[2]);
513 array_dimension_verify(3, i3, m_dim[3]);
515 return *(m_ptr + i0 + m_stride[1] * i1 +
516 m_stride[2] * i2 + m_stride[3] * i3);
519 value_type & operator()(
const unsigned i0,
const unsigned i1,
524 array_dimension_verify(0, i0, m_dim[0]);
525 array_dimension_verify(1, i1, m_dim[1]);
526 array_dimension_verify(2, i2, m_dim[2]);
528 return *(m_ptr + i0 + m_stride[1] * i1 +
532 value_type & operator()(
const unsigned i0,
const unsigned i1) {
535 array_dimension_verify(0, i0, m_dim[0]);
536 array_dimension_verify(1, i1, m_dim[1]);
538 return *(m_ptr + i0 + m_stride[1] * i1);
541 value_type & operator()(
const unsigned i0) {
544 array_dimension_verify(0, i0, m_dim[0]);
546 return *(m_ptr + i0);
553 value_type & operator[](
unsigned i) {
554 array_dimension_verify(0, i, m_stride[NumDim]);
558 const value_type &operator()(
const Index &index)
const {
559 for (
unsigned i = 0; i < NumDim; ++i)
560 array_dimension_verify(i, index[i], m_dim[i]);
562 const value_type *l_ptr = ArrayHelper<NumDim - 1>::index(m_ptr, m_stride, m_dim, &index[0]);
567 const value_type & operator()(
const unsigned i0,
const unsigned i1,
568 const unsigned i2,
const unsigned i3,
569 const unsigned i4,
const unsigned i5,
570 const unsigned i6,
const unsigned i7)
const 574 array_dimension_verify(0, i0, m_dim[0]);
575 array_dimension_verify(1, i1, m_dim[1]);
576 array_dimension_verify(2, i2, m_dim[2]);
577 array_dimension_verify(3, i3, m_dim[3]);
578 array_dimension_verify(4, i4, m_dim[4]);
579 array_dimension_verify(5, i5, m_dim[5]);
580 array_dimension_verify(6, i6, m_dim[6]);
581 array_dimension_verify(7, i7, m_dim[7]);
583 return *(m_ptr + i0 + m_stride[1] * i1 +
584 m_stride[2] * i2 + m_stride[3] * i3 +
585 m_stride[4] * i4 + m_stride[5] * i5 +
586 m_stride[6] * i6 + m_stride[7] * i7);
589 const value_type & operator()(
const unsigned i0,
const unsigned i1,
590 const unsigned i2,
const unsigned i3,
591 const unsigned i4,
const unsigned i5,
592 const unsigned i6)
const 596 array_dimension_verify(0, i0, m_dim[0]);
597 array_dimension_verify(1, i1, m_dim[1]);
598 array_dimension_verify(2, i2, m_dim[2]);
599 array_dimension_verify(3, i3, m_dim[3]);
600 array_dimension_verify(4, i4, m_dim[4]);
601 array_dimension_verify(5, i5, m_dim[5]);
602 array_dimension_verify(6, i6, m_dim[6]);
604 return *(m_ptr + i0 + m_stride[1] * i1 +
605 m_stride[2] * i2 + m_stride[3] * i3 +
606 m_stride[4] * i4 + m_stride[5] * i5 +
610 const value_type & operator()(
const unsigned i0,
const unsigned i1,
611 const unsigned i2,
const unsigned i3,
612 const unsigned i4,
const unsigned i5)
const 616 array_dimension_verify(0, i0, m_dim[0]);
617 array_dimension_verify(1, i1, m_dim[1]);
618 array_dimension_verify(2, i2, m_dim[2]);
619 array_dimension_verify(3, i3, m_dim[3]);
620 array_dimension_verify(4, i4, m_dim[4]);
621 array_dimension_verify(5, i5, m_dim[5]);
623 return *(m_ptr + i0 + m_stride[1] * i1 +
624 m_stride[2] * i2 + m_stride[3] * i3 +
625 m_stride[4] * i4 + m_stride[5] * i5);
628 const value_type & operator()(
const unsigned i0,
const unsigned i1,
629 const unsigned i2,
const unsigned i3,
630 const unsigned i4)
const 634 array_dimension_verify(0, i0, m_dim[0]);
635 array_dimension_verify(1, i1, m_dim[1]);
636 array_dimension_verify(2, i2, m_dim[2]);
637 array_dimension_verify(3, i3, m_dim[3]);
638 array_dimension_verify(4, i4, m_dim[4]);
640 return *(m_ptr + i0 + m_stride[1] * i1 +
641 m_stride[2] * i2 + m_stride[3] * i3 +
645 const value_type & operator()(
const unsigned i0,
const unsigned i1,
646 const unsigned i2,
const unsigned i3)
const 650 array_dimension_verify(0, i0, m_dim[0]);
651 array_dimension_verify(1, i1, m_dim[1]);
652 array_dimension_verify(2, i2, m_dim[2]);
653 array_dimension_verify(3, i3, m_dim[3]);
655 return *(m_ptr + i0 + m_stride[1] * i1 +
656 m_stride[2] * i2 + m_stride[3] * i3);
659 const value_type & operator()(
const unsigned i0,
const unsigned i1,
660 const unsigned i2)
const 664 array_dimension_verify(0, i0, m_dim[0]);
665 array_dimension_verify(1, i1, m_dim[1]);
666 array_dimension_verify(2, i2, m_dim[2]);
668 return *(m_ptr + i0 + m_stride[1] * i1 +
672 const value_type & operator()(
const unsigned i0,
const unsigned i1)
const {
675 array_dimension_verify(0, i0, m_dim[0]);
676 array_dimension_verify(1, i1, m_dim[1]);
678 return *(m_ptr + i0 + m_stride[1] * i1);
681 const value_type & operator()(
const unsigned i0)
const {
684 array_dimension_verify(0, i0, m_dim[0]);
686 return *(m_ptr + i0);
689 value_type * ptr()
const {
693 const value_type & operator[](
unsigned i)
const {
694 array_dimension_verify(0, i, m_stride[NumDim]);
700 bool verify_dimension(
const unsigned n0,
const unsigned n1,
701 const unsigned n2,
const unsigned n3,
702 const unsigned n4,
const unsigned n5,
703 const unsigned n6,
const unsigned n7)
const 706 return m_dim[0] == n0 && m_dim[1] == n1 &&
707 m_dim[2] == n2 && m_dim[3] == n3 &&
708 m_dim[4] == n4 && m_dim[5] == n5 &&
709 m_dim[6] == n6 && m_dim[7] == n7;
712 bool verify_dimension(
const unsigned n0,
const unsigned n1,
713 const unsigned n2,
const unsigned n3,
714 const unsigned n4,
const unsigned n5,
715 const unsigned n6)
const 718 return m_dim[0] == n0 && m_dim[1] == n1 &&
719 m_dim[2] == n2 && m_dim[3] == n3 &&
720 m_dim[4] == n4 && m_dim[5] == n5 &&
724 bool verify_dimension(
const unsigned n0,
const unsigned n1,
725 const unsigned n2,
const unsigned n3,
726 const unsigned n4,
const unsigned n5)
const 729 return m_dim[0] == n0 && m_dim[1] == n1 &&
730 m_dim[2] == n2 && m_dim[3] == n3 &&
731 m_dim[4] == n4 && m_dim[5] == n5;
734 bool verify_dimension(
const unsigned n0,
const unsigned n1,
735 const unsigned n2,
const unsigned n3,
736 const unsigned n4)
const 739 return m_dim[0] == n0 && m_dim[1] == n1 &&
740 m_dim[2] == n2 && m_dim[3] == n3 &&
744 bool verify_dimension(
const unsigned n0,
const unsigned n1,
745 const unsigned n2,
const unsigned n3)
const 748 return m_dim[0] == n0 && m_dim[1] == n1 &&
749 m_dim[2] == n2 && m_dim[3] == n3;
752 bool verify_dimension(
const unsigned n0,
const unsigned n1,
753 const unsigned n2)
const 756 return m_dim[0] == n0 && m_dim[1] == n1 &&
760 bool verify_dimension(
const unsigned n0,
const unsigned n1)
const {
762 return m_dim[0] == n0 && m_dim[1] == n1;
765 bool verify_dimension(
const unsigned n0)
const {
767 return m_dim[0] == n0;
770 unsigned set_dim(
const unsigned d[]) {
772 ArrayHelper<NumDim>::copy(d, m_dim);
773 ArrayHelper<NumDim>::prefix(d, m_stride);
774 return m_stride[NumDim];
777 unsigned set_dim(
const unsigned n0,
const unsigned n1,
778 const unsigned n2,
const unsigned n3,
779 const unsigned n4,
const unsigned n5,
780 const unsigned n6,
const unsigned n7)
785 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
786 m_stride[2] = m_stride[1] * (m_dim[1] = n1);
787 m_stride[3] = m_stride[2] * (m_dim[2] = n2);
788 m_stride[4] = m_stride[3] * (m_dim[3] = n3);
789 m_stride[5] = m_stride[4] * (m_dim[4] = n4);
790 m_stride[6] = m_stride[5] * (m_dim[5] = n5);
791 m_stride[7] = m_stride[6] * (m_dim[6] = n6);
792 m_stride[8] = m_stride[7] * (m_dim[7] = n7);
793 return m_stride[NumDim];
796 unsigned set_dim(
const unsigned n0,
const unsigned n1,
797 const unsigned n2,
const unsigned n3,
798 const unsigned n4,
const unsigned n5,
804 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
805 m_stride[2] = m_stride[1] * (m_dim[1] = n1);
806 m_stride[3] = m_stride[2] * (m_dim[2] = n2);
807 m_stride[4] = m_stride[3] * (m_dim[3] = n3);
808 m_stride[5] = m_stride[4] * (m_dim[4] = n4);
809 m_stride[6] = m_stride[5] * (m_dim[5] = n5);
810 m_stride[7] = m_stride[6] * (m_dim[6] = n6);
811 return m_stride[NumDim];
814 unsigned set_dim(
const unsigned n0,
const unsigned n1,
815 const unsigned n2,
const unsigned n3,
816 const unsigned n4,
const unsigned n5)
821 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
822 m_stride[2] = m_stride[1] * (m_dim[1] = n1);
823 m_stride[3] = m_stride[2] * (m_dim[2] = n2);
824 m_stride[4] = m_stride[3] * (m_dim[3] = n3);
825 m_stride[5] = m_stride[4] * (m_dim[4] = n4);
826 m_stride[6] = m_stride[5] * (m_dim[5] = n5);
827 return m_stride[NumDim];
830 unsigned set_dim(
const unsigned n0,
const unsigned n1,
831 const unsigned n2,
const unsigned n3,
837 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
838 m_stride[2] = m_stride[1] * (m_dim[1] = n1);
839 m_stride[3] = m_stride[2] * (m_dim[2] = n2);
840 m_stride[4] = m_stride[3] * (m_dim[3] = n3);
841 m_stride[5] = m_stride[4] * (m_dim[4] = n4);
842 return m_stride[NumDim];
845 unsigned set_dim(
const unsigned n0,
const unsigned n1,
846 const unsigned n2,
const unsigned n3)
851 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
852 m_stride[2] = m_stride[1] * (m_dim[1] = n1);
853 m_stride[3] = m_stride[2] * (m_dim[2] = n2);
854 m_stride[4] = m_stride[3] * (m_dim[3] = n3);
855 return m_stride[NumDim];
858 unsigned set_dim(
const unsigned n0,
const unsigned n1,
864 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
865 m_stride[2] = m_stride[1] * (m_dim[1] = n1);
866 m_stride[3] = m_stride[2] * (m_dim[2] = n2);
867 return m_stride[NumDim];
870 unsigned set_dim(
const unsigned n0,
const unsigned n1)
875 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
876 m_stride[2] = m_stride[1] * (m_dim[1] = n1);
877 return m_stride[NumDim];
880 unsigned set_dim(
const unsigned n0)
885 m_stride[1] = m_stride[0] * (m_dim[0] = n0);
886 return m_stride[NumDim];
889 unsigned set_dim(
const SelfType & a)
891 ArrayHelper<NumDim>::copy(a.m_dim, m_dim);
892 ArrayHelper<NumDim+1>::copy(a.m_stride, m_stride);
893 return m_stride[NumDim];
900 ArrayHelper<NumDim>::fill((
unsigned) 0, m_dim);
901 ArrayHelper<NumDim+1>::fill((
unsigned) 0, m_stride);
907 ArrayHelper<NumDim>::fill((
unsigned) 0, m_dim);
908 ArrayHelper<NumDim+1>::fill((
unsigned) 0, m_stride);
911 FArray(
const SelfType & a)
914 ArrayHelper<NumDim>::copy(a.m_dim, m_dim);
915 ArrayHelper<NumDim+1>::copy(a.m_stride, m_stride);
918 SelfType & operator=(SelfType
const & a)
924 ArrayHelper<NumDim>::copy(a.m_dim, m_dim);
925 ArrayHelper<NumDim+1>::copy(a.m_stride, m_stride);
931 FArray(
const FArray<T, Dimension> & a)
934 ArrayHelper<NumDim>::copy(a.dimension(), m_dim);
935 ArrayHelper<NumDim+1>::copy(a.stride(), m_stride);
938 FArray(value_type *
const l_ptr,
939 const unsigned n0,
const unsigned n1,
940 const unsigned n2,
const unsigned n3,
941 const unsigned n4,
const unsigned n5,
942 const unsigned n6,
const unsigned n7)
945 set_dim(n0, n1, n2, n3, n4, n5, n6, n7);
948 FArray(value_type *
const l_ptr,
949 const unsigned n0,
const unsigned n1,
950 const unsigned n2,
const unsigned n3,
951 const unsigned n4,
const unsigned n5,
955 set_dim(n0, n1, n2, n3, n4, n5, n6);
958 FArray(value_type *
const l_ptr,
959 const unsigned n0,
const unsigned n1,
960 const unsigned n2,
const unsigned n3,
961 const unsigned n4,
const unsigned n5)
964 set_dim(n0, n1, n2, n3, n4, n5);
967 FArray(value_type *
const l_ptr,
968 const unsigned n0,
const unsigned n1,
969 const unsigned n2,
const unsigned n3,
973 set_dim(n0, n1, n2, n3, n4);
976 FArray(value_type *
const l_ptr,
977 const unsigned n0,
const unsigned n1,
978 const unsigned n2,
const unsigned n3)
981 set_dim(n0, n1, n2, n3);
984 FArray(value_type *
const l_ptr,
985 const unsigned n0,
const unsigned n1,
992 FArray(value_type *
const l_ptr,
993 const unsigned n0,
const unsigned n1)
999 FArray(value_type *
const l_ptr,
1006 FArray(value_type *
const l_ptr,
1007 const unsigned n[NumDim])
1013 void set(
const SelfType & a) {
1016 ArrayHelper<NumDim>::copy(a.m_dim, m_dim);
1017 ArrayHelper<NumDim+1>::copy(a.m_stride, m_stride);
1020 void set(value_type *
const l_ptr,
1021 const unsigned n0,
const unsigned n1,
1022 const unsigned n2,
const unsigned n3,
1023 const unsigned n4,
const unsigned n5,
1024 const unsigned n6,
const unsigned n7)
1027 set_dim(n0, n1, n2, n3, n4, n5, n6, n7);
1030 void set(value_type *
const l_ptr,
1031 const unsigned n0,
const unsigned n1,
1032 const unsigned n2,
const unsigned n3,
1033 const unsigned n4,
const unsigned n5,
1037 set_dim(n0, n1, n2, n3, n4, n5, n6);
1040 void set(value_type *
const l_ptr,
1041 const unsigned n0,
const unsigned n1,
1042 const unsigned n2,
const unsigned n3,
1043 const unsigned n4,
const unsigned n5)
1046 set_dim(n0, n1, n2, n3, n4, n5);
1049 void set(value_type *
const l_ptr,
1050 const unsigned n0,
const unsigned n1,
1051 const unsigned n2,
const unsigned n3,
1052 const unsigned n4) {
1054 set_dim(n0, n1, n2, n3, n4);
1057 void set(value_type *
const l_ptr,
1058 const unsigned n0,
const unsigned n1,
1059 const unsigned n2,
const unsigned n3)
1062 set_dim(n0, n1, n2, n3);
1065 void set(value_type *
const l_ptr,
1066 const unsigned n0,
const unsigned n1,
1070 set_dim(n0, n1, n2);
1073 void set(value_type *
const l_ptr,
1074 const unsigned n0,
const unsigned n1) {
1079 void set(value_type *
const l_ptr,
1080 const unsigned n0) {
1085 void set(value_type *
const l_ptr,
1086 const unsigned n[NumDim]) {
1092 array_dimension_verify(0, i, m_dim[NumDim - 1]);
1094 value_type *l_ptr = m_ptr + i*m_stride[NumDim - 1];
1096 return Trunc(l_ptr, m_dim);
1099 const Trunc dive(
int i)
const {
1100 array_dimension_verify(0, i, m_dim[NumDim - 1]);
1102 value_type *l_ptr = m_ptr + i*m_stride[NumDim - 1];
1104 return Trunc(l_ptr, m_dim);
1112 return m_ptr + m_stride[NumDim];
1115 const_iterator begin()
const {
1119 const_iterator end()
const {
1120 return m_ptr + m_stride[NumDim];
1123 void dimensions(const_iterator it, Index &index)
const {
1124 ArrayHelper<NumDim - 1>::get_index(m_stride, &index[0], it - m_ptr);
1130 template<
typename T>
1131 void copy(
const FArray<T, Dimension> & a) {
1132 ArrayHelper<NumDim>::copy(m_dim, m_ptr, m_stride, a.ptr(), a.stride());
1135 template<
typename T>
1136 void fill(
const T & value) {
1137 ArrayHelper<NumDim>::fill(m_dim, m_ptr, m_stride, value);
1146 unsigned m_dim[NumDim];
1147 unsigned m_stride[NumDim + 1];
1151 template<
class ElementType,
int Dimension,
class A>
1152 class FArrayContainer
1153 :
public FArray<ElementType, Dimension>
1158 typedef typename A::value_type value_type;
1159 typedef typename A::size_type size_type;
1160 typedef typename A::difference_type difference_type;
1162 typedef typename A::pointer pointer;
1163 typedef typename A::const_pointer const_pointer;
1164 typedef typename A::reference reference;
1165 typedef typename A::const_reference const_reference;
1167 typedef typename A::pointer iterator;
1168 typedef typename A::const_pointer const_iterator;
1170 typedef typename std::reverse_iterator<iterator> reverse_iterator;
1171 typedef typename std::reverse_iterator<const_iterator> const_reverse_iterator;
1173 typedef FArrayContainer<ElementType, Dimension> SelfType;
1175 typedef FArray<ElementType, Dimension> BaseType;
1179 enum { NumDim = BaseType::NumDim };
1182 using BaseType::m_ptr;
1183 using BaseType::m_dim;
1184 using BaseType::m_stride;
1186 void resize_memory(
const unsigned new_size) {
1187 if (m_capacity < new_size) {
1189 m_allocator.deallocate(m_ptr, m_capacity);
1190 m_capacity = new_size;
1191 m_ptr = m_allocator.allocate(m_capacity);
1196 ~FArrayContainer() {
1198 m_allocator.deallocate(m_ptr, m_capacity);
1211 FArrayContainer(
const SelfType & a)
1215 resize_memory(BaseType::set_dim(a.m_dim));
1219 template<
typename T>
1220 FArrayContainer(
const FArray<T, Dimension> & a)
1224 resize_memory(BaseType::set_dim(a.dimension()));
1228 SelfType & operator=(
const SelfType & a)
1230 resize_memory(BaseType::set_dim(a.dimension()));
1235 template<
typename T>
1236 SelfType & operator=(
const FArray<T, Dimension> & a)
1238 resize_memory(BaseType::set_dim(a.dimension()));
1245 FArrayContainer(
const unsigned n0,
const unsigned n1,
1246 const unsigned n2,
const unsigned n3,
1247 const unsigned n4,
const unsigned n5,
1248 const unsigned n6,
const unsigned n7)
1249 : BaseType(NULL, n0, n1, n2, n3, n4, n5, n6, n7),
1252 resize_memory(m_stride[NumDim]);
1253 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1256 FArrayContainer(
const unsigned n0,
const unsigned n1,
1257 const unsigned n2,
const unsigned n3,
1258 const unsigned n4,
const unsigned n5,
1260 : BaseType(NULL, n0, n1, n2, n3, n4, n5, n6),
1263 resize_memory(m_stride[NumDim]);
1264 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1268 FArrayContainer(
const unsigned n0,
const unsigned n1,
1269 const unsigned n2,
const unsigned n3,
1270 const unsigned n4,
const unsigned n5)
1271 : BaseType(NULL, n0, n1, n2, n3, n4, n5),
1274 resize_memory(m_stride[NumDim]);
1275 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1279 FArrayContainer(
const unsigned n0,
const unsigned n1,
1280 const unsigned n2,
const unsigned n3,
1282 : BaseType(NULL, n0, n1, n2, n3, n4),
1285 resize_memory(m_stride[NumDim]);
1286 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1290 FArrayContainer(
const unsigned n0,
const unsigned n1,
1291 const unsigned n2,
const unsigned n3)
1292 : BaseType(NULL, n0, n1, n2, n3),
1295 resize_memory(m_stride[NumDim]);
1296 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1300 FArrayContainer(
const unsigned n0,
const unsigned n1,
1302 : BaseType(NULL, n0, n1, n2),
1305 resize_memory(m_stride[NumDim]);
1306 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1310 FArrayContainer(
const unsigned n0,
const unsigned n1)
1311 : BaseType(NULL, n0, n1),
1314 resize_memory(m_stride[NumDim]);
1315 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1319 FArrayContainer(
const unsigned n0)
1320 : BaseType(NULL, n0),
1323 resize_memory(m_stride[NumDim]);
1324 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1328 FArrayContainer(
const unsigned n[])
1329 : BaseType(NULL, n),
1332 resize_memory(m_stride[NumDim]);
1333 std::fill(m_ptr, m_ptr + m_stride[NumDim], 0);
1339 template<
typename T>
1340 SelfType & resize(
const FArray<T, Dimension> & a)
1342 resize_memory(BaseType::set_dim(a.dimension()));
1346 SelfType & resize(
const unsigned n0,
const unsigned n1,
1347 const unsigned n2,
const unsigned n3,
1348 const unsigned n4,
const unsigned n5,
1349 const unsigned n6,
const unsigned n7)
1351 resize_memory(BaseType::set_dim(n0, n1, n2, n3, n4, n5, n6, n7));
1355 SelfType & resize(
const unsigned n0,
const unsigned n1,
1356 const unsigned n2,
const unsigned n3,
1357 const unsigned n4,
const unsigned n5,
1360 resize_memory(BaseType::set_dim(n0, n1, n2, n3, n4, n5, n6));
1364 SelfType & resize(
const unsigned n0,
const unsigned n1,
1365 const unsigned n2,
const unsigned n3,
1366 const unsigned n4,
const unsigned n5)
1368 resize_memory(BaseType::set_dim(n0, n1, n2, n3, n4, n5));
1372 SelfType & resize(
const unsigned n0,
const unsigned n1,
1373 const unsigned n2,
const unsigned n3,
1376 resize_memory(BaseType::set_dim(n0, n1, n2, n3, n4));
1380 SelfType & resize(
const unsigned n0,
const unsigned n1,
1381 const unsigned n2,
const unsigned n3)
1383 resize_memory(BaseType::set_dim(n0, n1, n2, n3));
1388 SelfType & resize(
const unsigned n0,
const unsigned n1,
1391 resize_memory(BaseType::set_dim(n0, n1, n2));
1395 SelfType & resize(
const unsigned n0,
const unsigned n1) {
1396 resize_memory(BaseType::set_dim(n0, n1));
1400 SelfType & resize(
const unsigned n0) {
1401 resize_memory(BaseType::set_dim(n0));
1405 SelfType & resize(
const unsigned n[]) {
1406 resize_memory(BaseType::set_dim(n));
1412 unsigned m_capacity;
1421 #endif // STK_UTIL_DIAG_FArray_h
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)
Multidimensional array of contiguous memory. The memory is not owned by the array, but container access semantics are enforced, i.e. const Array<> elements cannot be assigned to.
Compile-time assertionIf the compile-time expression is true then defines.
Extend FArray with deep copy assignment and resize operations.
void fill(ForwardIterator first, ForwardIterator last, const T &value)
unsigned dimension(const unsigned i) const
bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)