From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2007-08-26 04:08:28


Ion Gaztañaga wrote:
> 1) Iterators
>
> Iterators containa pointer to node and they use ValueTraits to obtain
> the user value from the node. If an stateful ValueTraits is used, we
> also need to store a pointer to the value traits stored in the
> container. If I want zero overhead when using hooks or just value traits
> with static functions I have to avoid storing the pointer when the
> iterator is stateless.
>
> How do we know if an allocator is stateless? One possibility is to check
> if the ValueTraits is empty, that is, has no members. However, this does
> not guarantee that ValuetTraits will define static functions so that no
> pointer to ValueTraits is needed to convert from a node to a container.
> I think it's a good aproximation or I could also define a traits or
> internal constant to say "this ValueTraits is stateless/stateful". For
> the moment, my current option is to consider an empty ValueTratis
> stateless, so it must define conversion functions as static members.

Boost.TypeTraits defines boost::is_stateless, which would be the
appropriate extension point. Some compilers even provide intrinsics for
this traits template to work automatically.

> 2) Losing static functions
>
> Some member functions of intrusive containers are static, so that there
> is no need to have a reference to the container. This sometimes is very
> useful (e.g. list::iterator_to) but this can't be achieved if stateful
> value traits are used. I can think 3 options:
>
> -> Convert static functions in non-static (losing some advantages)
> -> Offer static and non-static versions. Static versions won't compile
> with stateful allocators (via BOOST_STATIC_ASSERT).
> -> Someone knows have to make a function static or not depending on a
> compile-time boolean.

As we're talking about inline functions you can just pass a (possibly
null) pointer to the state into a static functions and the additional
argument will get optimized out.

> 3) Stateless, but taking advantage of composition
>
> In a recent discussion about adding custom bucket traits to unordered
> containers a booster wanted to have the bucket outside the class (for
> example, to reuse that with other containers). With stateful allocators
> this can be possible if bucket traits are stateful an contain a pointer
> to the real bucket traits instance. But this increases the size of your
> intrusive container.

Overhead of this kind can always be optional using EBCO (like compressed
pair does).

Regards,
Tobias