Update of /cvsroot/boost/boost/libs/intrusive/test
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv27901/test
Modified Files:
list_test.cpp multiset_test.cpp set_test.cpp slist_test.cpp
test_container.hpp unordered_multiset_test.cpp
unordered_set_test.cpp
Added Files:
test_intrusive_associative_container.hpp
test_intrusive_sequence_container.hpp
test_intrusive_unordered_container.hpp
Log Message:
New Intrusive version
--- NEW FILE: test_intrusive_associative_container.hpp ---
--- NEW FILE: test_intrusive_sequence_container.hpp ---
--- NEW FILE: test_intrusive_unordered_container.hpp ---
Index: list_test.cpp
===================================================================
RCS file: /cvsroot/boost/boost/libs/intrusive/test/list_test.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- list_test.cpp 23 Jun 2007 13:06:49 -0000 1.3
+++ list_test.cpp 22 Jul 2007 14:19:14 -0000 1.4
@@ -20,6 +20,7 @@
#include <vector>
#include <boost/detail/lightweight_test.hpp>
#include "test_macros.hpp"
+#include "test_container.hpp"
using namespace boost::intrusive;
@@ -39,6 +40,20 @@
template<class ValueTraits>
void test_list<ValueTraits>::test_all(std::vector<typename
ValueTraits::value_type>& values)
{
+ typedef boost::intrusive::list
+ < ValueTraits
+ , ValueTraits::value_type::constant_time_size
+ , std::size_t
+ > list_type;
+
+ {
+ list_type list(values.begin(), values.end());
+ test::test_container(list);
+ list.clear();
+ list.insert(list.end(), values.begin(), values.end());
+ test::test_sequence_container(list, values);
+ }
+
test_front_back(values);
test_sort(values);
test_insert(values);
@@ -46,11 +61,6 @@
test_swap(values);
test_clone(values);
- typedef boost::intrusive::list
- < ValueTraits
- , ValueTraits::value_type::constant_time_size
- , std::size_t
- > list_type;
list_type testlist(values.begin(), values.end());
list_type testlist2;
}
Index: multiset_test.cpp
===================================================================
RCS file: /cvsroot/boost/boost/libs/intrusive/test/multiset_test.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- multiset_test.cpp 23 Jun 2007 13:06:50 -0000 1.3
+++ multiset_test.cpp 22 Jul 2007 14:19:15 -0000 1.4
@@ -19,6 +19,7 @@
#include <vector>
#include <boost/detail/lightweight_test.hpp>
#include "test_macros.hpp"
+#include "test_container.hpp"
using namespace boost::intrusive;
@@ -38,6 +39,24 @@
template<class ValueTraits>
void test_multiset<ValueTraits>::test_all (std::vector<typename
ValueTraits::value_type>& values)
{
+ typedef multiset
+ <ValueTraits
+ ,std::less<typename ValueTraits::value_type>
+ ,ValueTraits::value_type::constant_time_size, std::size_t
+ > multiset_type;
+ {
+ multiset_type testset(values.begin(), values.end());
+ test::test_container(testset);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_common_unordered_and_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_non_unique_container(testset, values);
+ }
test_sort(values);
test_insert(values);
test_swap(values);
Index: set_test.cpp
===================================================================
RCS file: /cvsroot/boost/boost/libs/intrusive/test/set_test.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- set_test.cpp 23 Jun 2007 13:06:50 -0000 1.3
+++ set_test.cpp 22 Jul 2007 14:19:15 -0000 1.4
@@ -19,6 +19,7 @@
#include <vector>
#include <boost/detail/lightweight_test.hpp>
#include "test_macros.hpp"
+#include "test_container.hpp"
using namespace boost::intrusive;
@@ -38,6 +39,24 @@
template<class ValueTraits>
void test_set<ValueTraits>::test_all(std::vector<typename
ValueTraits::value_type>& values)
{
+ typedef boost::intrusive::set
+ <ValueTraits
+ ,std::less<typename ValueTraits::value_type>
+ ,ValueTraits::value_type::constant_time_size, std::size_t
+ > set_type;
+ {
+ set_type testset(values.begin(), values.end());
+ test::test_container(testset);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_common_unordered_and_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_unique_container(testset, values);
+ }
test_sort(values);
test_insert(values);
test_swap(values);
Index: slist_test.cpp
===================================================================
RCS file: /cvsroot/boost/boost/libs/intrusive/test/slist_test.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- slist_test.cpp 23 Jun 2007 13:06:50 -0000 1.3
+++ slist_test.cpp 22 Jul 2007 14:19:15 -0000 1.4
@@ -19,6 +19,7 @@
#include <vector>
#include <boost/detail/lightweight_test.hpp>
#include "test_macros.hpp"
+#include "test_container.hpp"
using namespace boost::intrusive;
@@ -41,6 +42,17 @@
void test_slist<ValueTraits>
::test_all (std::vector<typename ValueTraits::value_type>& values)
{
+ typedef boost::intrusive::slist
+ <ValueTraits
+ ,ValueTraits::value_type::constant_time_size, std::size_t
+ > list_type;
+ {
+ list_type list(values.begin(), values.end());
+ test::test_container(list);
+ list.clear();
+ list.insert(list.end(), values.begin(), values.end());
+ test::test_sequence_container(list, values);
+ }
test_front_back (values);
test_sort(values);
test_merge (values);
Index: test_container.hpp
===================================================================
RCS file: /cvsroot/boost/boost/libs/intrusive/test/test_container.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- test_container.hpp 23 Jun 2007 13:06:50 -0000 1.3
+++ test_container.hpp 22 Jul 2007 14:19:15 -0000 1.4
@@ -1,119 +1,24 @@
-//////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
//
-// Copyright (c) 2006 Matias Capeletto
-// Copyright (c) 2007 Ion Gaztanaga
+// (C) Copyright Ion Gaztanaga 2007
//
// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
//
-//////////////////////////////////////////////////////////////////////////////
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
-#ifndef BOOST_INTRUSIVE_TEST_TEST_CONTAINER_HPP
-#define BOOST_INTRUSIVE_TEST_TEST_CONTAINER_HPP
+#ifndef BOOST_INTRUSIVE_TEST_CONTAINER_HPP
+#define BOOST_INTRUSIVE_TEST_CONTAINER_HPP
-// std
-#include <cassert>
-#include <algorithm>
-#include <vector>
-// Boost.Test
-//#include "boost/test/included/test_exec_monitor.hpp"
+#include <boost/detail/lightweight_test.hpp>
-namespace boost{
-namespace intrusive{
+namespace boost {
+namespace intrusive {
namespace test {
-const int NumElem = 5;
-
-/*
-Beginning of range a.begin() iterator if a is mutable, const_iterator
otherwise [4] [7]
-End of range a.end() iterator if a is mutable, const_iterator otherwise
[4]
-Size a.size() size_type
-Maximum size a.max_size() size_type
-Empty container a.empty() Convertible to bool
-Swap a.swap(b) void
-
-Expression semantics
-Semantics of an expression is defined only where it differs from, or is not
defined in, Assignable, Equality Comparable, or LessThan Comparable Name
Expression Precondition Semantics Postcondition
-Move constructor X(a) X().size() == a.size(). X() contains a copy of
each of a's elements.
-Move constructor X b(a); b.size() == a.size(). b contains a copy of
each of a's elements.
-Move Assignment operator b = a b.size() == a.size(). b contains a copy
of each of a's elements.
-Destructor a.~X() Each of a's elements is disposed, and memory allocated
for them (if any) is deallocated.
-Beginning of range a.begin() Returns an iterator pointing to the first
element in the container. [7] a.begin() is either dereferenceable or
past-the-end. It is past-the-end if and only if a.size() == 0.
-End of range a.end() Returns an iterator pointing one past the last
element in the container. a.end() is past-the-end.
-Size a.size() Returns the size of the container, that is, its number of
elements. [8] a.size() >= 0 && a.size() <= max_size()
-Maximum size a.max_size() Returns the largest size that this container
can ever have. [8] a.max_size() >= 0 && a.max_size() >= a.size()
-Empty container a.empty() Equivalent to a.size() == 0. (But possibly
faster.)
-Swap a.swap(b) Equivalent to swap(a,b) [9]
-*/
-
-/*
-expression return type operational assertion/note
complexity
- semantics pre/post-condition
-
-
-X::value_type T T is
- CopyConstructible
-compile time
-X::reference lvalue of T compile time
-X::const_-
-reference
-const lvalue of T compile time
-X::iterator iterator type
-whose value
-type is T
-any iterator category
-except output iterator.
-convertible to
-X::const_iterator.
-compile time
-X::const_-
-iterator
-constant iterator
-type whose
-value type is T
-any iterator category
-except output iterator
-compile time
-X::difference_
-type
-signed integral
-type
-is identical to the
-difference type of
-X::iterator and
-X::const_iterator
-compile time
-X::size_type unsigned
-integral type
-size_type can
-represent any
-non-negative value of
-compile time
-
-
-
-
-
-
-X u; post: u.size() == 0 constant
-X(); X().size() == 0 constant
-X(a); a == X(a). linear
-X u(a); post: u == a linear
-X u = a; Equivalent to: X u; u
-= a;
-(&a)->X(); void note: the destructor is
-applied to every
-element of a; all the
-memory is deallocated.
-linear
-a.begin(); iterator;
-const_-
-iterator for
-constant a
-constant
-*/
-
template< class Container >
void test_container( Container & c )
{
@@ -126,102 +31,231 @@
typedef typename Container::const_pointer const_pointer;
typedef typename Container::difference_type difference_type;
typedef typename Container::size_type size_type;
+ typedef typename Container::difference_type difference_type;
+ typedef typename Container::size_type size_type;
+ typedef typename Container::value_traits value_traits;
const size_type num_elem = c.size();
- BOOST_CHECK( c.empty() == (num_elem == 0) );
+ BOOST_TEST( c.empty() == (num_elem == 0) );
{
iterator it(c.begin()), itend(c.end());
size_type i;
for(i = 0; i < num_elem; ++i){
++it;
}
- BOOST_CHECK( it == c.end() );
- BOOST_CHECK( c.size() == i );
+ BOOST_TEST( it == c.end() );
+ BOOST_TEST( c.size() == i );
}
+
//Check iterator conversion
- BOOST_CHECK( const_iterator(c.begin()) == c.cbegin() );
+ BOOST_TEST( const_iterator(c.begin()) == c.cbegin() );
{
const_iterator it(c.cbegin()), itend(c.cend());
size_type i;
for(i = 0; i < num_elem; ++i){
++it;
}
- BOOST_CHECK( it == c.cend() );
- BOOST_CHECK( c.size() == i );
+ BOOST_TEST( it == c.cend() );
+ BOOST_TEST( c.size() == i );
}
}
-/*
-template< class Container >
-void test_container
- ( Container & c, typename Container::size_type num_elem
- , Container & c2, typename Container::size_type num_elem2)
+
+
+template< class Container, class Data >
+void test_sequence_container(Container & c, Data & d)
{
- typedef typename Container::value_type value_type;
- typedef typename Container::iterator iterator;
- typedef typename Container::const_iterator const_iterator;
- typedef typename Container::reference reference;
- typedef typename Container::const_reference const_reference;
- typedef typename Container::pointer pointer;
- typedef typename Container::const_pointer const_pointer;
- typedef typename Container::difference_type difference_type;
- typedef typename Container::size_type size_type;
+ assert( d.size() > 2 );
- //For the future:
- //
- //move-copy constructor
- //move-assignment
+ c.clear();
- test_container_helper(c, num_elem);
- test_container_helper(c2, num_elem2);
+ BOOST_TEST( c.size() == 0 );
+ BOOST_TEST( c.empty() );
- //Test swap and test again
- c.swap(c2);
- test_container_helper(c, num_elem2);
- test_container_helper(c2, num_elem);
-}*/
+ c.insert( c.begin(), *d.begin() );
+ c.insert( c.end(), *(++d.begin()) );
-template< class Sequence >
-void test_sequence( Sequence & seq )
+ BOOST_TEST( c.size() == 2 );
+ BOOST_TEST( !c.empty() );
+
+ c.erase( c.begin() );
+
+ BOOST_TEST( c.size() == 1 );
+
+ c.insert( c.begin(), *(++++d.begin()) );
+
+ c.erase( c.begin(), c.end() );
+
+ BOOST_TEST( c.empty() );
+
+ c.insert( c.begin(), *d.begin() );
+
+ BOOST_TEST( c.size() == 1 );
+
+ BOOST_TEST( c.begin() != c.end() );
+
+ c.erase( c.begin() );
+
+ c.assign(d.begin(), d.end());
+
+ BOOST_TEST( c.size() == d.size() );
+
+ c.clear();
+
+ BOOST_TEST( c.size() == 0 );
+ BOOST_TEST( c.empty() );
+}
+
+template< class Container, class Data >
+void test_common_unordered_and_associative_container(Container & c, Data & d)
{
- //First the container requirements
- test_container(seq);
- typedef Sequence::value_type value_type;
- typedef Sequence::iterator iterator;
+ typedef typename Container::size_type size_type;
- Sequence::size_type old_size(seq.size());
+ assert( d.size() > 2 );
- //Now test sequence requirements
- //insert(p, t)
- Sequence::value_type one(1);
- iterator one_pos = seq.insert(seq.begin(), one);
- BOOST_CHECK( &*seq.begin() == &one );
- BOOST_CHECK( seq.size() == (old_size + 1) );
+ c.clear();
+ c.insert(d.begin(), d.end());
- //insert(p, i, j)
- value_type range[2] = { value_type(2), value_type(3) };
- iterator range_it = one_pos; ++range_it;
- seq.insert(range_it, &range[0], &range[2]);
- BOOST_CHECK( seq.size() == (old_size + 3) );
- range_it = ++seq.begin();
- BOOST_CHECK( &*range_it == &range[0] );
- ++range_it;
- BOOST_CHECK( &*range_it == &range[1] );
+ for( typename Data::const_iterator di = d.begin(), de = d.end();
+ di != de; ++di )
+ {
+ BOOST_TEST( c.find(*di) != c.end() );
+ }
- //erase(q)
- iterator it_from_erase = seq.erase(seq.begin());
- BOOST_CHECK( seq.size() == (old_size + 2) );
- BOOST_CHECK( &*it_from_erase == &range[0] );
+ typename Data::const_iterator da = d.begin();
+ typename Data::const_iterator db = ++d.begin();
- //erase(q1, q2)
- iterator q1(it_from_erase), q2(it_from_erase);
- ++++q2;
- it_from_erase = seq.erase(q1, q2);
- BOOST_CHECK( seq.size() == old_size );
- //clear(), assign()???
+ size_type old_size = c.size();
+
+ c.erase(*da);
+
+ BOOST_TEST( c.size() == old_size-1 );
+
+ BOOST_TEST( c.count(*da) == 0 );
+ BOOST_TEST( c.count(*db) != 0 );
+
+ BOOST_TEST( c.find(*da) == c.end() );
+ BOOST_TEST( c.find(*db) != c.end() );
+
+ BOOST_TEST( c.equal_range(*db).first != c.end() );
+
+ c.clear();
+
+ BOOST_TEST( c.equal_range(*da).first == c.end() );
}
-} // namespace test{
-} // namespace intrusive{
-} // namespace boost{
+template< class Container, class Data >
+void test_associative_container_invariants(Container & c, Data & d)
+{
+ typedef typename Container::const_iterator const_iterator;
+ for( typename Data::const_iterator di = d.begin(), de = d.end();
+ di != de; ++di)
+ {
+ const_iterator ci = c.find(*di);
+ BOOST_TEST( ci != c.end() );
+ BOOST_TEST( ! c.value_comp()(*ci, *di) );
+ const_iterator cil = c.lower_bound(*di);
+ const_iterator ciu = c.upper_bound(*di);
+ std::pair<const_iterator, const_iterator> er = c.equal_range(*di);
+ BOOST_TEST( cil == er.first );
+ BOOST_TEST( ciu == er.second );
+ if(ciu != c.end()){
+ BOOST_TEST( c.value_comp()(*cil, *ciu) );
+ }
+ if(c.count(*di) > 1){
+ const_iterator ci_next = cil; ++ci_next;
+ for( ; ci_next != ciu; ++cil, ++ci_next){
+ BOOST_TEST( !c.value_comp()(*ci_next, *cil) );
+ }
+ }
+ }
+}
-#endif // BOOST_INTRUSIVE_TEST_TEST_CONTAINER_HPP
+template< class Container, class Data >
+void test_associative_container(Container & c, Data & d)
+{
+ typedef typename Container::const_iterator const_iterator;
+ assert( d.size() > 2 );
+
+ c.clear();
+ c.insert(d.begin(),d.end());
+
+ test_associative_container_invariants(c, d);
+
+ const Container & cr = c;
+
+ test_associative_container_invariants(cr, d);
+}
+
+template< class Container, class Data >
+void test_unordered_associative_container_invariants(Container & c, Data & d)
+{
+ typedef typename Container::size_type size_type;
+ typedef typename Container::const_iterator const_iterator;
+
+ for( typename Data::const_iterator di = d.begin(), de = d.end() ;
+ di != de ; ++di ){
+ const_iterator i = c.find(*di);
+ size_type nb = c.bucket(*i);
+ size_type bucket_elem = std::distance(c.begin(nb), c.end(nb));
+ BOOST_TEST( bucket_elem == c.bucket_size(nb) );
+ BOOST_TEST( &*c.local_iterator_to(*c.find(*di)) == &*i );
+ std::pair<const_iterator, const_iterator> er = c.equal_range(*di);
+ size_type cnt = std::distance(er.first, er.second);
+ BOOST_TEST( cnt == c.count(*di));
+ if(cnt > 1)
+ for(const_iterator n = er.first, i = n++, e = er.second; n != e; ++i,
++n){
+ BOOST_TEST( c.key_eq()(*i, *n) );
+ BOOST_TEST( c.hash_function()(*i) == c.hash_function()(*n) );
+ }
+ }
+
+ size_type blen = c.bucket_count();
+ size_type total_objects = 0;
+ for(size_type i = 0; i < blen; ++i){
+ total_objects += c.bucket_size(i);
+ }
+ BOOST_TEST( total_objects == c.size() );
+}
+
+template< class Container, class Data >
+void test_unordered_associative_container(Container & c, Data & d)
+{
+ c.clear();
+ c.insert( d.begin(), d.end() );
+
+ test_unordered_associative_container_invariants(c, d);
+
+ const Container & cr = c;
+
+ test_unordered_associative_container_invariants(cr, d);
+}
+
+template< class Container, class Data >
+void test_unique_container(Container & c, Data & d)
+{
+ typedef typename Container::value_type value_type;
+ c.clear();
+ c.insert(d.begin(),d.end());
+ typename Container::size_type old_size = c.size();
+ value_type v(*d.begin());
+ c.insert(v);
+ BOOST_TEST( c.size() == old_size );
+ c.clear();
+}
+
+template< class Container, class Data >
+void test_non_unique_container(Container & c, Data & d)
+{
+ typedef typename Container::value_type value_type;
+ c.clear();
+ c.insert(d.begin(),d.end());
+ typename Container::size_type old_size = c.size();
+ value_type v(*d.begin());
+ c.insert(v);
+ BOOST_TEST( c.size() == (old_size+1) );
+ c.clear();
+}
+
+}}}
+
+#endif //#ifndef BOOST_INTRUSIVE_TEST_CONTAINER_HPP
Index: unordered_multiset_test.cpp
===================================================================
RCS file: /cvsroot/boost/boost/libs/intrusive/test/unordered_multiset_test.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- unordered_multiset_test.cpp 23 Jun 2007 13:06:50 -0000 1.3
+++ unordered_multiset_test.cpp 22 Jul 2007 14:19:17 -0000 1.4
@@ -21,6 +21,7 @@
#include <set>
#include <boost/detail/lightweight_test.hpp>
#include "test_macros.hpp"
+#include "test_container.hpp"
using namespace boost::intrusive;
@@ -43,6 +44,27 @@
template<class ValueTraits>
void test_unordered_multiset<ValueTraits>::test_all (std::vector<typename
ValueTraits::value_type>& values)
{
+ typedef boost::intrusive::unordered_multiset
+ <ValueTraits
+ ,boost::hash<typename ValueTraits::value_type>
+ ,std::equal_to<typename ValueTraits::value_type>
+ ,ValueTraits::value_type::constant_time_size, std::size_t
+ > unordered_multiset_type;
+ {
+ typename unordered_multiset_type::bucket_type buckets [BucketSize];
+ unordered_multiset_type testset(buckets, BucketSize);
+ testset.insert(values.begin(), values.end());
+ test::test_container(testset);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_common_unordered_and_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_unordered_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_non_unique_container(testset, values);
+ }
test_sort(values);
test_insert(values);
test_swap(values);
Index: unordered_set_test.cpp
===================================================================
RCS file: /cvsroot/boost/boost/libs/intrusive/test/unordered_set_test.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- unordered_set_test.cpp 23 Jun 2007 13:06:50 -0000 1.3
+++ unordered_set_test.cpp 22 Jul 2007 14:19:17 -0000 1.4
@@ -20,6 +20,7 @@
#include <set>
#include <boost/detail/lightweight_test.hpp>
#include "test_macros.hpp"
+#include "test_container.hpp"
using namespace boost::intrusive;
@@ -42,6 +43,27 @@
template<class ValueTraits>
void test_unordered_set<ValueTraits>::test_all(std::vector<typename
ValueTraits::value_type>& values)
{
+ typedef boost::intrusive::unordered_set
+ <ValueTraits
+ ,boost::hash<typename ValueTraits::value_type>
+ ,std::equal_to<typename ValueTraits::value_type>
+ ,ValueTraits::value_type::constant_time_size, std::size_t
+ > unordered_set_type;
+ {
+ typename unordered_set_type::bucket_type buckets [BucketSize];
+ unordered_set_type testset(buckets, BucketSize);
+ testset.insert(values.begin(), values.end());
+ test::test_container(testset);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_common_unordered_and_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_unordered_associative_container(testset, values);
+ testset.clear();
+ testset.insert(values.begin(), values.end());
+ test::test_unique_container(testset, values);
+ }
test_sort(values);
test_insert(values);
test_swap(values);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs