Boost logo

Boost :

From: Joerg Walter (jhr.walter_at_[hidden])
Date: 2004-03-27 12:44:48


Hi Joaquin,

you wrote:

> > > > I miserably failed to define a composite unique key for my
indexed_set.
> [...]
> >
> > I already had. Trying to define
> >
> > typedef is::indexed_set<
> > study,
> > is::index_list<
> > is::non_unique<is::tag<student_tag>,
> > is::identity<study>, advisor_comparer>,
> > is::non_unique<is::tag<advisor_tag>,
> > is::identity<study>, date_comparer>
> > is::unique<is::tag<pk_tag>, compose_key<
> > BOOST_INDEXED_SET_MEMBER(study, string, name),
> > BOOST_INDEXED_SET_MEMBER(study, string, advisor)
> > >
> > >,
> > >
> > > tcs_genealogy;
> >
> > failed to compile in compose_key's
> >
> > template<typename Arg>
> > result_type operator()(Arg& arg)const;
> >
>
> Now I think I know what you're after. compose_key composes
> two keys the way mathematical composition of functions
> work, i.e.
>
> comp_key(arg) := key1(key2(arg))
>
> and this is not what you want to do (if I understood you
> right.) Instead, you may use lex_compare (as you are already
> doing in your TCS port.)

Yes, something like

typedef is::indexed_set<
  study,
  is::index_list<
    is::unique<is::tag<student_tag>,
        is::identity<const study>, advisor_comparer>,
    is::non_unique<is::tag<advisor_tag>,
        is::identity<const study>, date_comparer>
>
> tcs_genealogy;

does what I want. Thanks!

[...]

> > If namespace boost is not OK, then namespace boost::container probably
would
> > be a better choice.
>
> But I think auxiliary components (index_list, unique, tag, etc.)
> should have a namespace of their own. They're too specific to
> inhabit boost::container, IMHO.

OTOH it might be surprising to search for the components of one library in
different namespaces.

Two more remarks:

1. Documentation

My linux browser (konqueror) has difficulties to correctly display the
indexed_set documentation. HTML tidy shows a couple of problems.

2. Performance test

Compiling the performance tests with ICC 8.0 uncovered a problem in
indexed_set.hpp:

67,69c67,69
< template <typename,typename,typename,typename> friend class
detail::index_base;
< template <typename,typename> friend class
detail::header_holder;
< template <typename,typename> friend class
detail::converter;

---
>   template <typename,typename,typename> friend class  detail::index_base;
>   template <typename,typename>          friend class
detail::header_holder;
>   template <typename,typename>          friend class  detail::converter;
Test results for GCC 3.3.2
1 regular index
  10^3 elmts: 141.24%
  10^4 elmts: 147.67%
  10^5 elmts: 152.57%
  space gain: 100.00%
1 sequenced index
  10^3 elmts: 154.99%
  10^4 elmts: 157.43%
  10^5 elmts: 153.71%
  space gain: 100.00%
2 regular indices
  10^3 elmts: 108.23%
  10^4 elmts: 124.78%
  10^5 elmts: 121.79%
  space gain:  90.00%
1 regular index + 1 sequenced index
  10^3 elmts: 123.96%
  10^4 elmts: 137.12%
  10^5 elmts: 145.98%
  space gain:  87.50%
3 regular indices
  10^3 elmts: 100.11%
  10^4 elmts: 119.70%
  10^5 elmts: 129.12%
  space gain:  86.67%
2 regular indices + 1 sequenced index
  10^3 elmts:  99.25%
  10^4 elmts: 113.62%
  10^5 elmts: 116.37%
  space gain:  84.62%
Test results for ICC 8.0
1 regular index
  10^3 elmts: 105.45%
  10^4 elmts: 106.74%
  10^5 elmts: 105.98%
  space gain: 100.00%
1 sequenced index
  10^3 elmts: 112.29%
  10^4 elmts: 112.20%
  10^5 elmts: 111.43%
  space gain: 100.00%
2 regular indices
  10^3 elmts:  63.17%
  10^4 elmts:  67.35%
  10^5 elmts:  71.65%
  space gain:  90.00%
1 regular index + 1 sequenced index
  10^3 elmts:  65.19%
  10^4 elmts:  69.00%
  10^5 elmts:  72.62%
  space gain:  87.50%
3 regular indices
  10^3 elmts:  49.76%
  10^4 elmts:  57.97%
  10^5 elmts:  60.94%
  space gain:  86.67%
2 regular indices + 1 sequenced index
  10^3 elmts:  49.07%
  10^4 elmts:  52.71%
  10^5 elmts:  51.55%
  space gain:  84.62%
I don't have an explanation for the difference.
Best,
Joerg

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