phdMesh Version of the Day
ArrayPrivate.hpp
00001 /*------------------------------------------------------------------------*/
00002 /*      phdMesh : Parallel Heterogneous Dynamic unstructured Mesh         */
00003 /*                Copyright (2008) Sandia Corporation                     */
00004 /*                                                                        */
00005 /*  Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive   */
00006 /*  license for use of this work by or on behalf of the U.S. Government.  */
00007 /*                                                                        */
00008 /*  This library is free software; you can redistribute it and/or modify  */
00009 /*  it under the terms of the GNU Lesser General Public License as        */
00010 /*  published by the Free Software Foundation; either version 2.1 of the  */
00011 /*  License, or (at your option) any later version.                       */
00012 /*                                                                        */
00013 /*  This library is distributed in the hope that it will be useful,       */
00014 /*  but WITHOUT ANY WARRANTY; without even the implied warranty of        */
00015 /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     */
00016 /*  Lesser General Public License for more details.                       */
00017 /*                                                                        */
00018 /*  You should have received a copy of the GNU Lesser General Public      */
00019 /*  License along with this library; if not, write to the Free Software   */
00020 /*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307   */
00021 /*  USA                                                                   */
00022 /*------------------------------------------------------------------------*/
00028 #ifndef util_ArrayPrivate_hpp
00029 #define util_ArrayPrivate_hpp
00030 
00031 namespace phdmesh {
00032 
00033 //----------------------------------------------------------------------
00034 
00040 unsigned array_stride_size(
00041   const unsigned  rank ,
00042   const unsigned * const stride );
00043 
00045 void array_stride_to_natural_dimensions(
00046   const unsigned   rank ,
00047   const unsigned * const stride ,
00048         unsigned * const dim );
00049 
00051 void array_stride_to_natural_indices(
00052   const unsigned   rank ,
00053   const unsigned * const stride ,
00054   const unsigned   offset ,
00055         unsigned * const indices );
00056 
00057 
00058 //----------------------------------------------------------------------
00059 
00060 #ifndef DOXYGEN_COMPILE
00061 
00062 void array_check_rank( const unsigned rank ,
00063                        const unsigned test_rank );
00064 
00065 void array_check_ordinal( const unsigned rank ,
00066                           const unsigned test_ordinal );
00067 
00068 void array_check_index( const unsigned dim ,
00069                         const unsigned index );
00070 
00071 void array_check_offset(  const unsigned size ,
00072                           const unsigned test_offset );
00073 
00074 void array_check_indices( const bool ,
00075                           const unsigned rank ,
00076                           const unsigned * const stride ,
00077                           const unsigned = 0 ,
00078                           const unsigned = 0 ,
00079                           const unsigned = 0 ,
00080                           const unsigned = 0 ,
00081                           const unsigned = 0 ,
00082                           const unsigned = 0 ,
00083                           const unsigned = 0 ,
00084                           const unsigned = 0 );
00085 
00086 //----------------------------------------------------------------------
00087 
00088 template< unsigned , unsigned > struct array_check_ordinal_is_less ;
00089 
00090 template<> struct array_check_ordinal_is_less<0,8> {};
00091 template<> struct array_check_ordinal_is_less<1,8> {};
00092 template<> struct array_check_ordinal_is_less<2,8> {};
00093 template<> struct array_check_ordinal_is_less<3,8> {};
00094 template<> struct array_check_ordinal_is_less<4,8> {};
00095 template<> struct array_check_ordinal_is_less<5,8> {};
00096 template<> struct array_check_ordinal_is_less<6,8> {};
00097 template<> struct array_check_ordinal_is_less<7,8> {};
00098 
00099 template<> struct array_check_ordinal_is_less<0,7> {};
00100 template<> struct array_check_ordinal_is_less<1,7> {};
00101 template<> struct array_check_ordinal_is_less<2,7> {};
00102 template<> struct array_check_ordinal_is_less<3,7> {};
00103 template<> struct array_check_ordinal_is_less<4,7> {};
00104 template<> struct array_check_ordinal_is_less<5,7> {};
00105 template<> struct array_check_ordinal_is_less<6,7> {};
00106 
00107 template<> struct array_check_ordinal_is_less<0,6> {};
00108 template<> struct array_check_ordinal_is_less<1,6> {};
00109 template<> struct array_check_ordinal_is_less<2,6> {};
00110 template<> struct array_check_ordinal_is_less<3,6> {};
00111 template<> struct array_check_ordinal_is_less<4,6> {};
00112 template<> struct array_check_ordinal_is_less<5,6> {};
00113 
00114 template<> struct array_check_ordinal_is_less<0,5> {};
00115 template<> struct array_check_ordinal_is_less<1,5> {};
00116 template<> struct array_check_ordinal_is_less<2,5> {};
00117 template<> struct array_check_ordinal_is_less<3,5> {};
00118 template<> struct array_check_ordinal_is_less<4,5> {};
00119 
00120 template<> struct array_check_ordinal_is_less<0,4> {};
00121 template<> struct array_check_ordinal_is_less<1,4> {};
00122 template<> struct array_check_ordinal_is_less<2,4> {};
00123 template<> struct array_check_ordinal_is_less<3,4> {};
00124 
00125 template<> struct array_check_ordinal_is_less<0,3> {};
00126 template<> struct array_check_ordinal_is_less<1,3> {};
00127 template<> struct array_check_ordinal_is_less<2,3> {};
00128 
00129 template<> struct array_check_ordinal_is_less<0,2> {};
00130 template<> struct array_check_ordinal_is_less<1,2> {};
00131 
00132 template<> struct array_check_ordinal_is_less<0,1> {};
00133 
00134 //----------------------------------------------------------------------
00135 
00136 template< class , unsigned > struct ArrayTagAt ;
00137 
00138 template< typename Scalar , ArrayOrder order ,
00139           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00140           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00141 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,0>
00142 { typedef Tag1 type ; };
00143 
00144 template< typename Scalar , ArrayOrder order ,
00145           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00146           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00147 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,1>
00148 { typedef Tag2 type ; };
00149 
00150 template< typename Scalar , ArrayOrder order ,
00151           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00152           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00153 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,2>
00154 { typedef Tag3 type ; };
00155 
00156 template< typename Scalar , ArrayOrder order ,
00157           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00158           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00159 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,3>
00160 { typedef Tag4 type ; };
00161 
00162 template< typename Scalar , ArrayOrder order ,
00163           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00164           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00165 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,4>
00166 { typedef Tag5 type ; };
00167 
00168 template< typename Scalar , ArrayOrder order ,
00169           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00170           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00171 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,5>
00172 { typedef Tag6 type ; };
00173 
00174 template< typename Scalar , ArrayOrder order ,
00175           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00176           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00177 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,6>
00178 { typedef Tag7 type ; };
00179 
00180 template< typename Scalar , ArrayOrder order ,
00181           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00182           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00183 struct ArrayTagAt<Array<Scalar,order,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>,7>
00184 { typedef Tag8 type ; };
00185 
00186 //----------------------------------------------------------------------
00187 //----------------------------------------------------------------------
00188 
00189 template< typename Scalar ,
00190           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00191           class Tag5 , class Tag6 , class Tag7 , class TApp >
00192 struct ArrayAppend<
00193   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void> , TApp >
00194 {
00195   typedef
00196     Array<Scalar,NaturalOrder,TApp,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7> type ;
00197 };
00198 
00199 template< typename Scalar ,
00200           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00201           class Tag5 , class Tag6 , class Tag7 , class TApp >
00202 struct ArrayAppend<
00203   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void> , TApp >
00204 {
00205   typedef
00206     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,TApp> type ;
00207 };
00208 
00209 template< typename Scalar ,
00210           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00211           class Tag5 , class Tag6 , class TApp >
00212 struct ArrayAppend<
00213   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void> , TApp >
00214 {
00215   typedef
00216     Array<Scalar,NaturalOrder,TApp,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void> type ;
00217 };
00218 
00219 template< typename Scalar ,
00220           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00221           class Tag5 , class Tag6 , class TApp >
00222 struct ArrayAppend<
00223   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void> , TApp >
00224 {
00225   typedef
00226     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,TApp,void> type ;
00227 };
00228 
00229 template< typename Scalar ,
00230           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00231           class Tag5 , class TApp >
00232 struct ArrayAppend<
00233   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void> , TApp >
00234 {
00235   typedef
00236     Array<Scalar,NaturalOrder,TApp,Tag1,Tag2,Tag3,Tag4,Tag5,void,void> type ;
00237 };
00238 
00239 template< typename Scalar ,
00240           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00241           class Tag5 , class TApp >
00242 struct ArrayAppend<
00243   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void> , TApp >
00244 {
00245   typedef
00246     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,TApp,void,void> type ;
00247 };
00248 
00249 template< typename Scalar ,
00250           class Tag1 , class Tag2 , class Tag3 , class Tag4 , class TApp >
00251 struct ArrayAppend<
00252   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void> , TApp >
00253 {
00254   typedef
00255     Array<Scalar,NaturalOrder,TApp,Tag1,Tag2,Tag3,Tag4,void,void,void> type ;
00256 };
00257 
00258 template< typename Scalar ,
00259           class Tag1 , class Tag2 , class Tag3 , class Tag4 , class TApp >
00260 struct ArrayAppend<
00261   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void> , TApp >
00262 {
00263   typedef
00264     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,TApp,void,void,void> type ;
00265 };
00266 
00267 template< typename Scalar ,
00268           class Tag1 , class Tag2 , class Tag3 , class TApp >
00269 struct ArrayAppend<
00270   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,void,void,void,void,void> , TApp >
00271 {
00272   typedef
00273     Array<Scalar,NaturalOrder,TApp,Tag1,Tag2,Tag3,void,void,void,void> type ;
00274 };
00275 
00276 template< typename Scalar ,
00277           class Tag1 , class Tag2 , class Tag3 , class TApp >
00278 struct ArrayAppend<
00279   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,void,void,void,void,void> , TApp >
00280 {
00281   typedef
00282     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,TApp,void,void,void,void> type ;
00283 };
00284 
00285 template< typename Scalar , class Tag1 , class Tag2 , class TApp >
00286 struct ArrayAppend<
00287   Array<Scalar,NaturalOrder,Tag1,Tag2,void,void,void,void,void,void> , TApp >
00288 {
00289   typedef
00290     Array<Scalar,NaturalOrder,TApp,Tag1,Tag2,void,void,void,void,void> type ;
00291 };
00292 
00293 template< typename Scalar , class Tag1 , class Tag2 , class TApp >
00294 struct ArrayAppend<
00295   Array<Scalar,FortranOrder,Tag1,Tag2,void,void,void,void,void,void> , TApp >
00296 {
00297   typedef
00298     Array<Scalar,FortranOrder,Tag1,Tag2,TApp,void,void,void,void,void> type ;
00299 };
00300 
00301 template< typename Scalar , class Tag1 , class TApp >
00302 struct ArrayAppend<
00303   Array<Scalar,NaturalOrder,Tag1,void,void,void,void,void,void,void> , TApp >
00304 {
00305   typedef
00306     Array<Scalar,NaturalOrder,TApp,Tag1,void,void,void,void,void,void> type ;
00307 };
00308 
00309 template< typename Scalar , class Tag1 , class TApp >
00310 struct ArrayAppend<
00311   Array<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void> , TApp >
00312 {
00313   typedef
00314     Array<Scalar,FortranOrder,Tag1,TApp,void,void,void,void,void,void> type ;
00315 };
00316 
00317 template< typename Scalar , class TApp >
00318 struct ArrayAppend<
00319   Array<Scalar,RankZero,void,void,void,void,void,void,void,void> , TApp >
00320 {
00321   typedef
00322     Array<Scalar,NaturalOrder,TApp,void,void,void,void,void,void,void> type ;
00323 };
00324 
00325 template< typename Scalar , class TApp >
00326 struct ArrayAppend<
00327   Array<Scalar,NaturalOrder,void,void,void,void,void,void,void,void> , TApp >
00328 { /* Cannot append to runtime-ranked array */ };
00329 
00330 template< typename Scalar , class TApp >
00331 struct ArrayAppend<
00332   Array<Scalar,FortranOrder,void,void,void,void,void,void,void,void> , TApp >
00333 { /* Cannot append to runtime-ranked array */ };
00334 
00335 //----------------------------------------------------------------------
00336 //----------------------------------------------------------------------
00337 
00338 template< class A > struct ArrayReverse ;
00339 
00340 template< typename Scalar ,
00341           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00342           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00343 struct ArrayReverse<
00344   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8> >
00345 {
00346   typedef
00347     Array<Scalar,FortranOrder,Tag8,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1> type ;
00348 };
00349 
00350 template< typename Scalar ,
00351           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00352           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00353 struct ArrayReverse<
00354   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8> >
00355 {
00356   typedef
00357     Array<Scalar,NaturalOrder,Tag8,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1> type ;
00358 };
00359 
00360 
00361 template< typename Scalar ,
00362           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00363           class Tag5 , class Tag6 , class Tag7 >
00364 struct ArrayReverse<
00365   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void> >
00366 {
00367   typedef
00368     Array<Scalar,FortranOrder,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void> type ;
00369 };
00370 
00371 template< typename Scalar ,
00372           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00373           class Tag5 , class Tag6 , class Tag7 >
00374 struct ArrayReverse<
00375   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void> >
00376 {
00377   typedef
00378     Array<Scalar,NaturalOrder,Tag7,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void> type ;
00379 };
00380 
00381 
00382 template< typename Scalar ,
00383           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00384           class Tag5 , class Tag6 >
00385 struct ArrayReverse<
00386   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void> >
00387 {
00388   typedef
00389     Array<Scalar,FortranOrder,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void,void> type ;
00390 };
00391 
00392 template< typename Scalar ,
00393           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00394           class Tag5 , class Tag6 >
00395 struct ArrayReverse<
00396   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void> >
00397 {
00398   typedef
00399     Array<Scalar,NaturalOrder,Tag6,Tag5,Tag4,Tag3,Tag2,Tag1,void,void> type ;
00400 };
00401 
00402 
00403 template< typename Scalar ,
00404           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00405           class Tag5 >
00406 struct ArrayReverse<
00407   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void> >
00408 {
00409   typedef
00410     Array<Scalar,FortranOrder,Tag5,Tag4,Tag3,Tag2,Tag1,void,void,void> type ;
00411 };
00412 
00413 template< typename Scalar ,
00414           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00415           class Tag5 >
00416 struct ArrayReverse<
00417   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void> >
00418 {
00419   typedef
00420     Array<Scalar,NaturalOrder,Tag5,Tag4,Tag3,Tag2,Tag1,void,void,void> type ;
00421 };
00422 
00423 
00424 template< typename Scalar ,
00425           class Tag1 , class Tag2 , class Tag3 , class Tag4 >
00426 struct ArrayReverse<
00427   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void> >
00428 {
00429   typedef
00430     Array<Scalar,FortranOrder,Tag4,Tag3,Tag2,Tag1,void,void,void,void> type ;
00431 };
00432 
00433 template< typename Scalar ,
00434           class Tag1 , class Tag2 , class Tag3 , class Tag4 >
00435 struct ArrayReverse<
00436   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void> >
00437 {
00438   typedef
00439     Array<Scalar,NaturalOrder,Tag4,Tag3,Tag2,Tag1,void,void,void,void> type ;
00440 };
00441 
00442 
00443 template< typename Scalar , class Tag1 , class Tag2 , class Tag3 >
00444 struct ArrayReverse<
00445   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,void,void,void,void,void> >
00446 {
00447   typedef
00448     Array<Scalar,FortranOrder,Tag3,Tag2,Tag1,void,void,void,void,void> type ;
00449 };
00450 
00451 template< typename Scalar , class Tag1 , class Tag2 , class Tag3 >
00452 struct ArrayReverse<
00453   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,void,void,void,void,void> >
00454 {
00455   typedef
00456     Array<Scalar,NaturalOrder,Tag3,Tag2,Tag1,void,void,void,void,void> type ;
00457 };
00458 
00459 
00460 template< typename Scalar , class Tag1 , class Tag2 >
00461 struct ArrayReverse<
00462   Array<Scalar,NaturalOrder,Tag1,Tag2,void,void,void,void,void,void> >
00463 {
00464   typedef
00465     Array<Scalar,FortranOrder,Tag2,Tag1,void,void,void,void,void,void> type ;
00466 };
00467 
00468 template< typename Scalar , class Tag1 , class Tag2 >
00469 struct ArrayReverse<
00470   Array<Scalar,FortranOrder,Tag1,Tag2,void,void,void,void,void,void> >
00471 {
00472   typedef
00473     Array<Scalar,NaturalOrder,Tag2,Tag1,void,void,void,void,void,void> type ;
00474 };
00475 
00476 
00477 template< typename Scalar , class Tag1 >
00478 struct ArrayReverse<
00479   Array<Scalar,NaturalOrder,Tag1,void,void,void,void,void,void,void> >
00480 {
00481   typedef
00482     Array<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void> type ;
00483 };
00484 
00485 template< typename Scalar , class Tag1 >
00486 struct ArrayReverse<
00487   Array<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void> >
00488 {
00489   typedef
00490     Array<Scalar,NaturalOrder,Tag1,void,void,void,void,void,void,void> type ;
00491 };
00492 
00493 
00494 template< typename Scalar >
00495 struct ArrayReverse<
00496   Array<Scalar,NaturalOrder,void,void,void,void,void,void,void,void> >
00497 {
00498   typedef
00499     Array<Scalar,FortranOrder,void,void,void,void,void,void,void,void> type ;
00500 };
00501 
00502 template< typename Scalar >
00503 struct ArrayReverse<
00504   Array<Scalar,FortranOrder,void,void,void,void,void,void,void,void> >
00505 {
00506   typedef
00507     Array<Scalar,NaturalOrder,void,void,void,void,void,void,void,void> type ;
00508 };
00509 
00510 
00511 //----------------------------------------------------------------------
00512 //----------------------------------------------------------------------
00513 
00514 template< class A > struct ArrayTruncate ;
00515 
00516 template< typename Scalar ,
00517           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00518           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00519 struct ArrayTruncate<
00520   Array<Scalar,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8> >
00521 {
00522   typedef
00523     Array<Scalar,NaturalOrder,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8,void> type ;
00524 };
00525 
00526 template< typename Scalar , class Tag1 >
00527 struct ArrayTruncate<
00528   Array<Scalar,NaturalOrder,Tag1,void,void,void,void,void,void,void> >
00529 {
00530   typedef Array<Scalar,RankZero,void,void,void,void,void,void,void,void> type ;
00531 };
00532 
00533 template< typename Scalar , class Tag1 >
00534 struct ArrayTruncate<
00535   Array<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void> >
00536 {
00537   typedef Array<Scalar,RankZero,void,void,void,void,void,void,void,void> type ;
00538 };
00539 
00540 template< typename Scalar , class Tag1 , class Tag2 >
00541 struct ArrayTruncate<
00542   Array<Scalar,FortranOrder,Tag1,Tag2,void,void,void,void,void,void> >
00543 {
00544   typedef
00545     Array<Scalar,FortranOrder,Tag1,void,void,void,void,void,void,void> type ;
00546 };
00547 
00548 template< typename Scalar , class Tag1 , class Tag2 , class Tag3 >
00549 struct ArrayTruncate<
00550   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,void,void,void,void,void> >
00551 {
00552   typedef
00553     Array<Scalar,FortranOrder,Tag1,Tag2,void,void,void,void,void,void> type ;
00554 };
00555 
00556 template< typename Scalar ,
00557           class Tag1 , class Tag2 , class Tag3 , class Tag4 >
00558 struct ArrayTruncate<
00559   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void> >
00560 {
00561   typedef
00562     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,void,void,void,void,void> type ;
00563 };
00564 
00565 template< typename Scalar ,
00566           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00567           class Tag5 >
00568 struct ArrayTruncate<
00569   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void> >
00570 {
00571   typedef
00572     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void> type ;
00573 };
00574 
00575 template< typename Scalar ,
00576           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00577           class Tag5 , class Tag6 >
00578 struct ArrayTruncate<
00579   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void> >
00580 {
00581   typedef
00582     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void> type ;
00583 };
00584 
00585 template< typename Scalar ,
00586           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00587           class Tag5 , class Tag6 , class Tag7 >
00588 struct ArrayTruncate<
00589   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void> >
00590 {
00591   typedef
00592     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void> type ;
00593 };
00594 
00595 template< typename Scalar ,
00596           class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00597           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00598 struct ArrayTruncate<
00599   Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8> >
00600 {
00601   typedef
00602     Array<Scalar,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void> type ;
00603 };
00604 
00605 //----------------------------------------------------------------------
00606 //----------------------------------------------------------------------
00607 
00608 template< ArrayOrder , unsigned Rank , unsigned Ordinal = 0 >
00609 struct ArrayStrideDim ;
00610 
00611 template< unsigned Rank , unsigned Ordinal >
00612 struct ArrayStrideDim<RankZero,Rank,Ordinal> {
00613 
00614   static unsigned dimension( const unsigned * )
00615     { return 0 ; }
00616 
00617   static unsigned dimension( const unsigned * , const unsigned & )
00618     { return 0 ; }
00619 };
00620 
00621 template< unsigned Rank >
00622 struct ArrayStrideDim<FortranOrder,Rank,0> {
00623   static unsigned dimension( const unsigned * stride )
00624     { return stride[0]; }
00625 
00626   static unsigned dimension( const unsigned * stride ,
00627                              const unsigned & ordinal )
00628     { return ordinal ? stride[ordinal] / stride[ordinal-1] : stride[0] ; }
00629 };
00630 
00631 template< unsigned Rank >
00632 struct ArrayStrideDim<NaturalOrder,Rank,0> {
00633   static unsigned dimension( const unsigned * stride ) { return stride[0]; }
00634 
00635   static unsigned dimension( const unsigned * stride ,
00636                              const unsigned & ordinal )
00637     {
00638       const unsigned i = ( Rank - 1 ) - ordinal ;
00639       return i ? stride[i] / stride[i-1] : stride[0] ;
00640     }
00641 };
00642 
00643 template< unsigned Rank , unsigned Ordinal >
00644 struct ArrayStrideDim<FortranOrder,Rank,Ordinal> {
00645   static unsigned dimension( const unsigned * stride )
00646     { return stride[Ordinal] / stride[Ordinal-1]; }
00647 };
00648 
00649 template< unsigned Rank , unsigned Ordinal >
00650 struct ArrayStrideDim<NaturalOrder,Rank,Ordinal> {
00651   static unsigned dimension( const unsigned * stride )
00652     {
00653       enum { I = ( Rank - 1 ) - Ordinal };
00654       return stride[I] / stride[I-1];
00655     }
00656 };
00657 
00658 //----------------------------------------------------------------------
00659 
00660 namespace {
00661 
00662 template< class Tag > const ArrayDimTag * array_dim_tag();
00663 
00664 template<>
00665 inline
00666 const ArrayDimTag * array_dim_tag<void>() { return NULL ; }
00667 
00668 template< class Tag >
00669 inline
00670 const ArrayDimTag * array_dim_tag() { return & Tag::tag(); }
00671 
00672 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00673           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00674 const ArrayDimTag * const * array_dim_tags()
00675 {
00676   static const ArrayDimTag * t[8] =
00677     {
00678       array_dim_tag< Tag1 >() ,
00679       array_dim_tag< Tag2 >() ,
00680       array_dim_tag< Tag3 >() ,
00681       array_dim_tag< Tag4 >() ,
00682       array_dim_tag< Tag5 >() ,
00683       array_dim_tag< Tag6 >() ,
00684       array_dim_tag< Tag7 >() ,
00685       array_dim_tag< Tag8 >()
00686     };
00687 
00688   return t ;
00689 }
00690 
00691 }
00692 
00693 //----------------------------------------------------------------------
00694 
00695 template< ArrayOrder array_order , unsigned rank >
00696 unsigned array_offset(
00697   const unsigned * const ,
00698   const unsigned & i1 , const unsigned & i2 ,
00699   const unsigned & i3 , const unsigned & i4 ,
00700   const unsigned & i5 , const unsigned & i6 ,
00701   const unsigned & i7 , const unsigned & i8 );
00702 
00703 template< ArrayOrder array_order , unsigned rank >
00704 unsigned array_offset(
00705   const unsigned * const ,
00706   const unsigned & i1 , const unsigned & i2 ,
00707   const unsigned & i3 , const unsigned & i4 ,
00708   const unsigned & i5 , const unsigned & i6 ,
00709   const unsigned & i7 );
00710 
00711 template< ArrayOrder array_order , unsigned rank >
00712 unsigned array_offset(
00713   const unsigned * const ,
00714   const unsigned & i1 , const unsigned & i2 ,
00715   const unsigned & i3 , const unsigned & i4 ,
00716   const unsigned & i5 , const unsigned & i6 );
00717 
00718 template< ArrayOrder array_order , unsigned rank >
00719 unsigned array_offset(
00720   const unsigned * const ,
00721   const unsigned & i1 , const unsigned & i2 ,
00722   const unsigned & i3 , const unsigned & i4 ,
00723   const unsigned & i5 );
00724 
00725 template< ArrayOrder array_order , unsigned rank >
00726 unsigned array_offset(
00727   const unsigned * const ,
00728   const unsigned & i1 , const unsigned & i2 ,
00729   const unsigned & i3 , const unsigned & i4 );
00730 
00731 template< ArrayOrder array_order , unsigned rank >
00732 unsigned array_offset(
00733   const unsigned * const ,
00734   const unsigned & i1 , const unsigned & i2 ,
00735   const unsigned & i3 );
00736 
00737 template< ArrayOrder array_order , unsigned rank >
00738 unsigned array_offset(
00739   const unsigned * const ,
00740   const unsigned & i1 , const unsigned & i2 );
00741 
00742 template< ArrayOrder array_order , unsigned rank >
00743 unsigned array_offset(
00744   const unsigned * const ,
00745   const unsigned & i1 );
00746 
00747 //----------------------------------------------------------------------
00748 
00749 template<> inline
00750 unsigned array_offset<FortranOrder,8>(
00751   const unsigned * const stride ,
00752   const unsigned & i1 , const unsigned & i2 ,
00753   const unsigned & i3 , const unsigned & i4 ,
00754   const unsigned & i5 , const unsigned & i6 ,
00755   const unsigned & i7 , const unsigned & i8 )
00756 {
00757   ARRAY_CHECK(array_check_indices(false,8,stride,i1,i2,i3,i4,i5,i6,i7,i8));
00758   return i1             + i2 * stride[0] +
00759          i3 * stride[1] + i4 * stride[2] +
00760          i5 * stride[3] + i6 * stride[4] +
00761          i7 * stride[5] + i8 * stride[6] ;
00762 }
00763 
00764 template<> inline
00765 unsigned array_offset<FortranOrder,7>(
00766   const unsigned * const stride ,
00767   const unsigned & i1 , const unsigned & i2 ,
00768   const unsigned & i3 , const unsigned & i4 ,
00769   const unsigned & i5 , const unsigned & i6 ,
00770   const unsigned & i7 )
00771 {
00772   ARRAY_CHECK(array_check_indices(false,7,stride,i1,i2,i3,i4,i5,i6,i7));
00773   return i1             + i2 * stride[0] +
00774          i3 * stride[1] + i4 * stride[2] +
00775          i5 * stride[3] + i6 * stride[4] +
00776          i7 * stride[5] ;
00777 }
00778 
00779 template<> inline
00780 unsigned array_offset<FortranOrder,6>(
00781   const unsigned * const stride ,
00782   const unsigned & i1 , const unsigned & i2 ,
00783   const unsigned & i3 , const unsigned & i4 ,
00784   const unsigned & i5 , const unsigned & i6 )
00785 {
00786   ARRAY_CHECK(array_check_indices(false,6,stride,i1,i2,i3,i4,i5,i6));
00787   return i1             + i2 * stride[0] +
00788          i3 * stride[1] + i4 * stride[2] +
00789          i5 * stride[3] + i6 * stride[4] ;
00790 }
00791 
00792 template<> inline
00793 unsigned array_offset<FortranOrder,5>(
00794   const unsigned * const stride ,
00795   const unsigned & i1 , const unsigned & i2 ,
00796   const unsigned & i3 , const unsigned & i4 ,
00797   const unsigned & i5 )
00798 {
00799   ARRAY_CHECK(array_check_indices(false,5,stride,i1,i2,i3,i4,i5));
00800   return i1             + i2 * stride[0] +
00801          i3 * stride[1] + i4 * stride[2] +
00802          i5 * stride[3] ;
00803 }
00804 
00805 template<> inline
00806 unsigned array_offset<FortranOrder,4>(
00807   const unsigned * const stride ,
00808   const unsigned & i1 , const unsigned & i2 ,
00809   const unsigned & i3 , const unsigned & i4 )
00810 {
00811   ARRAY_CHECK(array_check_indices(false,4,stride,i1,i2,i3,i4));
00812   return i1             + i2 * stride[0] +
00813          i3 * stride[1] + i4 * stride[2] ;
00814 }
00815 
00816 template<> inline
00817 unsigned array_offset<FortranOrder,3>(
00818   const unsigned * const stride ,
00819   const unsigned & i1 , const unsigned & i2 ,
00820   const unsigned & i3 )
00821 {
00822   ARRAY_CHECK(array_check_indices(false,3,stride,i1,i2,i3));
00823   return i1 + i2 * stride[0] + i3 * stride[1] ;
00824 }
00825 
00826 template<> inline
00827 unsigned array_offset<FortranOrder,2>(
00828   const unsigned * const stride ,
00829   const unsigned & i1 , const unsigned & i2 )
00830 {
00831   ARRAY_CHECK(array_check_indices(false,2,stride,i1,i2));
00832   return i1 + i2 * stride[0] ;
00833 }
00834 
00835 template<> inline
00836 unsigned array_offset<FortranOrder,1>(
00837   const unsigned * const ARRAY_CHECK( stride ) ,
00838   const unsigned & i1 )
00839 {
00840   ARRAY_CHECK(array_check_indices(false,1,stride,i1));
00841   return i1 ;
00842 }
00843 
00844 //----------------------------------------------------------------------
00845 
00846 template<> inline
00847 unsigned array_offset<NaturalOrder,8>(
00848   const unsigned * const stride ,
00849   const unsigned & i1 , const unsigned & i2 ,
00850   const unsigned & i3 , const unsigned & i4 ,
00851   const unsigned & i5 , const unsigned & i6 ,
00852   const unsigned & i7 , const unsigned & i8 )
00853 {
00854   ARRAY_CHECK(array_check_indices(true,8,stride,i1,i2,i3,i4,i5,i6,i7,i8));
00855   return i8             + i7 * stride[0] +
00856          i6 * stride[1] + i5 * stride[2] +
00857          i4 * stride[3] + i3 * stride[4] +
00858          i2 * stride[5] + i1 * stride[6] ;
00859 }
00860 
00861 template<> inline
00862 unsigned array_offset<NaturalOrder,7>(
00863   const unsigned * const stride ,
00864   const unsigned & i1 , const unsigned & i2 ,
00865   const unsigned & i3 , const unsigned & i4 ,
00866   const unsigned & i5 , const unsigned & i6 ,
00867   const unsigned & i7 )
00868 {
00869   ARRAY_CHECK(array_check_indices(true,7,stride,i1,i2,i3,i4,i5,i6,i7));
00870   return i7             + i6 * stride[0] +
00871          i5 * stride[1] + i4 * stride[2] +
00872          i3 * stride[3] + i2 * stride[4] +
00873          i1 * stride[5] ;
00874 }
00875 
00876 template<> inline
00877 unsigned array_offset<NaturalOrder,6>(
00878   const unsigned * const stride ,
00879   const unsigned & i1 , const unsigned & i2 ,
00880   const unsigned & i3 , const unsigned & i4 ,
00881   const unsigned & i5 , const unsigned & i6 )
00882 {
00883   ARRAY_CHECK(array_check_indices(true,6,stride,i1,i2,i3,i4,i5,i6));
00884   return i6             + i5 * stride[0] +
00885          i4 * stride[1] + i3 * stride[2] +
00886          i2 * stride[3] + i1 * stride[4] ;
00887 }
00888 
00889 template<> inline
00890 unsigned array_offset<NaturalOrder,5>(
00891   const unsigned * const stride ,
00892   const unsigned & i1 , const unsigned & i2 ,
00893   const unsigned & i3 , const unsigned & i4 ,
00894   const unsigned & i5 )
00895 {
00896   ARRAY_CHECK(array_check_indices(true,5,stride,i1,i2,i3,i4,i5));
00897   return i5             + i4 * stride[0] +
00898          i3 * stride[1] + i2 * stride[2] +
00899          i1 * stride[3] ;
00900 }
00901 
00902 template<> inline
00903 unsigned array_offset<NaturalOrder,4>(
00904   const unsigned * const stride ,
00905   const unsigned & i1 , const unsigned & i2 ,
00906   const unsigned & i3 , const unsigned & i4 )
00907 {
00908   ARRAY_CHECK(array_check_indices(true,4,stride,i1,i2,i3,i4));
00909   return i4             + i3 * stride[0] +
00910          i2 * stride[1] + i1 * stride[2] ;
00911 }
00912 
00913 template<> inline
00914 unsigned array_offset<NaturalOrder,3>(
00915   const unsigned * const stride ,
00916   const unsigned & i1 , const unsigned & i2 ,
00917   const unsigned & i3 )
00918 {
00919   ARRAY_CHECK(array_check_indices(true,3,stride,i1,i2,i3));
00920   return i3 + i2 * stride[0] + i1 * stride[1] ;
00921 }
00922 
00923 template<> inline
00924 unsigned array_offset<NaturalOrder,2>(
00925   const unsigned * const stride ,
00926   const unsigned & i1 , const unsigned & i2 )
00927 {
00928   ARRAY_CHECK(array_check_indices(true,2,stride,i1,i2));
00929   return i2 + i1 * stride[0] ;
00930 }
00931 
00932 template<> inline
00933 unsigned array_offset<NaturalOrder,1>(
00934   const unsigned * const ARRAY_CHECK( stride ) ,
00935   const unsigned & i1 )
00936 {
00937   ARRAY_CHECK(array_check_indices(true,1,stride,i1));
00938   return i1 ;
00939 }
00940 
00941 //----------------------------------------------------------------------
00942 
00943 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
00944           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
00945 struct Array<void,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>
00946 {
00947   enum { Rank = 8 };
00948 
00949   static void assign( unsigned * stride )
00950     {
00951         stride[7] = Tag8::Size * (
00952         stride[6] = Tag7::Size * (
00953         stride[5] = Tag6::Size * (
00954         stride[4] = Tag5::Size * (
00955         stride[3] = Tag4::Size * (
00956         stride[2] = Tag3::Size * (
00957         stride[1] = Tag2::Size * (
00958         stride[0] = Tag1::Size )))))));
00959     }
00960 
00961   static void assign( unsigned * stride ,
00962                       const unsigned & n8 )
00963     {
00964         stride[7] = n8 * (
00965         stride[6] = Tag7::Size * (
00966         stride[5] = Tag6::Size * (
00967         stride[4] = Tag5::Size * (
00968         stride[3] = Tag4::Size * (
00969         stride[2] = Tag3::Size * (
00970         stride[1] = Tag2::Size * (
00971         stride[0] = Tag1::Size )))))));
00972     }
00973 
00974   static void assign( unsigned * stride ,
00975                       const unsigned & n7 ,
00976                       const unsigned & n8 )
00977     {
00978         stride[7] = n8 * (
00979         stride[6] = n7 * (
00980         stride[5] = Tag6::Size * (
00981         stride[4] = Tag5::Size * (
00982         stride[3] = Tag4::Size * (
00983         stride[2] = Tag3::Size * (
00984         stride[1] = Tag2::Size * (
00985         stride[0] = Tag1::Size )))))));
00986     }
00987 
00988   static void assign( unsigned * stride ,
00989                       const unsigned & n6 ,
00990                       const unsigned & n7 ,
00991                       const unsigned & n8 )
00992     {
00993         stride[7] = n8 * (
00994         stride[6] = n7 * (
00995         stride[5] = n6 * (
00996         stride[4] = Tag5::Size * (
00997         stride[3] = Tag4::Size * (
00998         stride[2] = Tag3::Size * (
00999         stride[1] = Tag2::Size * (
01000         stride[0] = Tag1::Size )))))));
01001     }
01002 
01003   static void assign( unsigned * stride ,
01004                       const unsigned & n5 ,
01005                       const unsigned & n6 ,
01006                       const unsigned & n7 ,
01007                       const unsigned & n8 )
01008     {
01009         stride[7] = n8 * (
01010         stride[6] = n7 * (
01011         stride[5] = n6 * (
01012         stride[4] = n5 * (
01013         stride[3] = Tag4::Size * (
01014         stride[2] = Tag3::Size * (
01015         stride[1] = Tag2::Size * (
01016         stride[0] = Tag1::Size )))))));
01017     }
01018 
01019   static void assign( unsigned * stride ,
01020                       const unsigned & n4 ,
01021                       const unsigned & n5 ,
01022                       const unsigned & n6 ,
01023                       const unsigned & n7 ,
01024                       const unsigned & n8 )
01025     {
01026         stride[7] = n8 * (
01027         stride[6] = n7 * (
01028         stride[5] = n6 * (
01029         stride[4] = n5 * (
01030         stride[3] = n4 * (
01031         stride[2] = Tag3::Size  * (
01032         stride[1] = Tag2::Size  * (
01033         stride[0] = Tag1::Size  )))))));
01034     }
01035 
01036   static void assign( unsigned * stride ,
01037                       const unsigned & n3 ,
01038                       const unsigned & n4 ,
01039                       const unsigned & n5 ,
01040                       const unsigned & n6 ,
01041                       const unsigned & n7 ,
01042                       const unsigned & n8 )
01043     {
01044         stride[7] = n8 * (
01045         stride[6] = n7 * (
01046         stride[5] = n6 * (
01047         stride[4] = n5 * (
01048         stride[3] = n4 * (
01049         stride[2] = n3 * (
01050         stride[1] = Tag2::Size * (
01051         stride[0] = Tag1::Size )))))));
01052     }
01053 
01054   static void assign( unsigned * stride ,
01055                       const unsigned & n2 ,
01056                       const unsigned & n3 ,
01057                       const unsigned & n4 ,
01058                       const unsigned & n5 ,
01059                       const unsigned & n6 ,
01060                       const unsigned & n7 ,
01061                       const unsigned & n8 )
01062     {
01063         stride[7] = n8 * (
01064         stride[6] = n7 * (
01065         stride[5] = n6 * (
01066         stride[4] = n5 * (
01067         stride[3] = n4 * (
01068         stride[2] = n3 * (
01069         stride[1] = n2 * (
01070         stride[0] = Tag1::Size )))))));
01071     }
01072 
01073   static void assign( unsigned * stride ,
01074                       const unsigned & n1 ,
01075                       const unsigned & n2 ,
01076                       const unsigned & n3 ,
01077                       const unsigned & n4 ,
01078                       const unsigned & n5 ,
01079                       const unsigned & n6 ,
01080                       const unsigned & n7 ,
01081                       const unsigned & n8 )
01082     {
01083         stride[7] = n8 * (
01084         stride[6] = n7 * (
01085         stride[5] = n6 * (
01086         stride[4] = n5 * (
01087         stride[3] = n4 * (
01088         stride[2] = n3 * (
01089         stride[1] = n2 * (
01090         stride[0] = n1 )))))));
01091     }
01092 
01093   static void assign( unsigned * stride ,
01094                       const unsigned * const dims )
01095     {
01096         stride[7] = dims[7] * (
01097         stride[6] = dims[6] * (
01098         stride[5] = dims[5] * (
01099         stride[4] = dims[4] * (
01100         stride[3] = dims[3] * (
01101         stride[2] = dims[2] * (
01102         stride[1] = dims[1] * (
01103         stride[0] = dims[0] )))))));
01104     }
01105 };
01106 
01107 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
01108           class Tag5 , class Tag6 , class Tag7 >
01109 struct Array<void,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void>
01110 {
01111   enum { Rank = 7 };
01112 
01113   static void assign( unsigned * stride )
01114     {
01115         stride[6] = Tag7::Size * (
01116         stride[5] = Tag6::Size * (
01117         stride[4] = Tag5::Size * (
01118         stride[3] = Tag4::Size * (
01119         stride[2] = Tag3::Size * (
01120         stride[1] = Tag2::Size * (
01121         stride[0] = Tag1::Size ))))));
01122     }
01123 
01124   static void assign( unsigned * stride ,
01125                       const unsigned & n7 )
01126     {
01127         stride[6] = n7 * (
01128         stride[5] = Tag6::Size * (
01129         stride[4] = Tag5::Size * (
01130         stride[3] = Tag4::Size * (
01131         stride[2] = Tag3::Size * (
01132         stride[1] = Tag2::Size * (
01133         stride[0] = Tag1::Size ))))));
01134     }
01135 
01136   static void assign( unsigned * stride ,
01137                       const unsigned & n6 ,
01138                       const unsigned & n7 )
01139     {
01140         stride[6] = n7 * (
01141         stride[5] = n6 * (
01142         stride[4] = Tag5::Size * (
01143         stride[3] = Tag4::Size * (
01144         stride[2] = Tag3::Size * (
01145         stride[1] = Tag2::Size * (
01146         stride[0] = Tag1::Size ))))));
01147     }
01148 
01149   static void assign( unsigned * stride ,
01150                       const unsigned & n5 ,
01151                       const unsigned & n6 ,
01152                       const unsigned & n7 )
01153     {
01154         stride[6] = n7 * (
01155         stride[5] = n6 * (
01156         stride[4] = n5 * (
01157         stride[3] = Tag4::Size * (
01158         stride[2] = Tag3::Size * (
01159         stride[1] = Tag2::Size * (
01160         stride[0] = Tag1::Size ))))));
01161     }
01162 
01163   static void assign( unsigned * stride ,
01164                       const unsigned & n4 ,
01165                       const unsigned & n5 ,
01166                       const unsigned & n6 ,
01167                       const unsigned & n7 )
01168     {
01169         stride[6] = n7 * (
01170         stride[5] = n6 * (
01171         stride[4] = n5 * (
01172         stride[3] = n4 * (
01173         stride[2] = Tag3::Size * (
01174         stride[1] = Tag2::Size * (
01175         stride[0] = Tag1::Size ))))));
01176     }
01177 
01178   static void assign( unsigned * stride ,
01179                       const unsigned & n3 ,
01180                       const unsigned & n4 ,
01181                       const unsigned & n5 ,
01182                       const unsigned & n6 ,
01183                       const unsigned & n7 )
01184     {
01185         stride[6] = n7 * (
01186         stride[5] = n6 * (
01187         stride[4] = n5 * (
01188         stride[3] = n4 * (
01189         stride[2] = n3 * (
01190         stride[1] = Tag2::Size * (
01191         stride[0] = Tag1::Size ))))));
01192     }
01193 
01194   static void assign( unsigned * stride ,
01195                       const unsigned & n2 ,
01196                       const unsigned & n3 ,
01197                       const unsigned & n4 ,
01198                       const unsigned & n5 ,
01199                       const unsigned & n6 ,
01200                       const unsigned & n7 )
01201     {
01202         stride[6] = n7 * (
01203         stride[5] = n6 * (
01204         stride[4] = n5 * (
01205         stride[3] = n4 * (
01206         stride[2] = n3 * (
01207         stride[1] = n2 * (
01208         stride[0] = Tag1::Size ))))));
01209     }
01210 
01211   static void assign( unsigned * stride ,
01212                       const unsigned & n1 ,
01213                       const unsigned & n2 ,
01214                       const unsigned & n3 ,
01215                       const unsigned & n4 ,
01216                       const unsigned & n5 ,
01217                       const unsigned & n6 ,
01218                       const unsigned & n7 )
01219     {
01220         stride[6] = n7 * (
01221         stride[5] = n6 * (
01222         stride[4] = n5 * (
01223         stride[3] = n4 * (
01224         stride[2] = n3 * (
01225         stride[1] = n2 * (
01226         stride[0] = n1 ))))));
01227     }
01228 
01229   static void assign( unsigned * stride ,
01230                       const unsigned * const dims )
01231     {
01232         stride[6] = dims[6] * (
01233         stride[5] = dims[5] * (
01234         stride[4] = dims[4] * (
01235         stride[3] = dims[3] * (
01236         stride[2] = dims[2] * (
01237         stride[1] = dims[1] * (
01238         stride[0] = dims[0] ))))));
01239    }
01240 };
01241 
01242 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
01243           class Tag5 , class Tag6 >
01244 struct Array<void,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void>
01245 {
01246   enum { Rank = 6 };
01247 
01248   static void assign( unsigned * stride )
01249     {
01250         stride[5] = Tag6::Size * (
01251         stride[4] = Tag5::Size * (
01252         stride[3] = Tag4::Size * (
01253         stride[2] = Tag3::Size * (
01254         stride[1] = Tag2::Size * (
01255         stride[0] = Tag1::Size )))));
01256     }
01257 
01258   static void assign( unsigned * stride ,
01259                       const unsigned & n6 )
01260     {
01261         stride[5] = n6 * (
01262         stride[4] = Tag5::Size * (
01263         stride[3] = Tag4::Size * (
01264         stride[2] = Tag3::Size * (
01265         stride[1] = Tag2::Size * (
01266         stride[0] = Tag1::Size )))));
01267     }
01268 
01269   static void assign( unsigned * stride ,
01270                       const unsigned & n5 ,
01271                       const unsigned & n6 )
01272     {
01273         stride[5] = n6 * (
01274         stride[4] = n5 * (
01275         stride[3] = Tag4::Size * (
01276         stride[2] = Tag3::Size * (
01277         stride[1] = Tag2::Size * (
01278         stride[0] = Tag1::Size )))));
01279     }
01280 
01281   static void assign( unsigned * stride ,
01282                       const unsigned & n4 ,
01283                       const unsigned & n5 ,
01284                       const unsigned & n6 )
01285     {
01286         stride[5] = n6 * (
01287         stride[4] = n5 * (
01288         stride[3] = n4 * (
01289         stride[2] = Tag3::Size * (
01290         stride[1] = Tag2::Size * (
01291         stride[0] = Tag1::Size )))));
01292     }
01293 
01294   static void assign( unsigned * stride ,
01295                       const unsigned & n3 ,
01296                       const unsigned & n4 ,
01297                       const unsigned & n5 ,
01298                       const unsigned & n6 )
01299     {
01300         stride[5] = n6 * (
01301         stride[4] = n5 * (
01302         stride[3] = n4 * (
01303         stride[2] = n3 * (
01304         stride[1] = Tag2::Size * (
01305         stride[0] = Tag1::Size )))));
01306     }
01307 
01308   static void assign( unsigned * stride ,
01309                       const unsigned & n2 ,
01310                       const unsigned & n3 ,
01311                       const unsigned & n4 ,
01312                       const unsigned & n5 ,
01313                       const unsigned & n6 )
01314     {
01315         stride[5] = n6 * (
01316         stride[4] = n5 * (
01317         stride[3] = n4 * (
01318         stride[2] = n3 * (
01319         stride[1] = n2 * (
01320         stride[0] = Tag1::Size )))));
01321     }
01322 
01323   static void assign( unsigned * stride ,
01324                       const unsigned & n1 ,
01325                       const unsigned & n2 ,
01326                       const unsigned & n3 ,
01327                       const unsigned & n4 ,
01328                       const unsigned & n5 ,
01329                       const unsigned & n6 )
01330     {
01331         stride[5] = n6 * (
01332         stride[4] = n5 * (
01333         stride[3] = n4 * (
01334         stride[2] = n3 * (
01335         stride[1] = n2 * (
01336         stride[0] = n1 )))));
01337     }
01338 
01339   static void assign( unsigned * stride ,
01340                       const unsigned * const dims )
01341     {
01342         stride[5] = dims[5] * (
01343         stride[4] = dims[4] * (
01344         stride[3] = dims[3] * (
01345         stride[2] = dims[2] * (
01346         stride[1] = dims[1] * (
01347         stride[0] = dims[0] )))));
01348    }
01349 };
01350 
01351 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
01352           class Tag5 >
01353 struct Array<void,FortranOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void>
01354 {
01355   enum { Rank = 5 };
01356 
01357   static void assign( unsigned * stride )
01358     {
01359         stride[4] = Tag5::Size * (
01360         stride[3] = Tag4::Size * (
01361         stride[2] = Tag3::Size * (
01362         stride[1] = Tag2::Size * (
01363         stride[0] = Tag1::Size ))));
01364     }
01365 
01366   static void assign( unsigned * stride ,
01367                       const unsigned & n5 )
01368     {
01369         stride[4] = n5 * (
01370         stride[3] = Tag4::Size * (
01371         stride[2] = Tag3::Size * (
01372         stride[1] = Tag2::Size * (
01373         stride[0] = Tag1::Size ))));
01374     }
01375 
01376   static void assign( unsigned * stride ,
01377                       const unsigned & n4 ,
01378                       const unsigned & n5 )
01379     {
01380         stride[4] = n5 * (
01381         stride[3] = n4 * (
01382         stride[2] = Tag3::Size * (
01383         stride[1] = Tag2::Size * (
01384         stride[0] = Tag1::Size ))));
01385     }
01386 
01387   static void assign( unsigned * stride ,
01388                       const unsigned & n3 ,
01389                       const unsigned & n4 ,
01390                       const unsigned & n5 )
01391     {
01392         stride[4] = n5 * (
01393         stride[3] = n4 * (
01394         stride[2] = n3 * (
01395         stride[1] = Tag2::Size * (
01396         stride[0] = Tag1::Size ))));
01397     }
01398 
01399   static void assign( unsigned * stride ,
01400                       const unsigned & n2 ,
01401                       const unsigned & n3 ,
01402                       const unsigned & n4 ,
01403                       const unsigned & n5 )
01404     {
01405         stride[4] = n5 * (
01406         stride[3] = n4 * (
01407         stride[2] = n3 * (
01408         stride[1] = n2 * (
01409         stride[0] = Tag1::Size ))));
01410     }
01411 
01412   static void assign( unsigned * stride ,
01413                       const unsigned & n1 ,
01414                       const unsigned & n2 ,
01415                       const unsigned & n3 ,
01416                       const unsigned & n4 ,
01417                       const unsigned & n5 )
01418     {
01419         stride[4] = n5 * (
01420         stride[3] = n4 * (
01421         stride[2] = n3 * (
01422         stride[1] = n2 * (
01423         stride[0] = n1 ))));
01424     }
01425 
01426   static void assign( unsigned * stride ,
01427                       const unsigned * const dims )
01428     {
01429         stride[4] = dims[4] * (
01430         stride[3] = dims[3] * (
01431         stride[2] = dims[2] * (
01432         stride[1] = dims[1] * (
01433         stride[0] = dims[0] ))));
01434    }
01435 };
01436 
01437 
01438 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 >
01439 struct Array<void,FortranOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void>
01440 {
01441   enum { Rank = 4 };
01442 
01443   static void assign( unsigned * stride )
01444     {
01445         stride[3] = Tag4::Size * (
01446         stride[2] = Tag3::Size * (
01447         stride[1] = Tag2::Size * (
01448         stride[0] = Tag1::Size )));
01449     }
01450 
01451   static void assign( unsigned * stride ,
01452                       const unsigned & n4 )
01453     {
01454         stride[3] = n4 * (
01455         stride[2] = Tag3::Size * (
01456         stride[1] = Tag2::Size * (
01457         stride[0] = Tag1::Size )));
01458     }
01459 
01460   static void assign( unsigned * stride ,
01461                       const unsigned & n3 ,
01462                       const unsigned & n4 )
01463     {
01464         stride[3] = n4 * (
01465         stride[2] = n3 * (
01466         stride[1] = Tag2::Size * (
01467         stride[0] = Tag1::Size )));
01468     }
01469 
01470   static void assign( unsigned * stride ,
01471                       const unsigned & n2 ,
01472                       const unsigned & n3 ,
01473                       const unsigned & n4 )
01474     {
01475         stride[3] = n4 * (
01476         stride[2] = n3 * (
01477         stride[1] = n2 * (
01478         stride[0] = Tag1::Size )));
01479     }
01480 
01481   static void assign( unsigned * stride ,
01482                       const unsigned & n1 ,
01483                       const unsigned & n2 ,
01484                       const unsigned & n3 ,
01485                       const unsigned & n4 )
01486     {
01487         stride[3] = n4 * (
01488         stride[2] = n3 * (
01489         stride[1] = n2 * (
01490         stride[0] = n1 )));
01491     }
01492 
01493   static void assign( unsigned * stride ,
01494                       const unsigned * const dims )
01495     {
01496         stride[3] = dims[3] * (
01497         stride[2] = dims[2] * (
01498         stride[1] = dims[1] * (
01499         stride[0] = dims[0] )));
01500    }
01501 };
01502 
01503 template< class Tag1 , class Tag2 , class Tag3 >
01504 struct Array<void,FortranOrder,Tag1,Tag2,Tag3,void,void,void,void,void>
01505 {
01506   enum { Rank = 3 };
01507 
01508   static void assign( unsigned * stride )
01509     {
01510         stride[2] = Tag3::Size * (
01511         stride[1] = Tag2::Size * (
01512         stride[0] = Tag1::Size ));
01513     }
01514 
01515   static void assign( unsigned * stride ,
01516                       const unsigned & n3 )
01517     {
01518         stride[2] = n3 * (
01519         stride[1] = Tag2::Size * (
01520         stride[0] = Tag1::Size ));
01521     }
01522 
01523   static void assign( unsigned * stride ,
01524                       const unsigned & n2 ,
01525                       const unsigned & n3 )
01526     {
01527         stride[2] = n3 * (
01528         stride[1] = n2 * (
01529         stride[0] = Tag1::Size ));
01530     }
01531 
01532   static void assign( unsigned * stride ,
01533                       const unsigned & n1 ,
01534                       const unsigned & n2 ,
01535                       const unsigned & n3 )
01536     {
01537         stride[2] = n3 * (
01538         stride[1] = n2 * (
01539         stride[0] = n1 ));
01540     }
01541 
01542   static void assign( unsigned * stride ,
01543                       const unsigned * const dims )
01544     {
01545         stride[2] = dims[2] * (
01546         stride[1] = dims[1] * (
01547         stride[0] = dims[0] ));
01548    }
01549 };
01550 
01551 template< class Tag1 , class Tag2 >
01552 struct Array<void,FortranOrder,Tag1,Tag2,void,void,void,void,void,void>
01553 {
01554   enum { Rank = 2 };
01555 
01556   static void assign( unsigned * stride )
01557     { stride[1] = Tag2::Size * ( stride[0] = Tag1::Size ); }
01558 
01559   static void assign( unsigned * stride ,
01560                       const unsigned & n2 )
01561     { stride[1] = n2 * ( stride[0] = Tag1::Size ); }
01562 
01563   static void assign( unsigned * stride ,
01564                       const unsigned & n1 ,
01565                       const unsigned & n2 )
01566     { stride[1] = n2 * ( stride[0] = n1 ); }
01567 
01568   static void assign( unsigned * stride ,
01569                       const unsigned * const dims )
01570     { stride[1] = dims[1] * ( stride[0] = dims[0] ); }
01571 };
01572 
01573 template< class Tag1 >
01574 struct Array<void,FortranOrder,Tag1,void,void,void,void,void,void,void>
01575 {
01576   enum { Rank = 1 };
01577 
01578   static void assign( unsigned * stride ) { stride[0] = Tag1::Size ; }
01579 
01580   static void assign( unsigned * stride ,
01581                       const unsigned & n1 ) { stride[0] = n1 ; }
01582 
01583   static void assign( unsigned * stride ,
01584                       const unsigned * const dims )
01585     { stride[0] = dims[0] ; }
01586 };
01587 
01588 //----------------------------------------------------------------------
01589 
01590 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
01591           class Tag5 , class Tag6 , class Tag7 , class Tag8 >
01592 struct Array<void,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,Tag8>
01593 {
01594   enum { Rank = 8 };
01595 
01596   static void assign( unsigned * stride )
01597     {
01598         stride[7] = Tag1::Size * (
01599         stride[6] = Tag2::Size * (
01600         stride[5] = Tag3::Size * (
01601         stride[4] = Tag4::Size * (
01602         stride[3] = Tag5::Size * (
01603         stride[2] = Tag6::Size * (
01604         stride[1] = Tag7::Size * (
01605         stride[0] = Tag8::Size )))))));
01606     }
01607 
01608   static void assign( unsigned * stride ,
01609                       const unsigned & n1 )
01610     {
01611         stride[7] = n1 * (
01612         stride[6] = Tag2::Size * (
01613         stride[5] = Tag3::Size * (
01614         stride[4] = Tag4::Size * (
01615         stride[3] = Tag5::Size * (
01616         stride[2] = Tag6::Size * (
01617         stride[1] = Tag7::Size * (
01618         stride[0] = Tag8::Size )))))));
01619     }
01620 
01621   static void assign( unsigned * stride ,
01622                       const unsigned & n1 ,
01623                       const unsigned & n2 )
01624     {
01625         stride[7] = n1 * (
01626         stride[6] = n2 * (
01627         stride[5] = Tag3::Size * (
01628         stride[4] = Tag4::Size * (
01629         stride[3] = Tag5::Size * (
01630         stride[2] = Tag6::Size * (
01631         stride[1] = Tag7::Size * (
01632         stride[0] = Tag8::Size )))))));
01633     }
01634 
01635   static void assign( unsigned * stride ,
01636                       const unsigned & n1 ,
01637                       const unsigned & n2 ,
01638                       const unsigned & n3 )
01639     {
01640         stride[7] = n1 * (
01641         stride[6] = n2 * (
01642         stride[5] = n3 * (
01643         stride[4] = Tag4::Size * (
01644         stride[3] = Tag5::Size * (
01645         stride[2] = Tag6::Size * (
01646         stride[1] = Tag7::Size * (
01647         stride[0] = Tag8::Size )))))));
01648     }
01649 
01650   static void assign( unsigned * stride ,
01651                       const unsigned & n1 ,
01652                       const unsigned & n2 ,
01653                       const unsigned & n3 ,
01654                       const unsigned & n4 )
01655     {
01656         stride[7] = n1 * (
01657         stride[6] = n2 * (
01658         stride[5] = n3 * (
01659         stride[4] = n4 * (
01660         stride[3] = Tag5::Size * (
01661         stride[2] = Tag6::Size * (
01662         stride[1] = Tag7::Size * (
01663         stride[0] = Tag8::Size )))))));
01664     }
01665 
01666   static void assign( unsigned * stride ,
01667                       const unsigned & n1 ,
01668                       const unsigned & n2 ,
01669                       const unsigned & n3 ,
01670                       const unsigned & n4 ,
01671                       const unsigned & n5 )
01672     {
01673         stride[7] = n1 * (
01674         stride[6] = n2 * (
01675         stride[5] = n3 * (
01676         stride[4] = n4 * (
01677         stride[3] = n5 * (
01678         stride[2] = Tag6::Size  * (
01679         stride[1] = Tag7::Size  * (
01680         stride[0] = Tag8::Size  )))))));
01681     }
01682 
01683   static void assign( unsigned * stride ,
01684                       const unsigned & n1 ,
01685                       const unsigned & n2 ,
01686                       const unsigned & n3 ,
01687                       const unsigned & n4 ,
01688                       const unsigned & n5 ,
01689                       const unsigned & n6 )
01690     {
01691         stride[7] = n1 * (
01692         stride[6] = n2 * (
01693         stride[5] = n3 * (
01694         stride[4] = n4 * (
01695         stride[3] = n5 * (
01696         stride[2] = n6 * (
01697         stride[1] = Tag7::Size * (
01698         stride[0] = Tag8::Size )))))));
01699     }
01700 
01701   static void assign( unsigned * stride ,
01702                       const unsigned & n1 ,
01703                       const unsigned & n2 ,
01704                       const unsigned & n3 ,
01705                       const unsigned & n4 ,
01706                       const unsigned & n5 ,
01707                       const unsigned & n6 ,
01708                       const unsigned & n7 )
01709     {
01710         stride[7] = n1 * (
01711         stride[6] = n2 * (
01712         stride[5] = n3 * (
01713         stride[4] = n4 * (
01714         stride[3] = n5 * (
01715         stride[2] = n6 * (
01716         stride[1] = n7 * (
01717         stride[0] = Tag8::Size )))))));
01718     }
01719 
01720   static void assign( unsigned * stride ,
01721                       const unsigned & n1 ,
01722                       const unsigned & n2 ,
01723                       const unsigned & n3 ,
01724                       const unsigned & n4 ,
01725                       const unsigned & n5 ,
01726                       const unsigned & n6 ,
01727                       const unsigned & n7 ,
01728                       const unsigned & n8 )
01729     {
01730         stride[7] = n1 * (
01731         stride[6] = n2 * (
01732         stride[5] = n3 * (
01733         stride[4] = n4 * (
01734         stride[3] = n5 * (
01735         stride[2] = n6 * (
01736         stride[1] = n7 * (
01737         stride[0] = n8 )))))));
01738     }
01739 
01740   static void assign( unsigned * stride ,
01741                       const unsigned * const dims )
01742     {
01743         stride[7] = dims[0] * (
01744         stride[6] = dims[1] * (
01745         stride[5] = dims[2] * (
01746         stride[4] = dims[3] * (
01747         stride[3] = dims[4] * (
01748         stride[2] = dims[5] * (
01749         stride[1] = dims[6] * (
01750         stride[0] = dims[7] )))))));
01751     }
01752 };
01753 
01754 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
01755           class Tag5 , class Tag6 , class Tag7 >
01756 struct Array<void,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,Tag7,void>
01757 {
01758   enum { Rank = 7 };
01759 
01760   static void assign( unsigned * stride )
01761     {
01762         stride[6] = Tag1::Size * (
01763         stride[5] = Tag2::Size * (
01764         stride[4] = Tag3::Size * (
01765         stride[3] = Tag4::Size * (
01766         stride[2] = Tag5::Size * (
01767         stride[1] = Tag6::Size * (
01768         stride[0] = Tag7::Size ))))));
01769     }
01770 
01771   static void assign( unsigned * stride ,
01772                       const unsigned & n1 )
01773     {
01774         stride[6] = n1 * (
01775         stride[5] = Tag2::Size * (
01776         stride[4] = Tag3::Size * (
01777         stride[3] = Tag4::Size * (
01778         stride[2] = Tag5::Size * (
01779         stride[1] = Tag6::Size * (
01780         stride[0] = Tag7::Size ))))));
01781     }
01782 
01783   static void assign( unsigned * stride ,
01784                       const unsigned & n1 ,
01785                       const unsigned & n2 )
01786     {
01787         stride[6] = n1 * (
01788         stride[5] = n2 * (
01789         stride[4] = Tag3::Size * (
01790         stride[3] = Tag4::Size * (
01791         stride[2] = Tag5::Size * (
01792         stride[1] = Tag6::Size * (
01793         stride[0] = Tag7::Size ))))));
01794     }
01795 
01796   static void assign( unsigned * stride ,
01797                       const unsigned & n1 ,
01798                       const unsigned & n2 ,
01799                       const unsigned & n3 )
01800     {
01801         stride[6] = n1 * (
01802         stride[5] = n2 * (
01803         stride[4] = n3 * (
01804         stride[3] = Tag4::Size * (
01805         stride[2] = Tag5::Size * (
01806         stride[1] = Tag6::Size * (
01807         stride[0] = Tag7::Size ))))));
01808     }
01809 
01810   static void assign( unsigned * stride ,
01811                       const unsigned & n1 ,
01812                       const unsigned & n2 ,
01813                       const unsigned & n3 ,
01814                       const unsigned & n4 )
01815     {
01816         stride[6] = n1 * (
01817         stride[5] = n2 * (
01818         stride[4] = n3 * (
01819         stride[3] = n4 * (
01820         stride[2] = Tag5::Size * (
01821         stride[1] = Tag6::Size * (
01822         stride[0] = Tag7::Size ))))));
01823     }
01824 
01825   static void assign( unsigned * stride ,
01826                       const unsigned & n1 ,
01827                       const unsigned & n2 ,
01828                       const unsigned & n3 ,
01829                       const unsigned & n4 ,
01830                       const unsigned & n5 )
01831     {
01832         stride[6] = n1 * (
01833         stride[5] = n2 * (
01834         stride[4] = n3 * (
01835         stride[3] = n4 * (
01836         stride[2] = n5 * (
01837         stride[1] = Tag6::Size * (
01838         stride[0] = Tag7::Size ))))));
01839     }
01840 
01841   static void assign( unsigned * stride ,
01842                       const unsigned & n1 ,
01843                       const unsigned & n2 ,
01844                       const unsigned & n3 ,
01845                       const unsigned & n4 ,
01846                       const unsigned & n5 ,
01847                       const unsigned & n6 )
01848     {
01849         stride[6] = n1 * (
01850         stride[5] = n2 * (
01851         stride[4] = n3 * (
01852         stride[3] = n4 * (
01853         stride[2] = n5 * (
01854         stride[1] = n6 * (
01855         stride[0] = Tag7::Size ))))));
01856     }
01857 
01858   static void assign( unsigned * stride ,
01859                       const unsigned & n1 ,
01860                       const unsigned & n2 ,
01861                       const unsigned & n3 ,
01862                       const unsigned & n4 ,
01863                       const unsigned & n5 ,
01864                       const unsigned & n6 ,
01865                       const unsigned & n7 )
01866     {
01867         stride[6] = n1 * (
01868         stride[5] = n2 * (
01869         stride[4] = n3 * (
01870         stride[3] = n4 * (
01871         stride[2] = n5 * (
01872         stride[1] = n6 * (
01873         stride[0] = n7 ))))));
01874     }
01875 
01876   static void assign( unsigned * stride ,
01877                       const unsigned * const dims )
01878     {
01879         stride[6] = dims[0] * (
01880         stride[5] = dims[1] * (
01881         stride[4] = dims[2] * (
01882         stride[3] = dims[3] * (
01883         stride[2] = dims[4] * (
01884         stride[1] = dims[5] * (
01885         stride[0] = dims[6] ))))));
01886     }
01887 };
01888 
01889 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
01890           class Tag5 , class Tag6 >
01891 struct Array<void,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,Tag6,void,void>
01892 {
01893   enum { Rank = 6 };
01894 
01895   static void assign( unsigned * stride )
01896     {
01897         stride[5] = Tag1::Size * (
01898         stride[4] = Tag2::Size * (
01899         stride[3] = Tag3::Size * (
01900         stride[2] = Tag4::Size * (
01901         stride[1] = Tag5::Size * (
01902         stride[0] = Tag6::Size )))));
01903     }
01904 
01905   static void assign( unsigned * stride ,
01906                       const unsigned & n1 )
01907     {
01908         stride[5] = n1 * (
01909         stride[4] = Tag2::Size * (
01910         stride[3] = Tag3::Size * (
01911         stride[2] = Tag4::Size * (
01912         stride[1] = Tag5::Size * (
01913         stride[0] = Tag6::Size )))));
01914     }
01915 
01916   static void assign( unsigned * stride ,
01917                       const unsigned & n1 ,
01918                       const unsigned & n2 )
01919     {
01920         stride[5] = n1 * (
01921         stride[4] = n2 * (
01922         stride[3] = Tag3::Size * (
01923         stride[2] = Tag4::Size * (
01924         stride[1] = Tag5::Size * (
01925         stride[0] = Tag6::Size )))));
01926     }
01927 
01928   static void assign( unsigned * stride ,
01929                       const unsigned & n1 ,
01930                       const unsigned & n2 ,
01931                       const unsigned & n3 )
01932     {
01933         stride[5] = n1 * (
01934         stride[4] = n2 * (
01935         stride[3] = n3 * (
01936         stride[2] = Tag4::Size * (
01937         stride[1] = Tag5::Size * (
01938         stride[0] = Tag6::Size )))));
01939     }
01940 
01941   static void assign( unsigned * stride ,
01942                       const unsigned & n1 ,
01943                       const unsigned & n2 ,
01944                       const unsigned & n3 ,
01945                       const unsigned & n4 )
01946     {
01947         stride[5] = n1 * (
01948         stride[4] = n2 * (
01949         stride[3] = n3 * (
01950         stride[2] = n4 * (
01951         stride[1] = Tag5::Size * (
01952         stride[0] = Tag6::Size )))));
01953     }
01954 
01955   static void assign( unsigned * stride ,
01956                       const unsigned & n1 ,
01957                       const unsigned & n2 ,
01958                       const unsigned & n3 ,
01959                       const unsigned & n4 ,
01960                       const unsigned & n5 )
01961     {
01962         stride[5] = n1 * (
01963         stride[4] = n2 * (
01964         stride[3] = n3 * (
01965         stride[2] = n4 * (
01966         stride[1] = n5 * (
01967         stride[0] = Tag6::Size )))));
01968     }
01969 
01970   static void assign( unsigned * stride ,
01971                       const unsigned & n1 ,
01972                       const unsigned & n2 ,
01973                       const unsigned & n3 ,
01974                       const unsigned & n4 ,
01975                       const unsigned & n5 ,
01976                       const unsigned & n6 )
01977     {
01978         stride[5] = n1 * (
01979         stride[4] = n2 * (
01980         stride[3] = n3 * (
01981         stride[2] = n4 * (
01982         stride[1] = n5 * (
01983         stride[0] = n6 )))));
01984     }
01985 
01986   static void assign( unsigned * stride ,
01987                       const unsigned * const dims )
01988     {
01989         stride[5] = dims[0] * (
01990         stride[4] = dims[1] * (
01991         stride[3] = dims[2] * (
01992         stride[2] = dims[3] * (
01993         stride[1] = dims[4] * (
01994         stride[0] = dims[5] )))));
01995     }
01996 };
01997 
01998 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 ,
01999           class Tag5 >
02000 struct Array<void,NaturalOrder,Tag1,Tag2,Tag3,Tag4,Tag5,void,void,void>
02001 {
02002   enum { Rank = 5 };
02003 
02004   static void assign( unsigned * stride )
02005     {
02006         stride[4] = Tag1::Size * (
02007         stride[3] = Tag2::Size * (
02008         stride[2] = Tag3::Size * (
02009         stride[1] = Tag4::Size * (
02010         stride[0] = Tag5::Size ))));
02011     }
02012 
02013   static void assign( unsigned * stride ,
02014                       const unsigned & n1 )
02015     {
02016         stride[4] = n1 * (
02017         stride[3] = Tag2::Size * (
02018         stride[2] = Tag3::Size * (
02019         stride[1] = Tag4::Size * (
02020         stride[0] = Tag5::Size ))));
02021     }
02022 
02023   static void assign( unsigned * stride ,
02024                       const unsigned & n1 ,
02025                       const unsigned & n2 )
02026     {
02027         stride[4] = n1 * (
02028         stride[3] = n2 * (
02029         stride[2] = Tag3::Size * (
02030         stride[1] = Tag4::Size * (
02031         stride[0] = Tag5::Size ))));
02032     }
02033 
02034   static void assign( unsigned * stride ,
02035                       const unsigned & n1 ,
02036                       const unsigned & n2 ,
02037                       const unsigned & n3 )
02038     {
02039         stride[4] = n1 * (
02040         stride[3] = n2 * (
02041         stride[2] = n3 * (
02042         stride[1] = Tag4::Size * (
02043         stride[0] = Tag5::Size ))));
02044     }
02045 
02046   static void assign( unsigned * stride ,
02047                       const unsigned & n1 ,
02048                       const unsigned & n2 ,
02049                       const unsigned & n3 ,
02050                       const unsigned & n4 )
02051     {
02052         stride[4] = n1 * (
02053         stride[3] = n2 * (
02054         stride[2] = n3 * (
02055         stride[1] = n4 * (
02056         stride[0] = Tag5::Size ))));
02057     }
02058 
02059   static void assign( unsigned * stride ,
02060                       const unsigned & n1 ,
02061                       const unsigned & n2 ,
02062                       const unsigned & n3 ,
02063                       const unsigned & n4 ,
02064                       const unsigned & n5 )
02065     {
02066         stride[4] = n1 * (
02067         stride[3] = n2 * (
02068         stride[2] = n3 * (
02069         stride[1] = n4 * (
02070         stride[0] = n5 ))));
02071     }
02072 
02073   static void assign( unsigned * stride ,
02074                       const unsigned * const dims )
02075     {
02076         stride[4] = dims[0] * (
02077         stride[3] = dims[1] * (
02078         stride[2] = dims[2] * (
02079         stride[1] = dims[3] * (
02080         stride[0] = dims[4] ))));
02081     }
02082 };
02083 
02084 
02085 template< class Tag1 , class Tag2 , class Tag3 , class Tag4 >
02086 struct Array<void,NaturalOrder,Tag1,Tag2,Tag3,Tag4,void,void,void,void>
02087 {
02088   enum { Rank = 4 };
02089 
02090   static void assign( unsigned * stride )
02091     {
02092         stride[3] = Tag1::Size * (
02093         stride[2] = Tag2::Size * (
02094         stride[1] = Tag3::Size * (
02095         stride[0] = Tag4::Size )));
02096     }
02097 
02098   static void assign( unsigned * stride ,
02099                       const unsigned & n1 )
02100     {
02101         stride[3] = n1 * (
02102         stride[2] = Tag2::Size * (
02103         stride[1] = Tag3::Size * (
02104         stride[0] = Tag4::Size )));
02105     }
02106 
02107   static void assign( unsigned * stride ,
02108                       const unsigned & n1 ,
02109                       const unsigned & n2 )
02110     {
02111         stride[3] = n1 * (
02112         stride[2] = n2 * (
02113         stride[1] = Tag3::Size * (
02114         stride[0] = Tag4::Size )));
02115     }
02116 
02117   static void assign( unsigned * stride ,
02118                       const unsigned & n1 ,
02119                       const unsigned & n2 ,
02120                       const unsigned & n3 )
02121     {
02122         stride[3] = n1 * (
02123         stride[2] = n2 * (
02124         stride[1] = n3 * (
02125         stride[0] = Tag4::Size )));
02126     }
02127 
02128   static void assign( unsigned * stride ,
02129                       const unsigned & n1 ,
02130                       const unsigned & n2 ,
02131                       const unsigned & n3 ,
02132                       const unsigned & n4 )
02133     {
02134         stride[3] = n1 * (
02135         stride[2] = n2 * (
02136         stride[1] = n3 * (
02137         stride[0] = n4 )));
02138     }
02139 
02140   static void assign( unsigned * stride ,
02141                       const unsigned * const dims )
02142     {
02143         stride[3] = dims[0] * (
02144         stride[2] = dims[1] * (
02145         stride[1] = dims[2] * (
02146         stride[0] = dims[3] )));
02147     }
02148 };
02149 
02150 template< class Tag1 , class Tag2 , class Tag3 >
02151 struct Array<void,NaturalOrder,Tag1,Tag2,Tag3,void,void,void,void,void>
02152 {
02153   enum { Rank = 3 };
02154 
02155   static void assign( unsigned * stride )
02156     {
02157         stride[2] = Tag1::Size * (
02158         stride[1] = Tag2::Size * (
02159         stride[0] = Tag3::Size ));
02160     }
02161 
02162   static void assign( unsigned * stride ,
02163                       const unsigned & n1 )
02164     {
02165         stride[2] = n1 * (
02166         stride[1] = Tag2::Size * (
02167         stride[0] = Tag3::Size ));
02168     }
02169 
02170   static void assign( unsigned * stride ,
02171                       const unsigned & n1 ,
02172                       const unsigned & n2 )
02173     {
02174         stride[2] = n1 * (
02175         stride[1] = n2 * (
02176         stride[0] = Tag3::Size ));
02177     }
02178 
02179   static void assign( unsigned * stride ,
02180                       const unsigned & n1 ,
02181                       const unsigned & n2 ,
02182                       const unsigned & n3 )
02183     {
02184         stride[2] = n1 * (
02185         stride[1] = n2 * (
02186         stride[0] = n3 ));
02187     }
02188 
02189   static void assign( unsigned * stride ,
02190                       const unsigned * const dims )
02191     {
02192         stride[2] = dims[0] * (
02193         stride[1] = dims[1] * (
02194         stride[0] = dims[2] ));
02195     }
02196 };
02197 
02198 template< class Tag1 , class Tag2 >
02199 struct Array<void,NaturalOrder,Tag1,Tag2,void,void,void,void,void,void>
02200 {
02201   enum { Rank = 2 };
02202 
02203   static void assign( unsigned * stride )
02204     { stride[1] = Tag1::Size * ( stride[0] = Tag2::Size ); }
02205 
02206   static void assign( unsigned * stride ,
02207                       const unsigned & n1 )
02208     { stride[1] = n1 * ( stride[0] = Tag2::Size ); }
02209 
02210   static void assign( unsigned * stride ,
02211                       const unsigned & n1 ,
02212                       const unsigned & n2 )
02213     { stride[1] = n1 * ( stride[0] = n2 ); }
02214 
02215   static void assign( unsigned * stride ,
02216                       const unsigned * const dims )
02217     {
02218         stride[1] = dims[0] * (
02219         stride[0] = dims[1] );
02220     }
02221 };
02222 
02223 template< class Tag1 >
02224 struct Array<void,NaturalOrder,Tag1,void,void,void,void,void,void,void>
02225 {
02226   enum { Rank = 1 };
02227 
02228   static void assign( unsigned * stride ) { stride[0] = Tag1::Size ; }
02229 
02230   static void assign( unsigned * stride ,
02231                       const unsigned & n1 ) { stride[0] = n1 ; }
02232 
02233   static void assign( unsigned * stride ,
02234                       const unsigned * const dims )
02235     { stride[0] = dims[0] ; }
02236 };
02237 
02238 //----------------------------------------------------------------------
02239 
02240 template<>
02241 struct Array<void,RankZero,void,void,void,void,void,void,void,void>
02242 {
02243   enum { Rank = 0 };
02244 
02245   static void assign( unsigned * ) {}
02246 };
02247 
02248 //----------------------------------------------------------------------
02249 
02250 #endif /* DOXYGEN_COMPILE */
02251 
02254 } // namespace phdmesh
02255 
02256 #endif
02257 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator