46 #ifndef Shards_Array_hpp 
   47 #define Shards_Array_hpp 
   53 #include <Shards_SimpleArrayOps.hpp> 
   58 #ifdef SHARDS_ARRAY_BOUNDS_CHECKING 
   59 #define SHARDS_ARRAY_CHECK( X ) X 
   61 #define SHARDS_ARRAY_CHECK( X ) 
   72 namespace array_traits {
 
  101 template< 
typename Scalar , 
ArrayOrder Order , 
 
  102           class Tag1 = void , 
class Tag2 = void ,
 
  103           class Tag3 = void , 
class Tag4 = void ,
 
  104           class Tag5 = void , 
class Tag6 = void ,
 
  105           class Tag7 = void , 
class Tag8 = 
void >
 
  136   typedef array_traits::int_t size_type ;
 
  139   virtual const char * 
name() 
const = 0 ;
 
  145   virtual std::string 
to_string( size_type dimension ,
 
  146                                  size_type index ) 
const ;
 
  152   virtual size_type 
to_index( size_type dimension ,
 
  153                               const std::string & label ) 
const ; 
 
  171   const char * 
name() 
const ;
 
  186 #define SHARDS_ARRAY_DIM_TAG_SIMPLE_DECLARATION( ADT ) \ 
  187   class ADT : public shards::ArrayDimTag { \ 
  189     const char * name() const ; \ 
  190     static const ADT & tag(); \ 
  194     ADT( const ADT & ); \ 
  195     ADT & operator = ( const ADT & ); \ 
  201 #define SHARDS_ARRAY_DIM_TAG_SIMPLE_IMPLEMENTATION( ADT ) \ 
  204   const char * ADT::name() const { static const char n[] = # ADT; return n; } \ 
  205   const ADT & ADT::tag() { static const ADT self ; return self ; } 
  218 #ifndef DOXYGEN_COMPILE 
  221 namespace array_traits {
 
  225 template< 
typename iType >
 
  229   const iType * 
const stride )
 
  230 { 
return 0 < rank ? stride[ rank - 1 ] : 0 ; }
 
  233 template< 
typename iType >
 
  235 void stride_to_natural_dimensions(
 
  237   const iType * 
const stride ,
 
  241   for ( iType i = 0 ; i < rank ; ++i )
 
  242     { dim[(rank-1)-i] = stride[i] / n ; n = stride[i] ; }
 
  246 template< 
typename iType >
 
  248 void stride_to_natural_indices(
 
  250   const iType * 
const stride ,
 
  252         iType * 
const indices )
 
  254   iType * i = indices ;
 
  255   for ( 
const iType * s = stride + rank - 1 ; stride < s-- ; ++i ) {
 
  263 template< 
typename iType >
 
  265 void stride_from_natural_dimensions( 
 
  267         iType * 
const stride ,
 
  268   const iType * 
const dim )
 
  271   for ( iType i = 0 ; i < rank ; ++i ) { stride[i] = n *= dim[(rank-1)-i]; }
 
  276 void throw_bad_conversion( 
const int_t lhs_rank ,
 
  277                            const ArrayDimTag * 
const lhs_tags[] ,
 
  278                            const int_t rhs_rank ,
 
  279                            const ArrayDimTag * 
const rhs_tags[] );
 
  281 void check_rank( 
const int_t rank ,
 
  282                  const int_t test_rank );
 
  284 void check_range( 
const int_t index , 
const int_t bound );
 
  286 void check_indices( 
const bool ,
 
  288                     const int_t * 
const stride ,
 
  300    const int_t src_dimension[] ,  
 
  301    const int_t rank , 
const bool natural );
 
  304    const ArrayDimTag *       dst_tag[] , 
 
  305    const ArrayDimTag * 
const src_tag[] , 
 
  306    const int_t rank , 
const bool natural );
 
  310 template< 
int_t , 
int_t > 
struct CheckRank ;
 
  312 template<> 
struct CheckRank<0,0> { 
static void ok(){} };
 
  313 template<> 
struct CheckRank<1,1> { 
static void ok(){} };
 
  314 template<> 
struct CheckRank<2,2> { 
static void ok(){} };
 
  315 template<> 
struct CheckRank<3,3> { 
static void ok(){} };
 
  316 template<> 
struct CheckRank<4,4> { 
static void ok(){} };
 
  317 template<> 
struct CheckRank<5,5> { 
static void ok(){} };
 
  318 template<> 
struct CheckRank<6,6> { 
static void ok(){} };
 
  319 template<> 
struct CheckRank<7,7> { 
static void ok(){} };
 
  320 template<> 
struct CheckRank<8,8> { 
static void ok(){} };
 
  324 template< 
int_t Index , 
int_t Bound > 
struct CheckRange ;
 
  326 template<> 
struct CheckRange<0,8> { 
static void ok(){} };
 
  327 template<> 
struct CheckRange<1,8> { 
static void ok(){} };
 
  328 template<> 
struct CheckRange<2,8> { 
static void ok(){} };
 
  329 template<> 
struct CheckRange<3,8> { 
static void ok(){} };
 
  330 template<> 
struct CheckRange<4,8> { 
static void ok(){} };
 
  331 template<> 
struct CheckRange<5,8> { 
static void ok(){} };
 
  332 template<> 
struct CheckRange<6,8> { 
static void ok(){} };
 
  333 template<> 
struct CheckRange<7,8> { 
static void ok(){} };
 
  335 template<> 
struct CheckRange<0,7> { 
static void ok(){} };
 
  336 template<> 
struct CheckRange<1,7> { 
static void ok(){} };
 
  337 template<> 
struct CheckRange<2,7> { 
static void ok(){} };
 
  338 template<> 
struct CheckRange<3,7> { 
static void ok(){} };
 
  339 template<> 
struct CheckRange<4,7> { 
static void ok(){} };
 
  340 template<> 
struct CheckRange<5,7> { 
static void ok(){} };
 
  341 template<> 
struct CheckRange<6,7> { 
static void ok(){} };
 
  343 template<> 
struct CheckRange<0,6> { 
static void ok(){} };
 
  344 template<> 
struct CheckRange<1,6> { 
static void ok(){} };
 
  345 template<> 
struct CheckRange<2,6> { 
static void ok(){} };
 
  346 template<> 
struct CheckRange<3,6> { 
static void ok(){} };
 
  347 template<> 
struct CheckRange<4,6> { 
static void ok(){} };
 
  348 template<> 
struct CheckRange<5,6> { 
static void ok(){} };
 
  350 template<> 
struct CheckRange<0,5> { 
static void ok(){} };
 
  351 template<> 
struct CheckRange<1,5> { 
static void ok(){} };
 
  352 template<> 
struct CheckRange<2,5> { 
static void ok(){} };
 
  353 template<> 
struct CheckRange<3,5> { 
static void ok(){} };
 
  354 template<> 
struct CheckRange<4,5> { 
static void ok(){} };
 
  356 template<> 
struct CheckRange<0,4> { 
static void ok(){} };
 
  357 template<> 
struct CheckRange<1,4> { 
static void ok(){} };
 
  358 template<> 
struct CheckRange<2,4> { 
static void ok(){} };
 
  359 template<> 
struct CheckRange<3,4> { 
static void ok(){} };
 
  361 template<> 
struct CheckRange<0,3> { 
static void ok(){} };
 
  362 template<> 
struct CheckRange<1,3> { 
static void ok(){} };
 
  363 template<> 
struct CheckRange<2,3> { 
static void ok(){} };
 
  365 template<> 
struct CheckRange<0,2> { 
static void ok(){} };
 
  366 template<> 
struct CheckRange<1,2> { 
static void ok(){} };
 
  368 template<> 
struct CheckRange<0,1> { 
static void ok(){} };
 
  372 template< 
class , 
int_t > 
struct TagAt ;
 
  374 template< 
typename Scalar , 
ArrayOrder order ,
 
  375           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  376           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  377 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,0>
 
  378 { 
typedef Tag1 type ; };
 
  380 template< 
typename Scalar , 
ArrayOrder order ,
 
  381           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  382           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  383 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,1>
 
  384 { 
typedef Tag2 type ; };
 
  386 template< 
typename Scalar , 
ArrayOrder order ,
 
  387           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  388           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  389 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,2>
 
  390 { 
typedef Tag3 type ; };
 
  392 template< 
typename Scalar , 
ArrayOrder order ,
 
  393           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  394           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  395 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,3>
 
  396 { 
typedef Tag4 type ; };
 
  398 template< 
typename Scalar , 
ArrayOrder order ,
 
  399           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  400           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  401 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,4>
 
  402 { 
typedef Tag5 type ; };
 
  404 template< 
typename Scalar , 
ArrayOrder order ,
 
  405           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  406           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  407 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,5>
 
  408 { 
typedef Tag6 type ; };
 
  410 template< 
typename Scalar , 
ArrayOrder order ,
 
  411           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  412           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  413 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,6>
 
  414 { 
typedef Tag7 type ; };
 
  416 template< 
typename Scalar , 
ArrayOrder order ,
 
  417           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  418           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  419 struct TagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,7>
 
  420 { 
typedef Tag8 type ; };
 
  425 template< ArrayOrder , 
int_t Rank , 
int_t Ordinal = 0 > 
struct StrideDim ;
 
  427 template< 
int_t Rank , 
int_t Ordinal >
 
  428 struct StrideDim<RankZero,Rank,Ordinal> {
 
  430   template< 
typename iType >
 
  431   static iType dimension( 
const iType * )
 
  434   template< 
typename iType >
 
  435   static iType dimension( 
const iType * , iType )
 
  439 template< 
int_t Rank >
 
  440 struct StrideDim<FortranOrder,Rank,0> {
 
  442   template< 
typename iType >
 
  443   static iType dimension( 
const iType * stride )
 
  445       array_traits::CheckRange<0,Rank>::ok();
 
  449   template< 
typename iType >
 
  450   static iType dimension( 
const iType * stride , iType ordinal )
 
  452       array_traits::check_range(ordinal,Rank);
 
  453       return ordinal ? stride[ordinal] / stride[ordinal-1] : stride[0] ;
 
  457 template< 
int_t Rank >
 
  458 struct StrideDim<NaturalOrder,Rank,0> {
 
  460   template< 
typename iType >
 
  461   static iType dimension( 
const iType * stride )
 
  463       array_traits::CheckRange<0,Rank>::ok();
 
  467   template< 
typename iType >
 
  468   static iType dimension( 
const iType * stride , iType ordinal )
 
  470       array_traits::check_range(ordinal,Rank);
 
  471       ordinal = ( Rank - 1 ) - ordinal ;
 
  472       return ordinal ? stride[ordinal] / stride[ordinal-1] : stride[0] ;
 
  476 template< 
int_t Rank , 
int_t Ordinal >
 
  477 struct StrideDim<FortranOrder,Rank,Ordinal> {
 
  479   template< 
typename iType >
 
  480   static iType dimension( 
const iType * stride )
 
  482       array_traits::CheckRange<Ordinal,Rank>::ok();
 
  483       return stride[Ordinal] / stride[Ordinal-1];
 
  487 template< 
int_t Rank , 
int_t Ordinal >
 
  488 struct StrideDim<NaturalOrder,Rank,Ordinal> {
 
  490   template< 
typename iType >
 
  491   static iType dimension( 
const iType * stride )
 
  493       enum { I = ( Rank - 1 ) - Ordinal };
 
  494       array_traits::CheckRange<Ordinal,Rank>::ok();
 
  495       return stride[I] / stride[I-1];
 
  501 template< ArrayOrder > 
struct Offset ;
 
  504 struct Offset<FortranOrder> {
 
  506   template< 
typename isType , 
typename iType >
 
  507   static iType op( 
const isType * 
const stride ,
 
  508                    const iType & i1 , 
const iType & i2 ,
 
  509                    const iType & i3 , 
const iType & i4 ,
 
  510                    const iType & i5 , 
const iType & i6 ,
 
  511                    const iType & i7 , 
const iType & i8 )
 
  513     SHARDS_ARRAY_CHECK(check_indices(
false,8,stride,i1,i2,i3,i4,i5,i6,i7,i8));
 
  514     return i1             + i2 * stride[0] +
 
  515            i3 * stride[1] + i4 * stride[2] +
 
  516            i5 * stride[3] + i6 * stride[4] +
 
  517            i7 * stride[5] + i8 * stride[6] ;
 
  520   template< 
typename isType , 
typename iType >
 
  521   static iType op( 
const isType * 
const stride ,
 
  522                    const iType & i1 , 
const iType & i2 ,
 
  523                    const iType & i3 , 
const iType & i4 ,
 
  524                    const iType & i5 , 
const iType & i6 ,
 
  527     SHARDS_ARRAY_CHECK(check_indices(
false,7,stride,i1,i2,i3,i4,i5,i6,i7));
 
  528     return i1             + i2 * stride[0] +
 
  529            i3 * stride[1] + i4 * stride[2] +
 
  530            i5 * stride[3] + i6 * stride[4] +
 
  534   template< 
typename isType , 
typename iType >
 
  535   static iType op( 
const isType * 
const stride ,
 
  536                    const iType & i1 , 
const iType & i2 ,
 
  537                    const iType & i3 , 
const iType & i4 ,
 
  538                    const iType & i5 , 
const iType & i6 )
 
  540     SHARDS_ARRAY_CHECK(check_indices(
false,6,stride,i1,i2,i3,i4,i5,i6));
 
  541     return i1             + i2 * stride[0] +
 
  542            i3 * stride[1] + i4 * stride[2] +
 
  543            i5 * stride[3] + i6 * stride[4] ;
 
  546   template< 
typename isType , 
typename iType >
 
  547   static iType op( 
const isType * 
const stride ,
 
  548                    const iType & i1 , 
const iType & i2 ,
 
  549                    const iType & i3 , 
const iType & i4 ,
 
  552     SHARDS_ARRAY_CHECK(check_indices(
false,5,stride,i1,i2,i3,i4,i5));
 
  553     return i1             + i2 * stride[0] +
 
  554            i3 * stride[1] + i4 * stride[2] +
 
  558   template< 
typename isType , 
typename iType >
 
  559   static iType op( 
const isType * 
const stride ,
 
  560                    const iType & i1 , 
const iType & i2 ,
 
  561                    const iType & i3 , 
const iType & i4 )
 
  563     SHARDS_ARRAY_CHECK(check_indices(
false,4,stride,i1,i2,i3,i4));
 
  564     return i1             + i2 * stride[0] +
 
  565            i3 * stride[1] + i4 * stride[2] ;
 
  568   template< 
typename isType , 
typename iType >
 
  569   static iType op( 
const isType * 
const stride ,
 
  570                    const iType & i1 , 
const iType & i2 ,
 
  573     SHARDS_ARRAY_CHECK(check_indices(
false,3,stride,i1,i2,i3));
 
  574     return i1 + i2 * stride[0] + i3 * stride[1] ;
 
  577   template< 
typename isType , 
typename iType >
 
  578   static iType op( 
const isType * 
const stride ,
 
  579                    const iType & i1 , 
const iType & i2 )
 
  581     SHARDS_ARRAY_CHECK(check_indices(
false,2,stride,i1,i2));
 
  582     return i1 + i2 * stride[0] ;
 
  585   template< 
typename isType , 
typename iType >
 
  586   static iType op( 
const isType * 
const SHARDS_ARRAY_CHECK( stride ) ,
 
  589     SHARDS_ARRAY_CHECK(check_indices(
false,1,stride,i1));
 
  597 struct Offset<NaturalOrder> {
 
  599   template< 
typename isType , 
typename iType >
 
  600   static iType op( 
const isType * 
const stride ,
 
  601                    const iType & i1 , 
const iType & i2 ,
 
  602                    const iType & i3 , 
const iType & i4 ,
 
  603                    const iType & i5 , 
const iType & i6 ,
 
  604                    const iType & i7 , 
const iType & i8 )
 
  606     SHARDS_ARRAY_CHECK(check_indices(
true,8,stride,i1,i2,i3,i4,i5,i6,i7,i8));
 
  607     return i8             + i7 * stride[0] +
 
  608            i6 * stride[1] + i5 * stride[2] +
 
  609            i4 * stride[3] + i3 * stride[4] +
 
  610            i2 * stride[5] + i1 * stride[6] ;
 
  613   template< 
typename isType , 
typename iType >
 
  614   static iType op( 
const isType * 
const stride ,
 
  615                    const iType & i1 , 
const iType & i2 ,
 
  616                    const iType & i3 , 
const iType & i4 ,
 
  617                    const iType & i5 , 
const iType & i6 ,
 
  620     SHARDS_ARRAY_CHECK(check_indices(
true,7,stride,i1,i2,i3,i4,i5,i6,i7));
 
  621     return i7             + i6 * stride[0] +
 
  622            i5 * stride[1] + i4 * stride[2] +
 
  623            i3 * stride[3] + i2 * stride[4] +
 
  627   template< 
typename isType , 
typename iType >
 
  628   static iType op( 
const isType * 
const stride ,
 
  629                    const iType & i1 , 
const iType & i2 ,
 
  630                    const iType & i3 , 
const iType & i4 ,
 
  631                    const iType & i5 , 
const iType & i6 )
 
  633     SHARDS_ARRAY_CHECK(check_indices(
true,6,stride,i1,i2,i3,i4,i5,i6));
 
  634     return i6             + i5 * stride[0] +
 
  635            i4 * stride[1] + i3 * stride[2] +
 
  636            i2 * stride[3] + i1 * stride[4] ;
 
  639   template< 
typename isType , 
typename iType >
 
  640   static iType op( 
const isType * 
const stride ,
 
  641                    const iType & i1 , 
const iType & i2 ,
 
  642                    const iType & i3 , 
const iType & i4 ,
 
  645     SHARDS_ARRAY_CHECK(check_indices(
true,5,stride,i1,i2,i3,i4,i5));
 
  646     return i5             + i4 * stride[0] +
 
  647            i3 * stride[1] + i2 * stride[2] +
 
  651   template< 
typename isType , 
typename iType >
 
  652   static iType op( 
const isType * 
const stride ,
 
  653                    const iType & i1 , 
const iType & i2 ,
 
  654                    const iType & i3 , 
const iType & i4 )
 
  656     SHARDS_ARRAY_CHECK(check_indices(
true,4,stride,i1,i2,i3,i4));
 
  657     return i4             + i3 * stride[0] +
 
  658            i2 * stride[1] + i1 * stride[2] ;
 
  661   template< 
typename isType , 
typename iType >
 
  662   static iType op( 
const isType * 
const stride ,
 
  663                    const iType & i1 , 
const iType & i2 ,
 
  666     SHARDS_ARRAY_CHECK(check_indices(
true,3,stride,i1,i2,i3));
 
  667     return i3 + i2 * stride[0] + i1 * stride[1] ;
 
  670   template< 
typename isType , 
typename iType >
 
  671   static iType op( 
const isType * 
const stride ,
 
  672                    const iType & i1 , 
const iType & i2 )
 
  674     SHARDS_ARRAY_CHECK(check_indices(
true,2,stride,i1,i2));
 
  675     return i2 + i1 * stride[0] ;
 
  678   template< 
typename isType , 
typename iType >
 
  679   static iType op( 
const isType * 
const SHARDS_ARRAY_CHECK( stride ) ,
 
  682     SHARDS_ARRAY_CHECK(check_indices(
true,1,stride,i1));
 
  690 template< 
typename Scalar , 
ArrayOrder Order ,
 
  691           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  692           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  698 template< 
typename Scalar ,
 
  699           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  700           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  701 struct Helper<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>
 
  704     Array<Scalar,FortranOrder,Tag8,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1>
 
  708     Array<Scalar,NaturalOrder,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8,void>
 
  713   static bool verify( 
const int_t rank , 
const ArrayDimTag * 
const tags[] )
 
  715       return rank    == Rank &&
 
  716              tags[0] == & Tag8::tag() &&
 
  717              tags[1] == & Tag7::tag() &&
 
  718              tags[2] == & Tag6::tag() &&
 
  719              tags[3] == & Tag5::tag() &&
 
  720              tags[4] == & Tag4::tag() &&
 
  721              tags[5] == & Tag3::tag() &&
 
  722              tags[6] == & Tag2::tag() &&
 
  723              tags[7] == & Tag1::tag() ;
 
  726   static void assign_tags( 
const ArrayDimTag * tags[] )
 
  728       tags[0] = & Tag8::tag();
 
  729       tags[1] = & Tag7::tag();
 
  730       tags[2] = & Tag6::tag();
 
  731       tags[3] = & Tag5::tag();
 
  732       tags[4] = & Tag4::tag();
 
  733       tags[5] = & Tag3::tag();
 
  734       tags[6] = & Tag2::tag();
 
  735       tags[7] = & Tag1::tag();
 
  738   template< 
typename iType >
 
  739   static void assign( iType * stride )
 
  741         stride[7] = Tag1::Size * (
 
  742         stride[6] = Tag2::Size * (
 
  743         stride[5] = Tag3::Size * (
 
  744         stride[4] = Tag4::Size * (
 
  745         stride[3] = Tag5::Size * (
 
  746         stride[2] = Tag6::Size * (
 
  747         stride[1] = Tag7::Size * (
 
  748         stride[0] = Tag8::Size )))))));
 
  751   template< 
typename iType >
 
  752   static void assign( iType * stride ,
 
  756         stride[6] = Tag2::Size * (
 
  757         stride[5] = Tag3::Size * (
 
  758         stride[4] = Tag4::Size * (
 
  759         stride[3] = Tag5::Size * (
 
  760         stride[2] = Tag6::Size * (
 
  761         stride[1] = Tag7::Size * (
 
  762         stride[0] = Tag8::Size )))))));
 
  765   template< 
typename iType >
 
  766   static void assign( iType * stride ,
 
  772         stride[5] = Tag3::Size * (
 
  773         stride[4] = Tag4::Size * (
 
  774         stride[3] = Tag5::Size * (
 
  775         stride[2] = Tag6::Size * (
 
  776         stride[1] = Tag7::Size * (
 
  777         stride[0] = Tag8::Size )))))));
 
  780   template< 
typename iType >
 
  781   static void assign( iType * stride ,
 
  789         stride[4] = Tag4::Size * (
 
  790         stride[3] = Tag5::Size * (
 
  791         stride[2] = Tag6::Size * (
 
  792         stride[1] = Tag7::Size * (
 
  793         stride[0] = Tag8::Size )))))));
 
  796   template< 
typename iType >
 
  797   static void assign( iType * stride ,
 
  807         stride[3] = Tag5::Size * (
 
  808         stride[2] = Tag6::Size * (
 
  809         stride[1] = Tag7::Size * (
 
  810         stride[0] = Tag8::Size )))))));
 
  813   template< 
typename iType >
 
  814   static void assign( iType * stride ,
 
  826         stride[2] = Tag6::Size  * (
 
  827         stride[1] = Tag7::Size  * (
 
  828         stride[0] = Tag8::Size  )))))));
 
  831   template< 
typename iType >
 
  832   static void assign( iType * stride ,
 
  846         stride[1] = Tag7::Size * (
 
  847         stride[0] = Tag8::Size )))))));
 
  850   template< 
typename iType >
 
  851   static void assign( iType * stride ,
 
  867         stride[0] = Tag8::Size )))))));
 
  870   template< 
typename iType >
 
  871   static void assign( iType * stride ,
 
  888         stride[0] = n8 )))))));
 
  891   template< 
typename iType >
 
  892   static void assign( iType * stride ,
 
  893                       const iType * 
const dims )
 
  895         stride[7] = dims[0] * (
 
  896         stride[6] = dims[1] * (
 
  897         stride[5] = dims[2] * (
 
  898         stride[4] = dims[3] * (
 
  899         stride[3] = dims[4] * (
 
  900         stride[2] = dims[5] * (
 
  901         stride[1] = dims[6] * (
 
  902         stride[0] = dims[7] )))))));
 
  906 template< 
typename Scalar ,
 
  907           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
  908           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
  909 struct Helper<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>
 
  912     Array<Scalar,NaturalOrder,Tag8,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1>
 
  916     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void>
 
  921   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
  923       return rank == Rank &&
 
  924              tags[0] == & Tag1::tag() &&
 
  925              tags[1] == & Tag2::tag() &&
 
  926              tags[2] == & Tag3::tag() &&
 
  927              tags[3] == & Tag4::tag() &&
 
  928              tags[4] == & Tag5::tag() &&
 
  929              tags[5] == & Tag6::tag() &&
 
  930              tags[6] == & Tag7::tag() &&
 
  931              tags[7] == & Tag8::tag();
 
  934   static void assign_tags( 
const ArrayDimTag * tags[] )
 
  936       tags[0] = & Tag1::tag();
 
  937       tags[1] = & Tag2::tag();
 
  938       tags[2] = & Tag3::tag();
 
  939       tags[3] = & Tag4::tag();
 
  940       tags[4] = & Tag5::tag();
 
  941       tags[5] = & Tag6::tag();
 
  942       tags[6] = & Tag7::tag();
 
  943       tags[7] = & Tag8::tag();
 
  946   template< 
typename iType >
 
  947   static void assign( iType * stride )
 
  949         stride[7] = Tag8::Size * (
 
  950         stride[6] = Tag7::Size * (
 
  951         stride[5] = Tag6::Size * (
 
  952         stride[4] = Tag5::Size * (
 
  953         stride[3] = Tag4::Size * (
 
  954         stride[2] = Tag3::Size * (
 
  955         stride[1] = Tag2::Size * (
 
  956         stride[0] = Tag1::Size )))))));
 
  959   template< 
typename iType >
 
  960   static void assign( iType * stride ,
 
  964         stride[6] = Tag7::Size * (
 
  965         stride[5] = Tag6::Size * (
 
  966         stride[4] = Tag5::Size * (
 
  967         stride[3] = Tag4::Size * (
 
  968         stride[2] = Tag3::Size * (
 
  969         stride[1] = Tag2::Size * (
 
  970         stride[0] = Tag1::Size )))))));
 
  973   template< 
typename iType >
 
  974   static void assign( iType * stride ,
 
  980         stride[5] = Tag6::Size * (
 
  981         stride[4] = Tag5::Size * (
 
  982         stride[3] = Tag4::Size * (
 
  983         stride[2] = Tag3::Size * (
 
  984         stride[1] = Tag2::Size * (
 
  985         stride[0] = Tag1::Size )))))));
 
  988   template< 
typename iType >
 
  989   static void assign( iType * stride ,
 
  997         stride[4] = Tag5::Size * (
 
  998         stride[3] = Tag4::Size * (
 
  999         stride[2] = Tag3::Size * (
 
 1000         stride[1] = Tag2::Size * (
 
 1001         stride[0] = Tag1::Size )))))));
 
 1004   template< 
typename iType >
 
 1005   static void assign( iType * stride ,
 
 1015         stride[3] = Tag4::Size * (
 
 1016         stride[2] = Tag3::Size * (
 
 1017         stride[1] = Tag2::Size * (
 
 1018         stride[0] = Tag1::Size )))))));
 
 1021   template< 
typename iType >
 
 1022   static void assign( iType * stride ,
 
 1034         stride[2] = Tag3::Size  * (
 
 1035         stride[1] = Tag2::Size  * (
 
 1036         stride[0] = Tag1::Size  )))))));
 
 1039   template< 
typename iType >
 
 1040   static void assign( iType * stride ,
 
 1054         stride[1] = Tag2::Size * (
 
 1055         stride[0] = Tag1::Size )))))));
 
 1058   template< 
typename iType >
 
 1059   static void assign( iType * stride ,
 
 1075         stride[0] = Tag1::Size )))))));
 
 1078   template< 
typename iType >
 
 1079   static void assign( iType * stride ,
 
 1096         stride[0] = n1 )))))));
 
 1099   template< 
typename iType >
 
 1100   static void assign( iType * stride ,
 
 1101                       const iType * 
const dims )
 
 1103         stride[7] = dims[7] * (
 
 1104         stride[6] = dims[6] * (
 
 1105         stride[5] = dims[5] * (
 
 1106         stride[4] = dims[4] * (
 
 1107         stride[3] = dims[3] * (
 
 1108         stride[2] = dims[2] * (
 
 1109         stride[1] = dims[1] * (
 
 1110         stride[0] = dims[0] )))))));
 
 1117 template< 
typename Scalar ,
 
 1118           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 1119           class Tag5 , 
class Tag6 , 
class Tag7 >
 
 1120 struct Helper<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void>
 
 1123     Array<Scalar,FortranOrder,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void>
 
 1127     Array<Scalar,NaturalOrder,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void,void>
 
 1130   template< 
class TagA >
 
 1133       Array<Scalar,NaturalOrder,TagA,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7>
 
 1137       Array<Scalar,FortranOrder,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,TagA>
 
 1140     typedef  natural  type ;
 
 1141     typedef  fortran  reverse ;
 
 1146   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 1148       return rank == Rank &&
 
 1149              tags[0] == & Tag7::tag() &&
 
 1150              tags[1] == & Tag6::tag() &&
 
 1151              tags[2] == & Tag5::tag() &&
 
 1152              tags[3] == & Tag4::tag() &&
 
 1153              tags[4] == & Tag3::tag() &&
 
 1154              tags[5] == & Tag2::tag() &&
 
 1155              tags[6] == & Tag1::tag() ;
 
 1158   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 1160       tags[0] = & Tag7::tag();
 
 1161       tags[1] = & Tag6::tag();
 
 1162       tags[2] = & Tag5::tag();
 
 1163       tags[3] = & Tag4::tag();
 
 1164       tags[4] = & Tag3::tag();
 
 1165       tags[5] = & Tag2::tag();
 
 1166       tags[6] = & Tag1::tag();
 
 1170   template< 
typename iType >
 
 1171   static void assign( iType * stride )
 
 1174       stride[6] = Tag1::Size * (
 
 1175       stride[5] = Tag2::Size * (
 
 1176       stride[4] = Tag3::Size * (
 
 1177       stride[3] = Tag4::Size * (
 
 1178       stride[2] = Tag5::Size * (
 
 1179       stride[1] = Tag6::Size * (
 
 1180       stride[0] = Tag7::Size ))))));
 
 1183   template< 
typename iType >
 
 1184   static void assign( iType * stride ,
 
 1189       stride[5] = Tag2::Size * (
 
 1190       stride[4] = Tag3::Size * (
 
 1191       stride[3] = Tag4::Size * (
 
 1192       stride[2] = Tag5::Size * (
 
 1193       stride[1] = Tag6::Size * (
 
 1194       stride[0] = Tag7::Size ))))));
 
 1197   template< 
typename iType >
 
 1198   static void assign( iType * stride ,
 
 1205       stride[4] = Tag3::Size * (
 
 1206       stride[3] = Tag4::Size * (
 
 1207       stride[2] = Tag5::Size * (
 
 1208       stride[1] = Tag6::Size * (
 
 1209       stride[0] = Tag7::Size ))))));
 
 1212   template< 
typename iType >
 
 1213   static void assign( iType * stride ,
 
 1222       stride[3] = Tag4::Size * (
 
 1223       stride[2] = Tag5::Size * (
 
 1224       stride[1] = Tag6::Size * (
 
 1225       stride[0] = Tag7::Size ))))));
 
 1228   template< 
typename iType >
 
 1229   static void assign( iType * stride ,
 
 1240       stride[2] = Tag5::Size * (
 
 1241       stride[1] = Tag6::Size * (
 
 1242       stride[0] = Tag7::Size ))))));
 
 1245   template< 
typename iType >
 
 1246   static void assign( iType * stride ,
 
 1259       stride[1] = Tag6::Size * (
 
 1260       stride[0] = Tag7::Size ))))));
 
 1263   template< 
typename iType >
 
 1264   static void assign( iType * stride ,
 
 1279       stride[0] = Tag7::Size ))))));
 
 1282   template< 
typename iType >
 
 1283   static void assign( iType * stride ,
 
 1299       stride[0] = n7 ))))));
 
 1302   template< 
typename iType >
 
 1303   static void assign( iType * stride ,
 
 1304                       const iType * 
const dims )
 
 1307       stride[6] = dims[0] * (
 
 1308       stride[5] = dims[1] * (
 
 1309       stride[4] = dims[2] * (
 
 1310       stride[3] = dims[3] * (
 
 1311       stride[2] = dims[4] * (
 
 1312       stride[1] = dims[5] * (
 
 1313       stride[0] = dims[6] ))))));
 
 1317 template< 
typename Scalar ,
 
 1318           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 1319           class Tag5 , 
class Tag6 , 
class Tag7 >
 
 1320 struct Helper<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void>
 
 1323     Array<Scalar,NaturalOrder,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void>
 
 1327     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void>
 
 1330   template< 
class TagA >
 
 1333       Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,TagA>
 
 1337       Array<Scalar,NaturalOrder,TagA,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1>
 
 1340     typedef  fortran  type ;
 
 1341     typedef  natural  reverse ;
 
 1346   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 1348       return rank == Rank &&
 
 1349              tags[0] == & Tag1::tag() &&
 
 1350              tags[1] == & Tag2::tag() &&
 
 1351              tags[2] == & Tag3::tag() &&
 
 1352              tags[3] == & Tag4::tag() &&
 
 1353              tags[4] == & Tag5::tag() &&
 
 1354              tags[5] == & Tag6::tag() &&
 
 1355              tags[6] == & Tag7::tag();
 
 1358   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 1360       tags[0] = & Tag1::tag();
 
 1361       tags[1] = & Tag2::tag();
 
 1362       tags[2] = & Tag3::tag();
 
 1363       tags[3] = & Tag4::tag();
 
 1364       tags[4] = & Tag5::tag();
 
 1365       tags[5] = & Tag6::tag();
 
 1366       tags[6] = & Tag7::tag();
 
 1370   template< 
typename iType >
 
 1371   static void assign( iType * stride )
 
 1374       stride[6] = Tag7::Size * (
 
 1375       stride[5] = Tag6::Size * (
 
 1376       stride[4] = Tag5::Size * (
 
 1377       stride[3] = Tag4::Size * (
 
 1378       stride[2] = Tag3::Size * (
 
 1379       stride[1] = Tag2::Size * (
 
 1380       stride[0] = Tag1::Size ))))));
 
 1383   template< 
typename iType >
 
 1384   static void assign( iType * stride ,
 
 1389       stride[5] = Tag6::Size * (
 
 1390       stride[4] = Tag5::Size * (
 
 1391       stride[3] = Tag4::Size * (
 
 1392       stride[2] = Tag3::Size * (
 
 1393       stride[1] = Tag2::Size * (
 
 1394       stride[0] = Tag1::Size ))))));
 
 1397   template< 
typename iType >
 
 1398   static void assign( iType * stride ,
 
 1405       stride[4] = Tag5::Size * (
 
 1406       stride[3] = Tag4::Size * (
 
 1407       stride[2] = Tag3::Size * (
 
 1408       stride[1] = Tag2::Size * (
 
 1409       stride[0] = Tag1::Size ))))));
 
 1412   template< 
typename iType >
 
 1413   static void assign( iType * stride ,
 
 1422       stride[3] = Tag4::Size * (
 
 1423       stride[2] = Tag3::Size * (
 
 1424       stride[1] = Tag2::Size * (
 
 1425       stride[0] = Tag1::Size ))))));
 
 1428   template< 
typename iType >
 
 1429   static void assign( iType * stride ,
 
 1440       stride[2] = Tag3::Size * (
 
 1441       stride[1] = Tag2::Size * (
 
 1442       stride[0] = Tag1::Size ))))));
 
 1445   template< 
typename iType >
 
 1446   static void assign( iType * stride ,
 
 1459       stride[1] = Tag2::Size * (
 
 1460       stride[0] = Tag1::Size ))))));
 
 1463   template< 
typename iType >
 
 1464   static void assign( iType * stride ,
 
 1479       stride[0] = Tag1::Size ))))));
 
 1482   template< 
typename iType >
 
 1483   static void assign( iType * stride ,
 
 1499       stride[0] = n1 ))))));
 
 1502   template< 
typename iType >
 
 1503   static void assign( iType * stride ,
 
 1504                       const iType * 
const dims )
 
 1507       stride[6] = dims[6] * (
 
 1508       stride[5] = dims[5] * (
 
 1509       stride[4] = dims[4] * (
 
 1510       stride[3] = dims[3] * (
 
 1511       stride[2] = dims[2] * (
 
 1512       stride[1] = dims[1] * (
 
 1513       stride[0] = dims[0] ))))));
 
 1520 template< 
typename Scalar ,
 
 1521           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 1522           class Tag5 , 
class Tag6 >
 
 1523 struct Helper<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void>
 
 1526     Array<Scalar,FortranOrder,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void,void>
 
 1530     Array<Scalar,NaturalOrder,Tag2,Tag3,Tag4,Tag5,Tag6,void,void,void>
 
 1533   template< 
class TagA >
 
 1536       Array<Scalar,NaturalOrder,TagA,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void>
 
 1540       Array<Scalar,FortranOrder,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,TagA,void>
 
 1543     typedef  natural  type ;
 
 1544     typedef  fortran  reverse ;
 
 1549   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 1551       return rank == Rank &&
 
 1552              tags[0] == & Tag6::tag() &&
 
 1553              tags[1] == & Tag5::tag() &&
 
 1554              tags[2] == & Tag4::tag() &&
 
 1555              tags[3] == & Tag3::tag() &&
 
 1556              tags[4] == & Tag2::tag() &&
 
 1557              tags[5] == & Tag1::tag();
 
 1560   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 1562       tags[0] = & Tag6::tag();
 
 1563       tags[1] = & Tag5::tag();
 
 1564       tags[2] = & Tag4::tag();
 
 1565       tags[3] = & Tag3::tag();
 
 1566       tags[4] = & Tag2::tag();
 
 1567       tags[5] = & Tag1::tag();
 
 1572   template< 
typename iType >
 
 1573   static void assign( iType * stride )
 
 1577       stride[5] = Tag1::Size * (
 
 1578       stride[4] = Tag2::Size * (
 
 1579       stride[3] = Tag3::Size * (
 
 1580       stride[2] = Tag4::Size * (
 
 1581       stride[1] = Tag5::Size * (
 
 1582       stride[0] = Tag6::Size )))));
 
 1585   template< 
typename iType >
 
 1586   static void assign( iType * stride ,
 
 1592       stride[4] = Tag2::Size * (
 
 1593       stride[3] = Tag3::Size * (
 
 1594       stride[2] = Tag4::Size * (
 
 1595       stride[1] = Tag5::Size * (
 
 1596       stride[0] = Tag6::Size )))));
 
 1599   template< 
typename iType >
 
 1600   static void assign( iType * stride ,
 
 1608       stride[3] = Tag3::Size * (
 
 1609       stride[2] = Tag4::Size * (
 
 1610       stride[1] = Tag5::Size * (
 
 1611       stride[0] = Tag6::Size )))));
 
 1614   template< 
typename iType >
 
 1615   static void assign( iType * stride ,
 
 1625       stride[2] = Tag4::Size * (
 
 1626       stride[1] = Tag5::Size * (
 
 1627       stride[0] = Tag6::Size )))));
 
 1630   template< 
typename iType >
 
 1631   static void assign( iType * stride ,
 
 1643       stride[1] = Tag5::Size * (
 
 1644       stride[0] = Tag6::Size )))));
 
 1647   template< 
typename iType >
 
 1648   static void assign( iType * stride ,
 
 1662       stride[0] = Tag6::Size )))));
 
 1665   template< 
typename iType >
 
 1666   static void assign( iType * stride ,
 
 1681       stride[0] = n6 )))));
 
 1684   template< 
typename iType >
 
 1685   static void assign( iType * stride ,
 
 1686                       const iType * 
const dims )
 
 1690       stride[5] = dims[0] * (
 
 1691       stride[4] = dims[1] * (
 
 1692       stride[3] = dims[2] * (
 
 1693       stride[2] = dims[3] * (
 
 1694       stride[1] = dims[4] * (
 
 1695       stride[0] = dims[5] )))));
 
 1699 template< 
typename Scalar ,
 
 1700           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 1701           class Tag5 , 
class Tag6 >
 
 1702 struct Helper<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void>
 
 1705     Array<Scalar,NaturalOrder,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void,void>
 
 1709     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void>
 
 1712   template< 
class TagA >
 
 1715       Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,TagA,void>
 
 1719       Array<Scalar,NaturalOrder,TagA,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void>
 
 1722     typedef  fortran  type ;
 
 1723     typedef  natural  reverse ;
 
 1728   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 1730       return rank == Rank &&
 
 1731              tags[0] == & Tag1::tag() &&
 
 1732              tags[1] == & Tag2::tag() &&
 
 1733              tags[2] == & Tag3::tag() &&
 
 1734              tags[3] == & Tag4::tag() &&
 
 1735              tags[4] == & Tag5::tag() &&
 
 1736              tags[5] == & Tag6::tag();
 
 1739   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 1741       tags[0] = & Tag1::tag();
 
 1742       tags[1] = & Tag2::tag();
 
 1743       tags[2] = & Tag3::tag();
 
 1744       tags[3] = & Tag4::tag();
 
 1745       tags[4] = & Tag5::tag();
 
 1746       tags[5] = & Tag6::tag();
 
 1751   template< 
typename iType >
 
 1752   static void assign( iType * stride )
 
 1756       stride[5] = Tag6::Size * (
 
 1757       stride[4] = Tag5::Size * (
 
 1758       stride[3] = Tag4::Size * (
 
 1759       stride[2] = Tag3::Size * (
 
 1760       stride[1] = Tag2::Size * (
 
 1761       stride[0] = Tag1::Size )))));
 
 1764   template< 
typename iType >
 
 1765   static void assign( iType * stride ,
 
 1771       stride[4] = Tag5::Size * (
 
 1772       stride[3] = Tag4::Size * (
 
 1773       stride[2] = Tag3::Size * (
 
 1774       stride[1] = Tag2::Size * (
 
 1775       stride[0] = Tag1::Size )))));
 
 1778   template< 
typename iType >
 
 1779   static void assign( iType * stride ,
 
 1787       stride[3] = Tag4::Size * (
 
 1788       stride[2] = Tag3::Size * (
 
 1789       stride[1] = Tag2::Size * (
 
 1790       stride[0] = Tag1::Size )))));
 
 1793   template< 
typename iType >
 
 1794   static void assign( iType * stride ,
 
 1804       stride[2] = Tag3::Size * (
 
 1805       stride[1] = Tag2::Size * (
 
 1806       stride[0] = Tag1::Size )))));
 
 1809   template< 
typename iType >
 
 1810   static void assign( iType * stride ,
 
 1822       stride[1] = Tag2::Size * (
 
 1823       stride[0] = Tag1::Size )))));
 
 1826   template< 
typename iType >
 
 1827   static void assign( iType * stride ,
 
 1841       stride[0] = Tag1::Size )))));
 
 1844   template< 
typename iType >
 
 1845   static void assign( iType * stride ,
 
 1860       stride[0] = n1 )))));
 
 1863   template< 
typename iType >
 
 1864   static void assign( iType * stride ,
 
 1865                       const iType * 
const dims )
 
 1869       stride[5] = dims[5] * (
 
 1870       stride[4] = dims[4] * (
 
 1871       stride[3] = dims[3] * (
 
 1872       stride[2] = dims[2] * (
 
 1873       stride[1] = dims[1] * (
 
 1874       stride[0] = dims[0] )))));
 
 1881 template< 
typename Scalar ,
 
 1882           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 , 
class Tag5 >
 
 1883 struct Helper<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void>
 
 1886     Array<Scalar,FortranOrder,Tag5,Tag4,Tag3,Tag2,Tag1,void,void,void>
 
 1890     Array<Scalar,NaturalOrder,Tag2,Tag3,Tag4,Tag5,void,void,void,void>
 
 1893   template< 
class TagA >
 
 1896       Array<Scalar,NaturalOrder,TagA,Tag1,Tag2,Tag3,Tag4,Tag5,void,void>
 
 1900       Array<Scalar,FortranOrder,Tag5,Tag4,Tag3,Tag2,Tag1,TagA,void,void>
 
 1903     typedef  natural  type ;
 
 1904     typedef  fortran  reverse ;
 
 1909   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 1911       return rank == Rank &&
 
 1912              tags[0] == & Tag5::tag() &&
 
 1913              tags[1] == & Tag4::tag() &&
 
 1914              tags[2] == & Tag3::tag() &&
 
 1915              tags[3] == & Tag2::tag() &&
 
 1916              tags[4] == & Tag1::tag();
 
 1919   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 1921       tags[0] = & Tag5::tag();
 
 1922       tags[1] = & Tag4::tag();
 
 1923       tags[2] = & Tag3::tag();
 
 1924       tags[3] = & Tag2::tag();
 
 1925       tags[4] = & Tag1::tag();
 
 1931   template< 
typename iType >
 
 1932   static void assign( iType * stride )
 
 1937       stride[4] = Tag1::Size * (
 
 1938       stride[3] = Tag2::Size * (
 
 1939       stride[2] = Tag3::Size * (
 
 1940       stride[1] = Tag4::Size * (
 
 1941       stride[0] = Tag5::Size ))));
 
 1944   template< 
typename iType >
 
 1945   static void assign( iType * stride ,
 
 1952       stride[3] = Tag2::Size * (
 
 1953       stride[2] = Tag3::Size * (
 
 1954       stride[1] = Tag4::Size * (
 
 1955       stride[0] = Tag5::Size ))));
 
 1958   template< 
typename iType >
 
 1959   static void assign( iType * stride ,
 
 1968       stride[2] = Tag3::Size * (
 
 1969       stride[1] = Tag4::Size * (
 
 1970       stride[0] = Tag5::Size ))));
 
 1973   template< 
typename iType >
 
 1974   static void assign( iType * stride ,
 
 1985       stride[1] = Tag4::Size * (
 
 1986       stride[0] = Tag5::Size ))));
 
 1989   template< 
typename iType >
 
 1990   static void assign( iType * stride ,
 
 2003       stride[0] = Tag5::Size ))));
 
 2006   template< 
typename iType >
 
 2007   static void assign( iType * stride ,
 
 2021       stride[0] = n5 ))));
 
 2024   template< 
typename iType >
 
 2025   static void assign( iType * stride ,
 
 2026                       const iType * 
const dims )
 
 2031       stride[4] = dims[0] * (
 
 2032       stride[3] = dims[1] * (
 
 2033       stride[2] = dims[2] * (
 
 2034       stride[1] = dims[3] * (
 
 2035       stride[0] = dims[4] ))));
 
 2039 template< 
typename Scalar ,
 
 2040           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 , 
class Tag5 >
 
 2041 struct Helper<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void>
 
 2044     Array<Scalar,NaturalOrder,Tag5,Tag4,Tag3,Tag2,Tag1,void,void,void>
 
 2048     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void>
 
 2051   template< 
class TagA >
 
 2054       Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,TagA,void,void>
 
 2058       Array<Scalar,NaturalOrder,TagA,Tag5,Tag4,Tag3,Tag2,Tag1,void,void>
 
 2061     typedef  fortran  type ;
 
 2062     typedef  natural  reverse ;
 
 2067   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2069       return rank == Rank &&
 
 2070              tags[0] == & Tag1::tag() &&
 
 2071              tags[1] == & Tag2::tag() &&
 
 2072              tags[2] == & Tag3::tag() &&
 
 2073              tags[3] == & Tag4::tag() &&
 
 2074              tags[4] == & Tag5::tag();
 
 2077   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2079       tags[0] = & Tag1::tag();
 
 2080       tags[1] = & Tag2::tag();
 
 2081       tags[2] = & Tag3::tag();
 
 2082       tags[3] = & Tag4::tag();
 
 2083       tags[4] = & Tag5::tag();
 
 2089   template< 
typename iType >
 
 2090   static void assign( iType * stride )
 
 2095       stride[4] = Tag5::Size * (
 
 2096       stride[3] = Tag4::Size * (
 
 2097       stride[2] = Tag3::Size * (
 
 2098       stride[1] = Tag2::Size * (
 
 2099       stride[0] = Tag1::Size ))));
 
 2102   template< 
typename iType >
 
 2103   static void assign( iType * stride ,
 
 2110       stride[3] = Tag4::Size * (
 
 2111       stride[2] = Tag3::Size * (
 
 2112       stride[1] = Tag2::Size * (
 
 2113       stride[0] = Tag1::Size ))));
 
 2116   template< 
typename iType >
 
 2117   static void assign( iType * stride ,
 
 2126       stride[2] = Tag3::Size * (
 
 2127       stride[1] = Tag2::Size * (
 
 2128       stride[0] = Tag1::Size ))));
 
 2131   template< 
typename iType >
 
 2132   static void assign( iType * stride ,
 
 2143       stride[1] = Tag2::Size * (
 
 2144       stride[0] = Tag1::Size ))));
 
 2147   template< 
typename iType >
 
 2148   static void assign( iType * stride ,
 
 2161       stride[0] = Tag1::Size ))));
 
 2164   template< 
typename iType >
 
 2165   static void assign( iType * stride ,
 
 2179       stride[0] = n1 ))));
 
 2182   template< 
typename iType >
 
 2183   static void assign( iType * stride ,
 
 2184                       const iType * 
const dims )
 
 2189       stride[4] = dims[4] * (
 
 2190       stride[3] = dims[3] * (
 
 2191       stride[2] = dims[2] * (
 
 2192       stride[1] = dims[1] * (
 
 2193       stride[0] = dims[0] ))));
 
 2200 template< 
typename Scalar , 
class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 >
 
 2201 struct Helper<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void>
 
 2204     Array<Scalar,FortranOrder,Tag4,Tag3,Tag2,Tag1,void,void,void,void>
 
 2208     Array<Scalar,NaturalOrder,Tag2,Tag3,Tag4,void,void,void,void,void>
 
 2211   template< 
class TagA >
 
 2214       Array<Scalar,NaturalOrder,TagA,Tag1,Tag2,Tag3,Tag4,void,void,void>
 
 2218       Array<Scalar,FortranOrder,Tag4,Tag3,Tag2,Tag1,TagA,void,void,void>
 
 2221     typedef  natural  type ;
 
 2222     typedef  fortran  reverse ;
 
 2227   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2229       return rank == Rank &&
 
 2230              tags[0] == & Tag4::tag() &&
 
 2231              tags[1] == & Tag3::tag() &&
 
 2232              tags[2] == & Tag2::tag() &&
 
 2233              tags[3] == & Tag1::tag();
 
 2236   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2238       tags[0] = & Tag4::tag();
 
 2239       tags[1] = & Tag3::tag();
 
 2240       tags[2] = & Tag2::tag();
 
 2241       tags[3] = & Tag1::tag();
 
 2248   template< 
typename iType >
 
 2249   static void assign( iType * stride )
 
 2255       stride[3] = Tag1::Size * (
 
 2256       stride[2] = Tag2::Size * (
 
 2257       stride[1] = Tag3::Size * (
 
 2258       stride[0] = Tag4::Size )));
 
 2261   template< 
typename iType >
 
 2262   static void assign( iType * stride ,
 
 2270       stride[2] = Tag2::Size * (
 
 2271       stride[1] = Tag3::Size * (
 
 2272       stride[0] = Tag4::Size )));
 
 2275   template< 
typename iType >
 
 2276   static void assign( iType * stride ,
 
 2286       stride[1] = Tag3::Size * (
 
 2287       stride[0] = Tag4::Size )));
 
 2290   template< 
typename iType >
 
 2291   static void assign( iType * stride ,
 
 2303       stride[0] = Tag4::Size )));
 
 2306   template< 
typename iType >
 
 2307   static void assign( iType * stride ,
 
 2323   template< 
typename iType >
 
 2324   static void assign( iType * stride ,
 
 2325                       const iType * 
const dims )
 
 2331       stride[3] = dims[0] * (
 
 2332       stride[2] = dims[1] * (
 
 2333       stride[1] = dims[2] * (
 
 2334       stride[0] = dims[3] )));
 
 2338 template< 
typename Scalar , 
class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 >
 
 2339 struct Helper<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void>
 
 2342     Array<Scalar,NaturalOrder,Tag4,Tag3,Tag2,Tag1,void,void,void,void>
 
 2346     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,void,void,void,void,void>
 
 2349   template< 
class TagA >
 
 2352       Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,TagA,void,void,void>
 
 2356       Array<Scalar,NaturalOrder,TagA,Tag4,Tag3,Tag2,Tag1,void,void,void>
 
 2359     typedef  fortran  type ;
 
 2360     typedef  natural  reverse ;
 
 2365   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2367       return rank == Rank &&
 
 2368              tags[0] == & Tag1::tag() &&
 
 2369              tags[1] == & Tag2::tag() &&
 
 2370              tags[2] == & Tag3::tag() &&
 
 2371              tags[3] == & Tag4::tag();
 
 2374   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2376       tags[0] = & Tag1::tag();
 
 2377       tags[1] = & Tag2::tag();
 
 2378       tags[2] = & Tag3::tag();
 
 2379       tags[3] = & Tag4::tag();
 
 2386   template< 
typename iType >
 
 2387   static void assign( iType * stride )
 
 2393       stride[3] = Tag4::Size * (
 
 2394       stride[2] = Tag3::Size * (
 
 2395       stride[1] = Tag2::Size * (
 
 2396       stride[0] = Tag1::Size )));
 
 2399   template< 
typename iType >
 
 2400   static void assign( iType * stride ,
 
 2408       stride[2] = Tag3::Size * (
 
 2409       stride[1] = Tag2::Size * (
 
 2410       stride[0] = Tag1::Size )));
 
 2413   template< 
typename iType >
 
 2414   static void assign( iType * stride ,
 
 2424       stride[1] = Tag2::Size * (
 
 2425       stride[0] = Tag1::Size )));
 
 2428   template< 
typename iType >
 
 2429   static void assign( iType * stride ,
 
 2441       stride[0] = Tag1::Size )));
 
 2444   template< 
typename iType >
 
 2445   static void assign( iType * stride ,
 
 2461   template< 
typename iType >
 
 2462   static void assign( iType * stride ,
 
 2463                       const iType * 
const dims )
 
 2469       stride[3] = dims[3] * (
 
 2470       stride[2] = dims[2] * (
 
 2471       stride[1] = dims[1] * (
 
 2472       stride[0] = dims[0] )));
 
 2479 template< 
typename Scalar , 
class Tag1 , 
class Tag2 , 
class Tag3 >
 
 2480 struct Helper<Scalar,NaturalOrder,Tag1,Tag2,Tag3,void,void,void,void,void>
 
 2483     Array<Scalar,FortranOrder,Tag3,Tag2,Tag1,void,void,void,void,void>
 
 2487     Array<Scalar,NaturalOrder,Tag2,Tag3,void,void,void,void,void,void>
 
 2490   template< 
class TagA >
 
 2493       Array<Scalar,NaturalOrder,TagA,Tag1,Tag2,Tag3,void,void,void,void>
 
 2497       Array<Scalar,FortranOrder,Tag3,Tag2,Tag1,TagA,void,void,void,void>
 
 2500     typedef  natural  type ;
 
 2501     typedef  fortran  reverse ;
 
 2506   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2508       return rank == Rank &&
 
 2509              tags[0] == & Tag3::tag() &&
 
 2510              tags[1] == & Tag2::tag() &&
 
 2511              tags[2] == & Tag1::tag();
 
 2514   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2516       tags[0] = & Tag3::tag();
 
 2517       tags[1] = & Tag2::tag();
 
 2518       tags[2] = & Tag1::tag();
 
 2526   template< 
typename iType >
 
 2527   static void assign( iType * stride )
 
 2534       stride[2] = Tag1::Size * (
 
 2535       stride[1] = Tag2::Size * (
 
 2536       stride[0] = Tag3::Size ));
 
 2539   template< 
typename iType >
 
 2540   static void assign( iType * stride ,
 
 2549       stride[1] = Tag2::Size * (
 
 2550       stride[0] = Tag3::Size ));
 
 2553   template< 
typename iType >
 
 2554   static void assign( iType * stride ,
 
 2565       stride[0] = Tag3::Size ));
 
 2568   template< 
typename iType >
 
 2569   static void assign( iType * stride ,
 
 2584   template< 
typename iType >
 
 2585   static void assign( iType * stride ,
 
 2586                       const iType * 
const dims )
 
 2593       stride[2] = dims[0] * (
 
 2594       stride[1] = dims[1] * (
 
 2595       stride[0] = dims[2] ));
 
 2599 template< 
typename Scalar , 
class Tag1 , 
class Tag2 , 
class Tag3 >
 
 2600 struct Helper<Scalar,FortranOrder,Tag1,Tag2,Tag3,void,void,void,void,void>
 
 2603     Array<Scalar,NaturalOrder,Tag3,Tag2,Tag1,void,void,void,void,void>
 
 2607     Array<Scalar,FortranOrder,Tag1,Tag2,void,void,void,void,void,void>
 
 2610   template< 
class TagA >
 
 2613       Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,TagA,void,void,void,void>
 
 2617       Array<Scalar,NaturalOrder,TagA,Tag3,Tag2,Tag1,void,void,void,void>
 
 2620     typedef  fortran  type ;
 
 2621     typedef  natural  reverse ;
 
 2626   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2628       return rank == Rank &&
 
 2629              tags[0] == & Tag1::tag() &&
 
 2630              tags[1] == & Tag2::tag() &&
 
 2631              tags[2] == & Tag3::tag();
 
 2634   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2636       tags[0] = & Tag1::tag();
 
 2637       tags[1] = & Tag2::tag();
 
 2638       tags[2] = & Tag3::tag();
 
 2646   template< 
typename iType >
 
 2647   static void assign( iType * stride )
 
 2654       stride[2] = Tag3::Size * (
 
 2655       stride[1] = Tag2::Size * (
 
 2656       stride[0] = Tag1::Size ));
 
 2659   template< 
typename iType >
 
 2660   static void assign( iType * stride ,
 
 2669       stride[1] = Tag2::Size * (
 
 2670       stride[0] = Tag1::Size ));
 
 2673   template< 
typename iType >
 
 2674   static void assign( iType * stride ,
 
 2685       stride[0] = Tag1::Size ));
 
 2688   template< 
typename iType >
 
 2689   static void assign( iType * stride ,
 
 2704   template< 
typename iType >
 
 2705   static void assign( iType * stride ,
 
 2706                       const iType * 
const dims )
 
 2713       stride[2] = dims[2] * (
 
 2714       stride[1] = dims[1] * (
 
 2715       stride[0] = dims[0] ));
 
 2722 template< 
typename Scalar , 
class Tag1 , 
class Tag2 >
 
 2723 struct Helper<Scalar,NaturalOrder,Tag1,Tag2,void,void,void,void,void,void>
 
 2726     Array<Scalar,FortranOrder,Tag2,Tag1,void,void,void,void,void,void>
 
 2730     Array<Scalar,NaturalOrder,Tag2,void,void,void,void,void,void,void>
 
 2733   template< 
class TagA >
 
 2736       Array<Scalar,NaturalOrder,TagA,Tag1,Tag2,void,void,void,void,void>
 
 2740       Array<Scalar,FortranOrder,Tag2,Tag1,TagA,void,void,void,void,void>
 
 2743     typedef  natural  type ;
 
 2744     typedef  fortran  reverse ;
 
 2749   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2751       return rank == Rank &&
 
 2752              tags[0] == & Tag2::tag() &&
 
 2753              tags[1] == & Tag1::tag();
 
 2756   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2758       tags[0] = & Tag2::tag();
 
 2759       tags[1] = & Tag1::tag();
 
 2768   template< 
typename iType >
 
 2769   static void assign( iType * stride )
 
 2777       stride[1] = Tag1::Size * (
 
 2778       stride[0] = Tag2::Size );
 
 2781   template< 
typename iType >
 
 2782   static void assign( iType * stride ,
 
 2792       stride[0] = Tag2::Size );
 
 2795   template< 
typename iType >
 
 2796   static void assign( iType * stride ,
 
 2810   template< 
typename iType >
 
 2811   static void assign( iType * stride ,
 
 2812                       const iType * 
const dims )
 
 2820       stride[1] = dims[0] * (
 
 2821       stride[0] = dims[1] );
 
 2825 template< 
typename Scalar , 
class Tag1 , 
class Tag2 >
 
 2826 struct Helper<Scalar,FortranOrder,Tag1,Tag2,void,void,void,void,void,void>
 
 2829     Array<Scalar,NaturalOrder,Tag2,Tag1,void,void,void,void,void,void>
 
 2833     Array<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void>
 
 2836   template< 
class TagA >
 
 2839       Array<Scalar,FortranOrder,Tag1,Tag2,TagA,void,void,void,void,void>
 
 2843       Array<Scalar,NaturalOrder,TagA,Tag2,Tag1,void,void,void,void,void>
 
 2846     typedef  fortran  type ;
 
 2847     typedef  natural  reverse ;
 
 2852   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2854       return rank == Rank &&
 
 2855              tags[0] = & Tag1::tag() &&
 
 2856              tags[1] = & Tag2::tag();
 
 2859   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2861       tags[0] = & Tag1::tag();
 
 2862       tags[1] = & Tag2::tag();
 
 2871   template< 
typename iType >
 
 2872   static void assign( iType * stride )
 
 2880       stride[1] = Tag2::Size * (
 
 2881       stride[0] = Tag1::Size );
 
 2884   template< 
typename iType >
 
 2885   static void assign( iType * stride ,
 
 2895       stride[0] = Tag1::Size );
 
 2898   template< 
typename iType >
 
 2899   static void assign( iType * stride ,
 
 2913   template< 
typename iType >
 
 2914   static void assign( iType * stride ,
 
 2915                       const iType * 
const dims )
 
 2923       stride[1] = dims[1] * (
 
 2924       stride[0] = dims[0] );
 
 2931 template< 
typename Scalar , 
class Tag1 >
 
 2932 struct Helper<Scalar,NaturalOrder,Tag1,void,void,void,void,void,void,void>
 
 2935     Array<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void>
 
 2939     Array<Scalar,RankZero,void,void,void,void,void,void,void,void>
 
 2942   template< 
class TagA >
 
 2945       Array<Scalar,NaturalOrder,TagA,Tag1,void,void,void,void,void,void>
 
 2949       Array<Scalar,FortranOrder,Tag1,TagA,void,void,void,void,void,void>
 
 2952     typedef  natural  type ;
 
 2953     typedef  fortran  reverse ;
 
 2958   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 2959     { 
return rank == Rank && tags[0] == & Tag1::tag(); }
 
 2961   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 2963       tags[0] = & Tag1::tag();
 
 2973   template< 
typename iType >
 
 2974   static void assign( iType * stride )
 
 2983       stride[0] = Tag1::Size ;
 
 2986   template< 
typename iType >
 
 2987   static void assign( iType * stride ,
 
 3000   template< 
typename iType >
 
 3001   static void assign( iType * stride ,
 
 3002                       const iType * 
const dims )
 
 3011       stride[0] = dims[0] ;
 
 3015 template< 
typename Scalar , 
class Tag1 >
 
 3016 struct Helper<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void>
 
 3019     Array<Scalar,NaturalOrder,Tag1,void,void,void,void,void,void,void>
 
 3023     Array<Scalar,RankZero,void,void,void,void,void,void,void,void>
 
 3026   template< 
class TagA >
 
 3029       Array<Scalar,FortranOrder,Tag1,TagA,void,void,void,void,void,void>
 
 3033       Array<Scalar,NaturalOrder,TagA,Tag1,void,void,void,void,void,void>
 
 3036     typedef  fortran  type ;
 
 3037     typedef  natural  reverse ;
 
 3042   static bool verify( int_t rank , 
const ArrayDimTag * tags[] )
 
 3043     { 
return rank == Rank && tags[0] == & Tag1::tag(); }
 
 3045   static void assign_tags( 
const ArrayDimTag * tags[] )
 
 3047       tags[0] = & Tag1::tag();
 
 3057   template< 
typename iType >
 
 3058   static void assign( iType * stride )
 
 3067       stride[0] = Tag1::Size ;
 
 3070   template< 
typename iType >
 
 3071   static void assign( iType * stride , 
const iType & n1 )
 
 3083   template< 
typename iType >
 
 3084   static void assign( iType * stride , 
const iType * 
const dims )
 
 3092       stride[0] = dims[0] ;
 
 3099 template< 
typename Scalar >
 
 3100 struct Helper<Scalar,RankZero,void,void,void,void,void,void,void,void>
 
 3103     Array<Scalar,RankZero,void,void,void,void,void,void,void,void>
 
 3106   template< 
class TagA >
 
 3109       Array<Scalar,NaturalOrder,TagA,void,void,void,void,void,void,void>
 
 3113       Array<Scalar,FortranOrder,TagA,void,void,void,void,void,void,void>
 
 3116     typedef natural type ;
 
 3117     typedef fortran reverse ;
 
 3122   template< 
typename iType >
 
 3123   static void assign( iType * ) {}
 
 3129 template< 
typename Scalar >
 
 3130 struct Helper<Scalar,NaturalOrder,void,void,void,void,void,void,void,void>
 
 3133     Array<Scalar,FortranOrder,void,void,void,void,void,void,void,void>
 
 3137 template< 
typename Scalar >
 
 3138 struct Helper<Scalar,FortranOrder,void,void,void,void,void,void,void,void>
 
 3141     Array<Scalar,NaturalOrder,void,void,void,void,void,void,void,void>
 
 3149 template< 
class ArrayType , 
class TagA > 
struct ArrayAppend {};
 
 3151 template< 
typename Scalar , 
ArrayOrder Order ,
 
 3152           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 3153           class Tag5 , 
class Tag6 , 
class Tag7 , 
class TagA >
 
 3155        Array<Scalar,Order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void> , TagA >
 
 3159     array_traits::Helper<Scalar,Order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void>
 
 3160       ::template append<TagA> helper ;
 
 3162   typedef typename helper::type    type ;
 
 3163   typedef typename helper::natural natural ;
 
 3164   typedef typename helper::fortran fortran ;
 
 3193 template< 
typename Scalar , ArrayOrder array_order >
 
 3194 class Array<Scalar,array_order,void,void,void,void,void,void,void,void>
 
 3197   typedef typename array_traits::Offset<array_order> Offset ;
 
 3221   enum { Contiguous = 
true };
 
 3240       array_traits::check_range( ord , m_rank );
 
 3241       if ( Natural ) { ord = ( m_rank - 1 ) - ord ; }
 
 3250       array_traits::check_range( ord , m_rank );
 
 3251       if ( Natural ) { ord = ( m_rank - 1 ) - ord ; }
 
 3252       return ord ? m_stride[ord] / m_stride[ord-1] : m_stride[ord] ;
 
 3256   template< 
typename iType >
 
 3260       for ( 
size_type i = 0 ; i < m_rank ; ++i ) { n[i] = dimension(i); }
 
 3275   template< 
typename iType >
 
 3277     { 
return Array( *
this , i ); }
 
 3283   template< 
typename iType >
 
 3286       SHARDS_ARRAY_CHECK( array_traits::check_range(i,size()) );
 
 3292   template< 
typename iType >
 
 3294                            const iType & i3 , 
const iType & i4 ,
 
 3295                            const iType & i5 , 
const iType & i6 ,
 
 3296                            const iType & i7 , 
const iType & i8 )
 const 
 3298       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 8 ) );
 
 3299       return m_ptr[ Offset::op(m_stride,i1,i2,i3,i4,i5,i6,i7,i8) ];
 
 3302   template< 
typename iType >
 
 3303   value_type & operator()( 
const iType & i1 , 
const iType & i2 ,
 
 3304                            const iType & i3 , 
const iType & i4 ,
 
 3305                            const iType & i5 , 
const iType & i6 ,
 
 3306                            const iType & i7 )
 const 
 3308       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 7 ) );
 
 3309       return m_ptr[ Offset::op(m_stride,i1,i2,i3,i4,i5,i6,i7) ];
 
 3312   template< 
typename iType >
 
 3313   value_type & operator()( 
const iType & i1 , 
const iType & i2 ,
 
 3314                            const iType & i3 , 
const iType & i4 ,
 
 3315                            const iType & i5 , 
const iType & i6 )
 const 
 3317       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 6 ) );
 
 3318       return m_ptr[ Offset::op(m_stride,i1,i2,i3,i4,i5,i6) ];
 
 3321   template< 
typename iType >
 
 3322   value_type & operator()( 
const iType & i1 , 
const iType & i2 ,
 
 3323                            const iType & i3 , 
const iType & i4 ,
 
 3324                            const iType & i5 )
 const 
 3326       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 5 ) );
 
 3327       return m_ptr[ Offset::op(m_stride,i1,i2,i3,i4,i5) ];
 
 3330   template< 
typename iType >
 
 3331   value_type & operator()( 
const iType & i1 , 
const iType & i2 ,
 
 3332                            const iType & i3 , 
const iType & i4 )
 const 
 3334       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 4 ) );
 
 3335       return m_ptr[ Offset::op(m_stride,i1,i2,i3,i4) ];
 
 3338   template< 
typename iType >
 
 3339   value_type & operator()( 
const iType & i1 , 
const iType & i2 ,
 
 3340                            const iType & i3 )
 const 
 3342       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 3 ) );
 
 3343       return m_ptr[ Offset::op(m_stride,i1,i2,i3) ];
 
 3346   template< 
typename iType >
 
 3347   value_type & operator()( 
const iType & i1 , 
const iType & i2 )
 const 
 3349       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 2 ) );
 
 3350       return m_ptr[ Offset::op(m_stride,i1,i2) ];
 
 3353   template< 
typename iType >
 
 3354   value_type & operator()( 
const iType & i1 )
 const 
 3356       SHARDS_ARRAY_CHECK( array_traits::check_rank( m_rank , 1 ) );
 
 3357       return m_ptr[ Offset::op(m_stride,i1) ];
 
 3367     array_traits::Helper<Scalar,array_order,void,void,void,void,void,void,void,void>
 
 3368       ::reverse  ReverseType ;
 
 3373     : m_ptr(NULL), m_rank(0)
 
 3375       Copy<8>( m_stride , (size_type) 0 );
 
 3376       Copy<8>( m_tag , (tag_type) NULL );
 
 3379   Array( 
const Array & rhs )
 
 3380     : m_ptr( rhs.m_ptr ), m_rank( rhs.m_rank )
 
 3382       Copy<8>( m_stride , rhs.m_stride );
 
 3383       Copy<8>( m_tag , rhs.m_tag );
 
 3386   Array & operator = ( 
const Array & rhs )
 
 3389       m_rank = rhs.m_rank ;
 
 3390       Copy<8>( m_stride , rhs.m_stride );
 
 3391       Copy<8>( m_tag , rhs.m_tag );
 
 3397     : m_ptr( rhs.m_ptr ), m_rank( rhs.m_rank )
 
 3399       Copy<8>( m_stride , rhs.m_stride );
 
 3404   Array & operator = ( 
const ReverseType & rhs )
 
 3407       m_rank = rhs.m_rank ;
 
 3408       Copy<8>( m_stride , rhs.m_stride );
 
 3416   Array( value_type * ptr ,
 
 3417          const size_type input_rank ,
 
 3418          const size_type * 
const dims ,
 
 3419          const tag_type  * 
const tags )
 
 3420     : m_ptr( ptr ), m_rank( input_rank )
 
 3422       array_traits::init_dim( m_stride, dims, input_rank, Natural);
 
 3423       array_traits::init_tags( m_tag,   tags, input_rank, Natural);
 
 3428   template< 
class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 3429             class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
 3430   Array & assign( value_type * ptr ,
 
 3431                   size_type n1 , size_type n2 , size_type n3 , size_type n4 ,
 
 3432                   size_type n5 , size_type n6 , size_type n7 , size_type n8 )
 
 3435       array_traits::Helper<Scalar,array_order,
 
 3436                            Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>
 
 3439     m_rank = helper::Rank ;
 
 3440     helper::assign_tags( m_tag );
 
 3441     helper::assign( m_stride, n1, n2, n3, n4, n5, n6, n7, n8 );
 
 3445   template< 
class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 3446             class Tag5 , 
class Tag6 , 
class Tag7 >
 
 3447   Array & assign( value_type * ptr ,
 
 3448                   size_type n1 , size_type n2 , size_type n3 , size_type n4 ,
 
 3449                   size_type n5 , size_type n6 , size_type n7 )
 
 3452       array_traits::Helper<Scalar,array_order,
 
 3453                            Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,
void>
 
 3456     m_rank = helper::Rank ;
 
 3457     helper::assign_tags( m_tag );
 
 3458     helper::assign( m_stride, n1, n2, n3, n4, n5, n6, n7 ); 
return *this ;
 
 3461   template< 
class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 3462             class Tag5 , 
class Tag6 >
 
 3463   Array & assign( value_type * ptr ,
 
 3464                   size_type n1 , size_type n2 , size_type n3 , size_type n4 ,
 
 3465                   size_type n5 , size_type n6 )
 
 3468       array_traits::Helper<Scalar,array_order,
 
 3469                            Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,
void>
 
 3472     m_rank = helper::Rank ;
 
 3473     helper::assign_tags( m_tag );
 
 3474     helper::assign( m_stride, n1, n2, n3, n4, n5, n6 );
 
 3478   template< 
class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 3480   Array & assign( value_type * ptr ,
 
 3481                   size_type n1 , size_type n2 , size_type n3 , size_type n4 ,
 
 3485       array_traits::Helper<Scalar,array_order,
 
 3486                            Tag1,Tag2,Tag3,Tag4,Tag5,void,void,
void>
 
 3489     m_rank = helper::Rank ;
 
 3490     helper::assign_tags( m_tag );
 
 3491     helper::assign( m_stride, n1, n2, n3, n4, n5 );
 
 3495   template< 
class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 >
 
 3496   Array & assign( value_type * ptr ,
 
 3497                   size_type n1 , size_type n2 , size_type n3 , size_type n4 )
 
 3500       array_traits::Helper<Scalar,array_order,
 
 3501                            Tag1,Tag2,Tag3,Tag4,void,void,void,
void>
 
 3504     m_rank = helper::Rank ;
 
 3505     helper::assign_tags( m_tag );
 
 3506     helper::assign( m_stride, n1, n2, n3, n4 );
 
 3510   template< 
class Tag1 , 
class Tag2 , 
class Tag3 >
 
 3511   Array & assign( value_type * ptr ,
 
 3512                   size_type n1 , size_type n2 , size_type n3 )
 
 3515       array_traits::Helper<Scalar,array_order,
 
 3516                            Tag1,Tag2,Tag3,void,void,void,void,
void>
 
 3519     m_rank = helper::Rank ;
 
 3520     helper::assign_tags( m_tag );
 
 3521     helper::assign( m_stride, n1, n2, n3 );
 
 3525   template< 
class Tag1 , 
class Tag2 >
 
 3526   Array & assign( value_type * ptr ,
 
 3527                   size_type n1 , size_type n2 )
 
 3530       array_traits::Helper<Scalar,array_order,
 
 3531                            Tag1,Tag2,void,void,void,void,void,
void>
 
 3534     m_rank = helper::Rank ;
 
 3535     helper::assign_tags( m_tag );
 
 3536     helper::assign( m_stride, n1, n2 );
 
 3540   template< 
class Tag1 >
 
 3541   Array & assign( value_type * ptr ,
 
 3545       array_traits::Helper<Scalar,array_order,
 
 3546                            Tag1,void,void,void,void,void,void,
void>
 
 3549     m_rank = helper::Rank ;
 
 3550     helper::assign_tags( m_tag );
 
 3551     helper::assign( m_stride, n1 );
 
 3558   Array( 
const Array & rhs , 
const size_type i )
 
 3559     : m_ptr( NULL ), m_rank( 0 )
 
 3561       if ( 1 < rhs.m_rank ) {
 
 3562         Copy<8>( m_stride , rhs.m_stride );
 
 3563         Copy<8>( m_tag , rhs.m_tag );
 
 3564         m_rank = rhs.m_rank - 1 ;
 
 3565         m_ptr  = rhs.m_ptr + ( m_rank ? m_stride[ m_rank - 1 ] * i : i );
 
 3566         m_stride[ m_rank ] = 0 ;
 
 3567         m_tag[ m_rank ] = 0 ;
 
 3570         Copy<8>( m_stride , (size_type) 0 );
 
 3571         Copy<8>( m_tag , (tag_type) NULL );
 
 3576   value_type * m_ptr ;
 
 3582   size_type  m_stride[8];
 
 3588             class , class , class , class ,
 
 3589             class , class , class , 
class >
 
 3612 template< 
typename Scalar , 
ArrayOrder array_order ,
 
 3613           class Tag1 , 
class Tag2 , 
class Tag3 , 
class Tag4 ,
 
 3614           class Tag5 , 
class Tag6 , 
class Tag7 , 
class Tag8 >
 
 3619 #ifndef DOXYGEN_COMPILE 
 3621     array_traits::Helper<Scalar,array_order,
 
 3622                          Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>
 
 3643   enum { Rank = helper::Rank };
 
 3652   enum { Contiguous = 
true };
 
 3668 #ifndef DOXYGEN_COMPILE 
 3670   template < 
size_type ordinate >
 
 3672     typedef typename array_traits::TagAt<Array,ordinate>::type type ;
 
 3678     { 
return m_array.tag( ordinate ); }
 
 3684       typedef array_traits::StrideDim<array_order,Rank,ordinate> StrideDim ;
 
 3685       return StrideDim::dimension(m_array.m_stride);
 
 3691       typedef array_traits::StrideDim<array_order,Rank> StrideDim ;
 
 3692       return StrideDim::dimension(m_array.m_stride,ordinate);
 
 3696   template< 
typename iType >
 
 3698     { m_array.template dimensions<iType>( n ); }
 
 3718   template< 
typename iType >
 
 3727   template< 
typename iType >
 
 3729     { 
return m_array[i]; }
 
 3732   template< 
typename iType >
 
 3734                            const iType & i3 , 
const iType & i4 ,
 
 3735                            const iType & i5 , 
const iType & i6 ,
 
 3736                            const iType & i7 , 
const iType & i8 )
 const 
 3738       array_traits::CheckRank<8,Rank>::ok();
 
 3739       return m_array(i1,i2,i3,i4,i5,i6,i7,i8);
 
 3743   template< 
typename iType >
 
 3745                            const iType & i3 , 
const iType & i4 ,
 
 3746                            const iType & i5 , 
const iType & i6 ,
 
 3747                            const iType & i7 )
 const 
 3749       array_traits::CheckRank<7,Rank>::ok();
 
 3750       return m_array(i1,i2,i3,i4,i5,i6,i7);
 
 3754   template< 
typename iType >
 
 3756                            const iType & i3 , 
const iType & i4 ,
 
 3757                            const iType & i5 , 
const iType & i6 )
 const 
 3759       array_traits::CheckRank<6,Rank>::ok();
 
 3760       return m_array(i1,i2,i3,i4,i5,i6);
 
 3764   template< 
typename iType >
 
 3766                            const iType & i3 , 
const iType & i4 ,
 
 3767                            const iType & i5 )
 const 
 3769       array_traits::CheckRank<5,Rank>::ok();
 
 3770       return m_array(i1,i2,i3,i4,i5);
 
 3774   template< 
typename iType >
 
 3776                            const iType & i3 , 
const iType & i4 )
 const 
 3778       array_traits::CheckRank<4,Rank>::ok();
 
 3779       return m_array(i1,i2,i3,i4);
 
 3783   template< 
typename iType >
 
 3785                            const iType & i3 )
 const 
 3787       array_traits::CheckRank<3,Rank>::ok();
 
 3788       return m_array(i1,i2,i3);
 
 3792   template< 
typename iType >
 
 3795       array_traits::CheckRank<2,Rank>::ok();
 
 3796       return m_array(i1,i2);
 
 3800   template< 
typename iType >
 
 3803       array_traits::CheckRank<1,Rank>::ok();
 
 3820     { m_array.m_rank = Rank ; helper::assign_tags( m_array.m_tag ); }
 
 3827     { m_array.operator=(rhs.m_array); 
return *this ; }
 
 3834     { m_array.operator=(rhs.m_array); 
return *this ; }
 
 3839       m_array.m_ptr = arg_ptr ;
 
 3840       array_traits::init_dim( m_array.m_stride , dims , Rank , Natural );
 
 3848       m_array.m_rank = Rank ;
 
 3849       helper::assign_tags( m_array.m_tag );
 
 3850       assign( arg_ptr , dims );
 
 3860       array_traits::CheckRange<7,Rank>::ok();
 
 3861       m_array.m_ptr  = arg_ptr ;
 
 3862       helper::assign( m_array.m_stride, n1, n2, n3, n4, n5, n6, n7, n8 );
 
 3874       m_array.m_rank = Rank ;
 
 3875       helper::assign_tags( m_array.m_tag );
 
 3876       assign( arg_ptr, n1, n2, n3, n4, n5, n6, n7, n8 );
 
 3888       array_traits::CheckRange<6,Rank>::ok();
 
 3889       m_array.m_ptr = arg_ptr ;
 
 3890       helper::assign( m_array.m_stride, n1, n2, n3, n4, n5, n6, n7 );
 
 3904       m_array.m_rank = Rank ;
 
 3905       helper::assign_tags( m_array.m_tag );
 
 3906       assign( arg_ptr, n1, n2, n3, n4, n5, n6, n7 );
 
 3917       array_traits::CheckRange<5,Rank>::ok();
 
 3918       m_array.m_ptr = arg_ptr ;
 
 3919       helper::assign( m_array.m_stride, n1, n2, n3, n4, n5, n6 );
 
 3932       m_array.m_rank = Rank ;
 
 3933       helper::assign_tags( m_array.m_tag );
 
 3934       assign( arg_ptr, n1, n2, n3, n4, n5, n6 );
 
 3945       array_traits::CheckRange<4,Rank>::ok();
 
 3946       m_array.m_ptr  = arg_ptr ;
 
 3947       helper::assign( m_array.m_stride, n1, n2, n3, n4, n5 );
 
 3960       m_array.m_rank = Rank ;
 
 3961       helper::assign_tags( m_array.m_tag );
 
 3962       assign( arg_ptr, n1, n2, n3, n4, n5 );
 
 3972       array_traits::CheckRange<3,Rank>::ok();
 
 3973       m_array.m_ptr  = arg_ptr ;
 
 3974       helper::assign( m_array.m_stride, n1, n2, n3, n4 );
 
 3986       m_array.m_rank = Rank ;
 
 3987       helper::assign_tags( m_array.m_tag );
 
 3988       assign( arg_ptr, n1, n2, n3, n4 );
 
 3998       array_traits::CheckRange<2,Rank>::ok();
 
 3999       m_array.m_ptr  = arg_ptr ;
 
 4000       helper::assign( m_array.m_stride, n1, n2, n3 );
 
 4012       m_array.m_rank = Rank ;
 
 4013       helper::assign_tags( m_array.m_tag );
 
 4014       assign( arg_ptr , n1, n2, n3 );
 
 4023       array_traits::CheckRange<1,Rank>::ok();
 
 4024       m_array.m_ptr  = arg_ptr ;
 
 4025       helper::assign( m_array.m_stride, n1, n2 );
 
 4035       m_array.m_rank = Rank ;
 
 4036       helper::assign_tags( m_array.m_tag );
 
 4037       assign( arg_ptr, n1, n2 );
 
 4045       array_traits::CheckRange<0,Rank>::ok();
 
 4046       m_array.m_ptr  = arg_ptr ;
 
 4047       helper::assign( m_array.m_stride, n1 );
 
 4057       m_array.m_rank = Rank ;
 
 4058       helper::assign_tags( m_array.m_tag );
 
 4059       assign( arg_ptr, n1 );
 
 4065       m_array.m_ptr = arg_ptr ;
 
 4066       helper::assign( m_array.m_stride );
 
 4074       m_array.m_rank = Rank ;
 
 4075       helper::assign_tags( m_array.m_tag );
 
 4083       if ( ! helper::verify( m_array.m_rank , m_array.m_tag ) ) {
 
 4084         m_array.m_rank = Rank ;
 
 4085         helper::assign_tags( m_array.m_tag );
 
 4086         array_traits::throw_bad_conversion( m_array.m_rank , m_array.m_tag ,
 
 4087                                             rhs.m_rank , rhs.m_tag );
 
 4102       m_array.m_ptr = arg_ptr ;
 
 4112       m_array.m_ptr = arg_ptr ;
 
 4113       Copy<Rank-1>( m_array.m_stride , arg_stride );
 
 4114       m_array.m_stride[Rank-1] = m_array.m_stride[Rank-2] * arg_final_dim ;
 
 4122     : m_array( rhs , i )
 
 4124       if ( ! helper::verify( m_array.m_rank , m_array.m_tag ) ) {
 
 4125         m_array.m_rank = Rank ;
 
 4126         helper::assign_tags( m_array.m_tag );
 
 4127         array_traits::throw_bad_conversion( m_array.m_rank , m_array.m_tag ,
 
 4128                                             rhs.m_rank - 1 , rhs.m_tag );
 
 4132   Array<value_type,array_order> m_array ;
 
 4135             class , class , class , class ,
 
 4136             class , class , class , 
class >
 
 4145 template< 
typename Scalar >
 
 4168   enum { Natural = 
false };
 
 4171   enum { Reverse = 
false };
 
 4174   enum { Contiguous = 
true };
 
 4211   Array() : m_ptr(NULL) {}
 
 4213   Array( 
const Array & rhs ) : m_ptr( rhs.m_ptr ) {}
 
 4215   Array & operator = ( 
const Array & rhs )
 
 4216     { m_ptr = rhs.m_ptr ; 
return *this ; }
 
 4221   Array( value_type * arg_ptr ) : m_ptr( arg_ptr ) {}
 
 4226 #ifndef DOXYGEN_COMPILE 
 4227   value_type * m_ptr ;
 
 4230             class , class , class , class ,
 
 4231             class , class , class , 
class >
 
 4245 #undef SHARDS_ARRAY_CHECK 
value_type * contiguous_data() const 
Pointer to contiguous block of member data. 
The  preferred  multi-dimensional Array interface with  compile-time  user-defined dimension ordinate...
helper::reverse ReverseType
The compatible multidimensional array with reversed multi-index ordering and dimension tags...
Array(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5, const size_type n6, const size_type n7)
Construct a Rank 7..8 array; use Tag#::Size for defaults. The input dimensions are the 7 slowest stri...
static const ArrayDimension & tag()
Singleton tag for ArrayDimension. 
value_type & operator[](const iType &i) const 
Access member via offset into contiguous block. 
bool contiguous() const 
If the member data storage is contiguous. 
virtual size_type to_index(size_type dimension, const std::string &label) const 
Given a dimension and input strige produce an index. 
bool contiguous() const 
If the member data storage is contiguous. 
Array(value_type *arg_ptr, const size_type n1)
Construct a Rank 1..8 array; use Tag#::Size for defaults. The input dimension is the slowest stride...
value_type & operator()(const iType &i1) const 
Access member of a Rank 1 array. 
ArrayOrder
Define  Natural  (C-language) or  Fortran  ordering of array dimensions. A RankZero array does not ha...
Array(value_type *arg_ptr, const size_type *const dims)
Construct with array of dimensions. 
Array & assign(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5)
Construct a Rank 5..8 array; use Tag#::Size for defaults. The input dimensions are the 5 slowest stri...
Array(const ReverseType &rhs)
Copy constructor for reverse type. 
const char * name() const 
Name of the tag, typically the name of the derived class. 
Array & assign(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5, const size_type n6)
Construct a Rank 6..8 array; use Tag#::Size for defaults. The input dimensions are the 6 slowest stri...
value_type * contiguous_data() const 
Pointer to contiguous block of member data. 
Array & assign(value_type *arg_ptr)
Construct a Rank 1..8 array; use Tag#::Size for defaults. 
value_type & operator()(const iType &i1, const iType &i2, const iType &i3, const iType &i4, const iType &i5, const iType &i6, const iType &i7) const 
Access member of a Rank 7 array. 
array_traits::int_t size_type
Type for sizes. 
Scalar value_type
Type of member data. 
size_type dimension(size_type ord) const 
Dimension of the given ordinate. 
size_type size() const 
Total number of member data items. 
size_type rank() const 
Rank of the array is the number of non-void dimension tags. 
array_traits::int_t size_type
Type for sizes. 
Abstract base class for array dimension tags supplied to the Array template class. 
bool reverse() const 
If the multidimension follows the reverse (Fortran) ordering. 
Scalar value_type
Type of member data. 
helper::truncate TruncateType
Subarray type that removes the slowest striding dimension (first natural or last fortran ordinate)...
void assign_stride(value_type *arg_ptr, const size_type *arg_stride)
Assign stride and pointer. 
bool natural() const 
If the multidimension follows the natural ordering. 
tag_type tag(const size_type ordinate) const 
Access the dimension tag-singleton for a given ordinate. 
Array & assign(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5, const size_type n6, const size_type n7, const size_type n8)
Construct a Rank 8 array. 
An anonymous array dimension tag, which is NOT the recommended usage. 
Array & assign(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5, const size_type n6, const size_type n7)
Construct a Rank 7..8 array; use Tag#::Size for defaults. The input dimensions are the 7 slowest stri...
Array(const Array< Scalar, array_order > &rhs)
Construct compile-time array from run-time array. 
value_type & operator[](const iType &i) const 
Access member via full ordering of members. 
value_type & operator()(const iType &i1, const iType &i2, const iType &i3, const iType &i4, const iType &i5, const iType &i6) const 
Access member of a Rank 6 array. 
value_type & operator()(const iType &i1, const iType &i2, const iType &i3, const iType &i4, const iType &i5, const iType &i6, const iType &i7, const iType &i8) const 
Access member via Rank 8 multi-index. 
const ArrayDimTag * tag_type
Type of runtime dimension tags. 
value_type & operator()(const iType &i1, const iType &i2) const 
Access member of a Rank 2 array. 
bool reverse() const 
If the multidimension follows the reverse (Fortran) ordering. 
Array(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5)
Construct a Rank 5..8 array; use Tag#::Size for defaults. The input dimensions are the 5 slowest stri...
size_type dimension(const size_type ordinate) const 
Dimension of the given ordinate. 
Array & assign(value_type *arg_ptr, const size_type *const dims)
Assign pointer and dimensions. 
Array(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5, const size_type n6, const size_type n7, const size_type n8)
Construct a Rank 8 array. 
value_type & operator()(const iType &i1, const iType &i2, const iType &i3, const iType &i4, const iType &i5, const iType &i6, const iType &i7, const iType &i8) const 
Access member of a Rank 8 array. 
void dimensions(std::vector< iType > &n)
Dimensions of all ordinates. 
void dimensions(std::vector< iType > &n)
Dimension of all ordinate. 
value_type * contiguous_data() const 
Pointer to contiguous block of member data. 
value_type & operator()(const iType &i1, const iType &i2, const iType &i3, const iType &i4) const 
Access member of a Rank 4 array. 
size_type size() const 
Total number of data items. 
value_type & operator()(const iType &i1, const iType &i2, const iType &i3, const iType &i4, const iType &i5) const 
Access member of a Rank 5 array. 
virtual const char * name() const =0
Name of the tag, typically the name of the derived class. 
const ArrayDimTag * tag_type
Type of runtime dimension tags. 
Array(const ReverseType &rhs)
Copy constructor for compatible reverse type. 
Array(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4, const size_type n5, const size_type n6)
Construct a Rank 6..8 array; use Tag#::Size for defaults. The input dimensions are the 6 slowest stri...
Array & assign(value_type *arg_ptr, const size_type n1, const size_type n2)
Construct a Rank 2..8 array; use Tag#::Size for defaults. The input dimensions are the 2 slowest stri...
TruncateType truncate(const iType &i) const 
Generate a subarray view of the array with the slowest striding ordinate offset by  i  and removed...
Array & assign(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4)
Construct a Rank 4..8 array; use Tag#::Size for defaults. The input dimensions are the 4 slowest stri...
size_type size() const 
Total number of member data items. 
Special tag to indicate that an array specification has degenerated to rank-zero, i...
bool contiguous() const 
If the member data storage is contiguous. 
bool reverse() const 
If the multidimension follows the reverse (Fortran) ordering. 
Array(value_type *arg_ptr, const size_type n1, const size_type n2)
Construct a Rank 2..8 array; use Tag#::Size for defaults. The input dimensions are the 2 slowest stri...
Array truncate(const iType &i) const 
Generate a subarray view of the array with the slowest striding ordinate offset by  i  and removed...
Array & assign(value_type *arg_ptr, const size_type n1)
Construct a Rank 1..8 array; use Tag#::Size for defaults. The input dimension is the slowest stride...
Use the Natural or C-language ordering for multi-dimensions where the right-most dimension is stride-...
Array & assign(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3)
Construct a Rank 3..8 array; use Tag#::Size for defaults. The input dimensions are the 3 slowest stri...
Use the Reverse or Fortran-language ordering for multi-dimensions where the left-most dimension is st...
tag_type tag(size_type ord) const 
Access the dimension tag-singleton for a given ordinate. 
Array()
Default constructor. 
Array(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3, const size_type n4)
Construct a Rank 4..8 array; use Tag#::Size for defaults. The input dimensions are the 4 slowest stri...
bool natural() const 
If the multidimension follows the natural ordering. 
void assign_stride(value_type *arg_ptr, const size_type *arg_stride, size_type arg_final_dim)
Assign stride and pointer. 
size_type dimension() const 
Dimension of the given ordinate. 
Array(const Array &rhs)
Copy constructor. 
const ArrayDimTag * tag_type
Type of runtime dimension tags. 
array_traits::int_t size_type
Type for sizes. 
bool natural() const 
If the multidimension follows the natural ordering. 
virtual std::string to_string(size_type dimension, size_type index) const 
Given a dimension and index produce a string for output. 
value_type & operator()() const 
Access member via Rank 0 multi-index. 
Array(value_type *arg_ptr, const size_type n1, const size_type n2, const size_type n3)
Construct a Rank 3..8 array; use Tag#::Size for defaults. The input dimensions are the 3 slowest stri...
size_type rank() const 
Rank of the array is the number of non-void dimension tags. 
value_type & operator()(const iType &i1, const iType &i2, const iType &i3) const 
Access member of a Rank 3 array. 
size_type rank() const 
Rank of the array is the number of non-void dimension tags. 
Scalar value_type
Type of member data. 
Array(value_type *arg_ptr)
Construct a Rank 1..8 array; use Tag#::Size for defaults.