Dear Icl users,
due to a subtle effect of the changed hint semantics for
associative containers, the icl library is broken in
versions <= 1.55.0 when used with new STL-libraries that
implement the new c++11 standard.
This bug is fixed in the upcoming Boost 1.56.0. (see regression tests at
Since the release of boost 1.56.0 seems to take longer than
planned due to restructuring efforts for modular-boost, users of
Boost.Icl affected by the problem may choose to pull the fixed
Boost.Icl directly from the git repository and replace
your_boost_1_55_0/boost/icl
with the new code. The libs/icl part does not need an update.
Another possibility is to apply the patch-file
diff_icl_1_55_0_and_master.patch that is attached to this post
to your local boost library 1.55.0:
1. cd to your_boost_1_55_0 root directory.
your_boost_1_55_0>
2. From the command line type
your_boost_1_55_0> patch -p2 < diff_icl_1_55_0_and_master.patch
You may check the patched library by moving to
your_boost_1_55_0/libs/icl/test
and run
your_boost_1_55_0/libs/icl/test> bjam
Sorry for the inconvenience.
Best regards,
Joachim
P.S.:
For those interested in details of the issue here is a report:
The semantics of insertion with hint in associative containers
changed in c++11 form
insert-after-hint (c++98/03) to
insert-before-hint (c++11)
see e.g. proposal N1780:
so for an associative container c of type C, a value x and
an iterator hint
c.insert(hint, x); //tries to insert x right after hint in c++98
c.insert(hint, x); //tries to insert x before hint in c++11
In accordance with this behavior, if using the insert function
std::pair<bool, iterator> C::insert(value_type const& x);
(success, hint) = c.insert(x);
the iterator hint of unsuccessful insertion is the matching hint,
pointing to
[c++98] the last element y in c that is not greater x, so x can
be inserted *after* that hint.
[c++11] the first element z in c that is greater than x,
so x can be inserted *before* that hint.
In Boost.Icl I used the returned hint-iterator of the insert
function, that always returned the last overlapping interval y
for an inserted interval x given the interval’s exclusive-less
ordering under c++98.
With the changed hint semantics, this returned hint-iterator
did not point to the last interval y overlapping x anymore
but to the first interval z not overlapping x.
Therefore the code was broken and returned false results.