Boost logo

Boost :

From: Larry Evans (cppljevans_at_[hidden])
Date: 2007-12-07 12:05:02


On 12/06/07 18:40, Larry Evans wrote:
[snip]
> Then, the rank of array_fix_size would be Shape::size.
> You could calculate of strides using some mpl metafunction on
> Shape:
>
> typedef
> some-mpl-function
> < Shape
> >::type
> strides
> ;
>
> and then allocate storage as:
>
> Value
> values
> [ mpl::at_c<strides,Strides::size>::value
> ]
> ;
>
> Then operator[] could be defined as:
>
> Value&
> operator[](boost::array<unsigned,Shape::size>const& indices)
> {
> return values[some_offset_function_<strides>(indices)];
> }
>
> where some_offset_function simply performs a dot product of the
> compile time vector, strides, with the runtime vector, indices.
Andreas,

There actually some code to illustrate this in the fold_seq_test.zip
file at:

http://www.boost-consulting.com/vault/index.php?&directory=Template%20Metaprogramming

It's in the test_array_index_offset function. The fold_seq.hpp file
includes several other files on my local disk and I could upload those
if you're interested, but I think the test_array_index_offset code
illustrates the general idea. Hm... No actually it differs from
what's suggested in my previous post. Instead of that, there would
be something like:

     typedef
   unsigned
index_type
;
   struct
inner_product_static_dynamic_ftor
{
     explicit inner_product_static_dynamic_ftor
       ( index_type const* indices
       )
     : cur_index_ptr(indices)
     , offset(0)
     {}
       index_type const*
     cur_index_ptr
     ;
       index_type
     offset
     ;
     template<class PartialProductElement>
     void operator()(PartialProductElement)const
     {
         offset+=PartialProductElement::value*(*cur_index_ptr);
         ++cur_index_ptr;
     }
};
   template
   < class Strides
>
   index_type
offset_at_indices
   ( array<index_type,mpl::size<Strides>::value>const& a
   )
{
     index_type const*indices=a.data();
     inner_product_static_dynamic_ftor ip(indices);
     typedef mpl::pop_back<Strides>::type strides;//rm total array size.
     mpl::for_each<strides>(ip);
     return ip.offset;
}

*WARNING*: not compiled.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk