|
Boost Users : |
From: Christian Rössel (christian.roessel_at_[hidden])
Date: 2008-05-19 06:57:54
Hi,
I have two slists and transfer items between them via splice() methods.
Without cache_last everything works as expected. With cache_last the third
call to splice does not transfer the list element. Am I using something
wrong or is this a bug in intrusive?
Thanks,
Christian
#include <boost/intrusive/slist.hpp>
#include <boost/intrusive/slist_hook.hpp>
#include <cassert>
using namespace boost::intrusive;
class MyClass : public slist_base_hook<>
{
int int_;
public:
MyClass(int i) : int_(i) {}
};
typedef slist<MyClass, cache_last<true> > MyList;
int main ()
{
MyList freeList;
for (int j = 0; j < 5; ++j) {
freeList.push_front (*(new MyClass (j)));
}
MyList listInUse;
// transfer first element of freeList to listInUse
size_t free = freeList.size ();
size_t inUse = listInUse.size ();
listInUse.splice (listInUse.begin (), freeList, freeList.begin ());
assert (freeList.size () == free - 1);
assert (listInUse.size () == inUse + 1);
// transfer all elements of listInuse to freeList
free = freeList.size ();
inUse = listInUse.size ();
freeList.splice (freeList.begin (), listInUse);
assert (listInUse.empty ());
assert (freeList.size () == free + inUse);
// again, transfer first element of freeList to listInUse
free = freeList.size ();
inUse = listInUse.size ();
listInUse.splice (listInUse.begin (), freeList, freeList.begin ());
assert (freeList.size () == free - 1); // fails, sizes are 5 and 0
assert (listInUse.size () == inUse + 1);
// release memory omitted
return 0;
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net