Boost logo

Boost :

From: Ion Gaztañaga (igaztanaga_at_[hidden])
Date: 2007-08-09 17:01:29


Tobias Schwinger wrote:
> As already admitted (in my reply to Ion), stateful function objects
> would be more flexible for the non-intrusive stuff.

I think a custom ValueTraits class just offers the necessary tools to
build the stateless (or using global variables) non-intrusive approach.
An alternative would be store a copy of ValueTraits inside the
container, yielding to a stateful function object. Container
constructors should take an additional ValueTraits parameter,
guaranteeing that the internal ValueTraits will be copy constructor. If
no ValueTraits object is provided a default constructed one might be
used. If EBO is used there wouldn't be any size overhead for the default
case (member or base ValueTraits).

> There are two much template parameters, already, and it seems that
> applying Boost.Parameter (to the template parameters of containers)
> would suit that library well:

The fact is that containers could accept an arbitrary number of options
For example: slist could just also store a pointer to the last element,
so that more functions are now constant-time functions.

As mentioned, the bucket management could be more customizable. There is
no logical requirement to have a bucket array. Buckets can be
represented with a ramdom access iterator and a size, so that buckets
can be implemented with a deque or any other container that might be
more suitable for an application.

> Positional template parameters whose meaning isn't immediately obvious
> (such as e.g. the non-type boolean ConstantTimeSize used by the
> Intrusive containers) tend make interfaces unintuitive, because readers
> of client code without in-depth knowledge of the library have to figure
> out what the arguments refer to. Named arguments OTOH lead to
> self-explanatory code.

I don't know much about Boost.Parameter but my goal is maintain
Boost.Intrusive independent of heavy template-metaprogramming machinery,
because the library is adequate for embedded systems and I wouldn't want
the executable to grow with type-info information/increased compilation
time created by meta-programming (I might absolutely wrong with this
sentence, so please feel free to correct). I want to maintain the
library *simple*. But I agree that so many options might confuse users.
Maybe a configuration structure might be better:

struct options
{
   //If not present, defaults to true
   static const bool contant_time_size = true;

   //If not present, defaults to std::size_t
   typedef unsigned short size_type;

   //...
};

list<T, options>

> I'd also like to see a 'T' parameter for straightforwardness
>
> template< class T, // [...]
> class container;
>
> so one could just say
>
> container<T>
>
> given 'T' has appropriate hooks installed. That "nested 'value_traits'
> business" feels pretty clumsy (much more than having the hooks inject
> public names) and it was my main motivation to look for something better.

One option would be to detect if the passed value parameter is a
value_traits class. If not, a base hook is supposed. But note that if
several base hooks are used, you *must* tell the container which hook
you want to use:

struct tag1;
struct tag2;

struct my_type
   : public list_hook<tag1>
   , public list_hook<tag2>
{};

No automatic detection will work here. T is the same for slist, but the
hook to be used is different. What I could do, is to simplify the most
common case (simple base hook).
> Hope I haven't complained too much... The library is great; I have the
> impression that a lot of care went into the implementation -- its
> interface just /deserves/ some polishing ;-).

I agree. It's just that I haven't found a better interface that
preserves all the possibilities of the library. But I'm pretty sure that
interface exists ;-)

Regards,

Ion


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