Boost logo

Boost :

From: Joao Abecasis (jpabecasis_at_[hidden])
Date: 2004-09-08 23:07:38


Hi!

I have written a small utility class to provide "empty member
optimization" for arbitrary types. The implementation makes use of the
empty base class optimization (EBCO) but avoids injection of the class.
A uniform and contained interface is exposed wether the optimization
applies or not:

    template <typename T, size_t Index>
    compressed_pair
    {
        // several constructors may be provided but, for now,
        // default and copy constructor
        typedef T value_type;
        value_type & get();
        value_type const & get() const;
    };

I believe this could be used as the basis for a compressed_tuple.

Here's a sample use:

    template <typename T0, typename T1>
    struct A
    : private compressed_member<T0>
    , private compressed_member<T1, 1>
    {
        typedef compressed_member<T0> member0;
        typedef compressed_member<T1, 1> member1;

        T0 const & first() { return base0::get(); }
        T1 const & second() { return base1::get(); }
    };

There is a catch with the current implementation: some regular empty
member (or regular empty member of some compressed_member) could end up
sharing address with an empty compressed_member. This happens because
compressed_member<T> does not inherit from T but hides this
"relationship" from the compiler.

Is there any interest in such an utility?

To test compressed member I wrote another (toy) utility: empty_store.
empty_store is an empty class with a static map that associates an
instance's address to data. Checks are made everywhere to ensure that no
two instances share the same address.

The code can be found (zipped) here: *http://tinyurl.com/4e85l*

Best regards,

João Abecasis


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