void access(Array& A, const mutable_array_tag&) { assign(A); access(A,const_array_tag()); const Array& CA = A; access(CA,const_array_tag()); }
int run_configuration(const StorageOrder3& so3, const StorageOrder4& so4, const Modifier& modifier) { // multi_array { typedef boost::multi_array<int,3> array; typename array::extent_gen extents; { array A(extents[2][3][4],so3); modifier.modify(A); access(A,mutable_array_tag()); } } // multi_array_ref { typedef boost::multi_array_ref<int,3> array_ref; typename array_ref::extent_gen extents; { int local[24]; array_ref A(local,extents[2][3][4],so3); modifier.modify(A); access(A,mutable_array_tag()); } } // const_multi_array_ref { typedef boost::multi_array_ref<int,3> array_ref; typedef boost::const_multi_array_ref<int,3> const_array_ref; typename array_ref::extent_gen extents; { int local[24]; array_ref A(local,extents[2][3][4],so3); modifier.modify(A); assign(A); const_array_ref B = A; access(B,const_array_tag()); } } // sub_array { typedef boost::multi_array<int,4> array; typename array::extent_gen extents; { array A(extents[2][2][3][4],so4); modifier.modify(A); typename array::template subarray<3>::type B = A[1]; access(B,mutable_array_tag()); } } // const_sub_array { typedef boost::multi_array<int,4> array; typename array::extent_gen extents; { array A(extents[2][2][3][4],so4); modifier.modify(A); typename array::template subarray<3>::type B = A[1]; assign(B); typename array::template const_subarray<3>::type C = B; access(C,const_array_tag()); } } // array_view { typedef boost::multi_array<int,3> array; typedef typename array::index_range range; typename array::index_gen indices; typename array::extent_gen extents; { typedef typename array::index index; array A(extents[4][5][6],so3); modifier.modify(A); const index idx0 = A.index_bases()[0]; const index idx1 = A.index_bases()[1]; const index idx2 = A.index_bases()[2]; typename array::template array_view<3>::type B =A[ indices[range(idx0+1,idx0+3)] [range(idx1+1,idx1+4)] [range(idx2+1,idx2+5)] ]; access(B,mutable_array_tag()); } } // const_array_view { typedef boost::multi_array<int,3> array; typedef typename array::index_range range; typename array::index_gen indices; typename array::extent_gen extents; { typedef typename array::index index; array A(extents[4][5][6],so3); modifier.modify(A); const index idx0 = A.index_bases()[0]; const index idx1 = A.index_bases()[1]; const index idx2 = A.index_bases()[2]; typename array::template array_view<3>::type B =A[ indices[range(idx0+1,idx0+3)] [range(idx1+1,idx1+4)] [range(idx2+1,idx2+5)] ]; assign(B); typename array::template const_array_view<3>::type C = B; access(C,const_array_tag()); } } return boost::exit_success; }