text: /////////////////////////////////////////////////////////////////////////////
  //
  // (C) Copyright Ion Gaztanaga  2007-2010
  //
  // 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 http://www.boost.org/libs/intrusive for documentation.
  //
  /////////////////////////////////////////////////////////////////////////////
  #include <boost/intrusive/list.hpp>
  #include <boost/intrusive/slist.hpp>
  #include <boost/intrusive/set.hpp>
  #include <boost/intrusive/unordered_set.hpp>
  #include <boost/intrusive/avl_set.hpp>
  #include <boost/intrusive/sg_set.hpp>
  #include <boost/intrusive/splay_set.hpp>
  #include <boost/intrusive/treap_set.hpp>
  #include <cassert>
  
  using namespace boost::intrusive;
  
  typedef list_base_hook<>            ListBaseHook;
  typedef slist_base_hook<>           SListBaseHook;
  typedef set_base_hook<>             SetBaseHook;
  typedef unordered_set_base_hook<>   USetBaseHook;
  
  class Foo;
  typedef unordered_set<Foo, base_hook<USetBaseHook> > USet;
  
  class Foo : public ListBaseHook, public SListBaseHook, public SetBaseHook, public USetBaseHook
  {
     USet::bucket_type buckets[1];
     Foo(const Foo &);
     Foo & operator=(const Foo &);
  
     public:
     Foo() : uset_children(USet::bucket_traits(buckets, 1))
     {}
     list <Foo, base_hook<ListBaseHook> >  list_children;
     slist<Foo, base_hook<SListBaseHook> > slist_children;
     set  <Foo, base_hook<SetBaseHook> >   set_children;
     USet  uset_children;
  };
  
  void instantiate()
  {
     list< Foo, base_hook<ListBaseHook> >   list_;   list_.clear();
     slist< Foo, base_hook<SListBaseHook> > slist_;  slist_.clear();
     set< Foo, base_hook<SetBaseHook> > set_;  set_.clear();
    
     USet::bucket_type buckets[1];
     USet unordered_set_(USet::bucket_traits(buckets, 1));  unordered_set_.clear();
  }
  int main()
  {
     instantiate();
  
     //A small test with list
     {
        Foo f, f2;
        list< Foo, base_hook<ListBaseHook> > l;
        l.insert(l.begin(), f);
        l.begin()->list_children.insert(l.begin()->list_children.begin(), f2);
        assert(l.size() == l.begin()->list_children.size());
        l.begin()->list_children.clear();
        l.clear();
     }
     return 0;
  }
  