Boost logo

Boost :

From: Larry Evans (cppljevans_at_[hidden])
Date: 2007-12-06 19:40:57

On 12/06/07 16:07, Andreas Harnack wrote:
> Jens Seidel schrieb:
>> Nearly always the dimensions are variables, there are only a few rare
>> cases where you know these before. So how about making N and M variables
>> and providing one or two good memory allocators?
>>> T* data() { return &**m; }
>> Why not &m[0][0]?
> Just a matter of taste, I guess. Actually I'm not even sure yet
> that it's wise to use a two dimensional array at all. T m[M*N]
> would work equally well and since there's no interface yet that
> relies on that structure, the latter might even be the simpler
> approach. The two-dimensional array just felt to be more
> 'natural' for a matrix. (whatever that means :-) )
I think n-dimension would be pretty easy. Instead of:

template<typename T, unsigned int M, unsigned int N>
class matrix

you could provide:

template<typename Value, typename Shape>
class array_fix_shape

where, using concepts maybe, you could constrain Shape to be some
instance of mpl::vector_c<unsigned,S0,S1,...,Sn>.

Then, the rank of array_fix_size would be Shape::size.
You could calculate of strides using some mpl metafunction on

       < Shape

  and then allocate storage as:

      [ mpl::at_c<strides,Strides::size>::value

Then operator[] could be defined as:

   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.

Boost list run by bdawes at, gregod at, cpdaniel at, john at