On 05/27/11 14:14, Larry Evans wrote: [snip]
After finding:
Reference access(boost::type<Reference>,index idx,TPtr base, const size_type* extents, const index* strides, const index* index_bases) const {
BOOST_ASSERT(idx - index_bases[0] >= 0); BOOST_ASSERT(size_type(idx - index_bases[0]) < extents[0]); // return a sub_array
proxy object TPtr newbase = base + idx * strides[0]; return Reference(newbase,extents+1,strides+1,index_bases+1); in boost/multi_array/base.hpp, I'm guessing that array_dyn has no advantage in offset calculation since there's no test in that base.hpp code on general_storage_order<>::ascending. However, I'm still not sure how multi_array does it, unless it allows strides to be negative to account for a false ascending value and increments the base value to account for the negative strides, much like array_dyn's:
box_domain::init_iter_strides
Sorry for the noise about offset calculations.
After reading: http://www.boost.org/doc/libs/1_46_1/libs/multi_array /doc/reference.html#memory_layout which provides an example: Finally, both dimensions could be stored in descending order: int data[] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; int *a = data + 11; int s[] = { -4, -1 }; which strongly suggest that multi_array *does* use negative strides: int s[] = { -4, -1 }; *and* somehow performs an offset calculation to account for those: int *a = data + 11; I'm guessing that there's really no difference in the way array_dyn implements this reversal and offset calculation. The only difference is in the interface which uses a bool to specify whether an axis is reversed rather than a negative length. I just didn't see where this was done from looking at code :( -regards Larry