|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2006-05-19 08:37:15
"John Maddock" <john_at_[hidden]> writes:
> All of which suggests that a compressed-tuple would be a good idea,
> although ordering the items within the tuple to ensure compression
> is actually a larger challenge than folks may have realised.
Actually I think this is pretty easy. Here's the sketch:
struct empty {};
template <class Key, class Value, class Tail = empty>
struct node : Tail
{
// typical associative lookup tricks using overloading, per
// Boost.Parameter library, or, I'm sure, Fusion's map
};
template <
class Types // MPL sequence
, class Keys // types by which we'll do lookup
>
struct compressed_tuple_base
{
typedef typename mpl::sort<
mpl::zip_view<Types,Keys>
, mpl::less<is_empty<mpl::first<_1> >, is_empty<mpl::first<_2> > >
>::type sorted_pairs;
typedef typename mpl::fold<
sorted_pairs
, node<mpl::second<_2>, mpl::first<_2>, _1>
, empty
>::type type;
};
template <
class Types // MPL sequence
, class Keys = mpl::range_c<int, 0, mpl::size<Types>::value>
>
struct compressed_tuple
: compressed_tuple_base<Types,Keys>::type
{
// ctors
// The easy ctor will initialize from a tuple of references,
// which we can build using tie()
...
// get<N> just does lookup with integral_c<int,N> as the key
};
> In the mean time if additional template constructors can be added, I see no
> problem with that.
I think I'll code it with fusion when I get a moment :).
-- Dave Abrahams Boost Consulting www.boost-consulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk