Boost logo

Boost :

From: Larry Evans (cppljevans_at_[hidden])
Date: 2007-12-10 18:35:22


On 12/10/07 15:31, Andreas Harnack wrote:
> Larry Evans schrieb:
>> On 12/07/07 19:14, Larry Evans wrote:
>>> On 12/07/07 11:05, Larry Evans wrote:
>>> [snip]
Hi, Andreas.

[snip]

> efforts; I'm afraid, however, I don't quite know what you're
> aiming at. As I understand you want to extend the concept of the
> matrix as a two dimensional array to that of a multi dimensional
> array, assuming that they follow the same principles?

Yes.

> That sounds interesting, though I'm not sure that's sensible. I'm
> aiming at simplicity.

I understand, and I agree that this:

   template
   < class Value
   , class Shape
>
   struct
array_multi
: public
   mpl::eval_if_c
   < bool(mpl::size<Shape>::type::value-1)//if rank>1
   , mpl::identity //rank>1
     < array
       < array_multi
         < Value
         , typename
           mpl::pop_front
           < Shape
>::type
>
       , mpl::front
         < Shape
>::type::value
>
>
   , mpl::identity //rank==1
     < array
       < Value
       , mpl::front
         < Shape
>::type::value
>
>
>::type
{
};

is certainly more complex that this:

   template
   < typename T
   , unsigned int M
   , unsigned int N
>
   class
matrix
{
...
};

however, the array_multi "reuses" array; hence, is
less complex *and* more general since it can handle
any rank array. Hence, I thought the extra complexity
of, let's call it the inheritance spec, would be
worth the extra generality. After all, if just
simplicity is what you want, then just use boost::array.
OTOH, if your particular needs are just for rank 2
arrays, then your matrix is "made to order". OTOH,
as soon as someone comes up with a use-case for rank>2,
you have to reinvent what's essentially already provided
by array_multi. I guess it just depends on whether one
thinks the "bit" extra complexity of array_multi is worth
the increased generality (I know, that's obvious, but that
seems to be the essential reason for the matrix vs. array_multi
argument).

[snip]

> I'm not yet sure how deal with variable sized matrices (or
> rather whether to deal with them at all). They certainly will be
> important for some people, but would come at the price to give
> up compile time size checking.

Doesn't multi_array implement variable size arrays. I see there's:

template <typename ValueType,
           std::size_t NumDims,
           typename Allocator = std::allocator<ValueType> >
class multi_array {
...
   template <typename ExtentList>
   explicit multi_array(const ExtentList& sizes,
                        const storage_order_type& store = c_storage_order(),
                        const Allocator& alloc = Allocator());
...
};

on page:

http://www.boost.org/libs/multi_array/doc/reference.html#multi_array

so I guess it just fixes the rank (the NumDims template parameter).

And, BTW, apparently the multi_array authors seem to think
that the cost of extra template complexity is worth the gain in
generality; otherwise, they wouldn't have bothered with their
library.

-regards,
Larry


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