Update of /cvsroot/boost/boost/boost/interprocess/containers
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv17930/containers

Modified Files:
        deque.hpp flat_map.hpp flat_set.hpp list.hpp map.hpp set.hpp 
        slist.hpp string.hpp vector.hpp 
Log Message:
Changes for official inclusion in the regression tests

Index: deque.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/deque.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- deque.hpp   28 Jan 2007 09:13:21 -0000      1.5
+++ deque.hpp   4 May 2007 20:53:08 -0000       1.6
@@ -63,11 +63,13 @@
 #include <boost/detail/no_exceptions_support.hpp>
 #include <boost/interprocess/detail/move_iterator.hpp>
 #include <boost/interprocess/detail/move.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
 
 namespace boost {
 
 namespace interprocess {
 
+/// @cond
 template <class T, class Alloc>
 class deque;
 
@@ -107,7 +109,9 @@
    allocator_type get_allocator() const 
       { return *this; }
 
- protected:
+   protected:
+   enum {   trivial_dctr_after_move = 
boost::has_trivial_destructor<val_alloc_val>::value   };
+
    typedef typename boost::detail::allocator::
          rebind_to<Alloc, typename Alloc::pointer>::type   map_allocator_type;
 
@@ -293,9 +297,9 @@
    };
 
    //Vector iterator
-       class iterator : public const_iterator
-       {
-          public:
+   class iterator : public const_iterator
+   {
+      public:
       typedef std::random_access_iterator_tag   iterator_category;
       typedef val_alloc_val                     value_type;
       typedef ptr_alloc_ptr                     pointer;
@@ -325,37 +329,37 @@
       reference operator[](difference_type n) const { return *(*this + n); }
 
       //Increment / Decrement
-               iterator& operator++()  
+      iterator& operator++()  
          { this->const_iterator::operator++(); return *this;  }
 
-               iterator operator++(int)
+      iterator operator++(int)
          { iterator tmp = *this; ++*this; return tmp; }
-               
+      
       iterator& operator--()
-               {  this->const_iterator::operator--(); return *this;  }
+         {  this->const_iterator::operator--(); return *this;  }
 
-               iterator operator--(int)
-             {  iterator tmp = *this; --*this; return tmp; }
+      iterator operator--(int)
+         {  iterator tmp = *this; --*this; return tmp; }
 
       // Arithmetic
-               iterator& operator+=(difference_type off)
-                  {  this->const_iterator::operator+=(off); return *this;  }
+      iterator& operator+=(difference_type off)
+         {  this->const_iterator::operator+=(off); return *this;  }
 
-               iterator operator+(difference_type off) const
-                       {  return 
iterator(this->const_iterator::operator+(off));  }
+      iterator operator+(difference_type off) const
+         {  return iterator(this->const_iterator::operator+(off));  }
 
-               friend iterator operator+(difference_type off, const iterator& 
right)
+      friend iterator operator+(difference_type off, const iterator& right)
          {  return iterator(off+static_cast<const const_iterator &>(right)); }
 
-               iterator& operator-=(difference_type off)
-                       {  this->const_iterator::operator-=(off); return *this; 
  }
+      iterator& operator-=(difference_type off)
+         {  this->const_iterator::operator-=(off); return *this;   }
 
-               iterator operator-(difference_type off) const
-                       {  return 
iterator(this->const_iterator::operator-(off));  }
+      iterator operator-(difference_type off) const
+         {  return iterator(this->const_iterator::operator-(off));  }
 
-               difference_type operator-(const const_iterator& right) const
-                       {  return static_cast<const const_iterator&>(*this) - 
right;   }
-       };
+      difference_type operator-(const const_iterator& right) const
+         {  return static_cast<const const_iterator&>(*this) - right;   }
+   };
 
    deque_base(const allocator_type& a, std::size_t num_elements)
       : allocator_type(a), map_allocator_type(a),
@@ -444,13 +448,16 @@
   iterator        m_start;
   iterator        m_finish;
 };
+/// @endcond
 
 template <class T, class Alloc>
 class deque : protected deque_base<T, Alloc>
 {
-
+   /// @cond
   typedef deque_base<T, Alloc> Base;
- public:                         // Basic types
+   /// @endcond
+
+   public:                         // Basic types
    typedef typename Alloc::value_type           val_alloc_val;
    typedef typename Alloc::pointer              val_alloc_ptr;
    typedef typename Alloc::const_pointer        val_alloc_cptr;
@@ -482,12 +489,13 @@
    typedef reverse_iterator<const_iterator> const_reverse_iterator;
    typedef reverse_iterator<iterator> reverse_iterator;
 
- protected:                      // Internal typedefs
+   /// @cond
+   protected:                      // Internal typedefs
    typedef ptr_alloc_ptr index_pointer;
    static std::size_t s_buffer_size() 
          { return deque_buf_size(sizeof(T)); }
 
- protected:
+   protected:
    using Base::priv_initialize_map;
    using Base::priv_create_nodes;
    using Base::priv_destroy_nodes;
@@ -500,8 +508,9 @@
    using Base::m_map_size;
    using Base::m_start;
    using Base::m_finish;
+   /// @endcond
 
- public:                         // Basic accessors
+   public:                         // Basic accessors
    iterator begin() 
       { return this->m_start; }
 
@@ -560,7 +569,7 @@
       { return this->m_finish - this->m_start; }
 
    size_type max_size() const 
-      { return size_type(-1); }
+      { return allocator_type::max_size(); }
 
    bool empty() const 
       { return this->m_finish == this->m_start; }
@@ -593,8 +602,8 @@
       this->priv_initialize_dispatch(first, last, Result());
    }
 
-  ~deque() 
-      { priv_destroy_range(this->m_start, this->m_finish); }
+   ~deque() 
+   { priv_destroy_range(this->m_start, this->m_finish); }
 
    deque& operator= (const deque& x) 
    {
@@ -612,7 +621,7 @@
    }        
 
    deque& operator= (const detail::moved_object<deque> &mx) 
-   {  this->swap(mx.get());   return *this;  }
+   {  this->clear(); this->swap(mx.get());   return *this;  }
 
    void swap(deque& x)
    {
@@ -779,11 +788,15 @@
       ++next;
       difference_type index = pos - this->m_start;
       if (size_type(index) < (this->size() >> 1)) {
-         std::copy_backward(detail::make_move_iterator(this->m_start), 
detail::make_move_iterator(pos), next);
+         std::copy_backward( detail::make_move_iterator(this->m_start)
+                           , detail::make_move_iterator(pos)
+                           , next);
          pop_front();
       }
       else {
-         std::copy(detail::make_move_iterator(next), 
detail::make_move_iterator(this->m_finish), pos);
+         std::copy( detail::make_move_iterator(next)
+                  , detail::make_move_iterator(this->m_finish)
+                  , pos);
          pop_back();
       }
       return this->m_start + index;
@@ -799,16 +812,22 @@
          difference_type n = last - first;
          difference_type elems_before = first - this->m_start;
          if (elems_before < static_cast<difference_type>(this->size() - n) - 
elems_before) {
-            std::copy_backward(detail::make_move_iterator(this->m_start), 
detail::make_move_iterator(first), last);
+            std::copy_backward( detail::make_move_iterator(this->m_start)
+                              , detail::make_move_iterator(first)
+                              , last);
             iterator new_start = this->m_start + n;
-            this->priv_destroy_range(this->m_start, new_start);
+            if(!Base::trivial_dctr_after_move)
+               this->priv_destroy_range(this->m_start, new_start);
             this->priv_destroy_nodes(new_start.m_node, this->m_start.m_node);
             this->m_start = new_start;
          }
          else {
-            std::copy(last, this->m_finish, first);
+            std::copy( detail::make_move_iterator(last)
+                     , detail::make_move_iterator(this->m_finish)
+                     , first);
             iterator new_finish = this->m_finish - n;
-            this->priv_destroy_range(new_finish, this->m_finish);
+            if(!Base::trivial_dctr_after_move)
+               this->priv_destroy_range(new_finish, this->m_finish);
             this->priv_destroy_nodes(new_finish.m_node + 1, 
this->m_finish.m_node + 1);
             this->m_finish = new_finish;
          }
@@ -836,7 +855,8 @@
       this->m_finish = this->m_start;
    }
 
- private:
+   /// @cond
+   private:
 
    template <class InpIt>
    void insert(iterator pos, InpIt first, InpIt last, std::input_iterator_tag)
@@ -1368,6 +1388,7 @@
       }
       BOOST_CATCH_END
    }
+   /// @endcond
 };
 
 // Nonmember functions.
@@ -1409,8 +1430,17 @@
 inline void swap(deque<T,Alloc>& x, deque<T,Alloc>& y) 
    {  x.swap(y);  }
 
-}  //namespace interprocess {
+/// @cond
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class A>
+struct has_trivial_destructor_after_move<deque<T, A> >
+{
+   enum {   value = has_trivial_destructor<A>::value  };
+};
+/// @endcond
 
+}  //namespace interprocess {
 }  //namespace boost {
 
 #include <boost/interprocess/detail/config_end.hpp>

Index: flat_map.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/flat_map.hpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- flat_map.hpp        15 Oct 2006 13:11:06 -0000      1.2
+++ flat_map.hpp        4 May 2007 20:53:08 -0000       1.3
@@ -1,45 +1,12 @@
-/*
- *
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
[...986 lines suppressed...]
    enum {   value = true };
 };
 
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class K, class T, class C, class A>
+struct has_trivial_destructor_after_move<flat_multimap<K, T, C, A> >
+{
+   enum {   value = 
+               has_trivial_destructor<A>::value &&
+               has_trivial_destructor<C>::value  };
+};
+/// @endcond
+
 }} //namespace boost { namespace interprocess {
 
 #include <boost/interprocess/detail/config_end.hpp>
 
 #endif /* BOOST_INTERPROCESS_FLAT_MAP_HPP */
-

Index: flat_set.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/flat_set.hpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- flat_set.hpp        15 Oct 2006 13:11:06 -0000      1.2
+++ flat_set.hpp        4 May 2007 20:53:08 -0000       1.3
@@ -1,44 +1,12 @@
-/*
- *
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- *
- * Copyright (c) 1996
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- */
 //////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztañaga 2005-2006. Distributed under the Boost
+// (C) Copyright Ion Gaztañaga 2005-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 http://www.boost.org/libs/interprocess for documentation.
 //
 //////////////////////////////////////////////////////////////////////////////
-//
-// This file comes from SGI's stl_set/stl_multiset files. Modified by Ion 
Gaztañaga 2004.
-// Renaming, isolating and porting to generic algorithms. Pointer typedef 
-// set to allocator::pointer to allow placing it in shared memory.
-//
-///////////////////////////////////////////////////////////////////////////////
 
 #ifndef BOOST_INTERPROCESS_SHMEM_FLAT_SET_HPP
 #define BOOST_INTERPROCESS_SHMEM_FLAT_SET_HPP
@@ -60,6 +28,7 @@
 
 namespace boost {   namespace interprocess {
 
+/// @cond
 // Forward declarations of operators < and ==, needed for friend declaration.
 
 template <class T, class Pred, class Alloc>
@@ -72,17 +41,30 @@
 template <class T, class Pred, class Alloc>
 inline bool operator<(const flat_set<T,Pred,Alloc>& x, 
                       const flat_set<T,Pred,Alloc>& y);
+/// @endcond
 
-
+//! flat_set is a Sorted Associative Container that stores objects of type 
Key. 
+//! flat_set is a Simple Associative Container, meaning that its value type, 
+//! as well as its key type, is Key. It is also a Unique Associative 
Container, 
+//! meaning that no two elements are the same. 
+//! 
+//! flat_set is similar to std::set but it's implemented like an ordered 
vector.
+//! This means that inserting a new element into a flat_set invalidates
+//! previous iterators and references
+//!
+//! Erasing an element of a flat_set invalidates iterators and references 
+//! pointing to elements that come after (their keys are bigger) the erased 
element.
 template <class T, class Pred, class Alloc>
 class flat_set 
 {
- private:
+   /// @cond
+   private:
    typedef detail::flat_tree<T, T, 
                      detail::identity<T>, Pred, Alloc> tree_t;
    tree_t m_flat_tree;  // flat tree representing flat_set
+   /// @endcond
 
- public:
+   public:
    // typedefs:
    typedef typename tree_t::key_type               key_type;
    typedef typename tree_t::value_type             value_type;
@@ -100,11 +82,20 @@
    typedef typename tree_t::difference_type        difference_type;
    typedef typename tree_t::allocator_type         allocator_type;
 
-   // allocation/deallocation
+   //! <b>Effects</b>: Constructs an empty flat_map using the specified
+   //! comparison object and allocator.
+   //! 
+   //! <b>Complexity</b>: Constant.
    explicit flat_set(const Pred& comp = Pred(),
                      const allocator_type& a = allocator_type())
-      : m_flat_tree(comp, a) {}
+      : m_flat_tree(comp, a)
+   {}
 
+   //! <b>Effects</b>: Constructs an empty map using the specified comparison 
object and 
+   //! allocator, and inserts elements from the range [first ,last ).
+   //! 
+   //! <b>Complexity</b>: Linear in N if the range [first ,last ) is already 
sorted using 
+   //! comp and otherwise N logN, where N is last - first.
    template <class InputIterator>
    flat_set(InputIterator first, InputIterator last, 
             const Pred& comp = Pred(),
@@ -112,136 +103,361 @@
       : m_flat_tree(comp, a) 
       { m_flat_tree.insert_unique(first, last); }
 
+   //! <b>Effects</b>: Copy constructs a map.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
    flat_set(const flat_set<T,Pred,Alloc>& x) 
       : m_flat_tree(x.m_flat_tree) {}
 
+   //! <b>Effects</b>: Move constructs a map. Constructs *this using x's 
resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
    flat_set(const detail::moved_object<flat_set<T,Pred,Alloc> >& mx) 
       : m_flat_tree(move(mx.get().m_flat_tree)) {}
 
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
    flat_set<T,Pred,Alloc>& operator=(const flat_set<T, Pred, Alloc>& x)
       {  m_flat_tree = x.m_flat_tree;   return *this;  }
 
-   // accessors:
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   flat_set<T,Pred,Alloc>& operator=(const detail::moved_object<flat_set<T, 
Pred, Alloc> > &mx)
+      {  m_flat_tree = move(mx.get().m_flat_tree);   return *this;  }
 
+   //! <b>Effects</b>: Returns the comparison object out
+   //!   of which a was constructed.
+   //! 
+   //! <b>Complexity</b>: Constant.
    key_compare key_comp() const 
       { return m_flat_tree.key_comp(); }
 
+   //! <b>Effects</b>: Returns an object of value_compare constructed out
+   //!   of the comparison object.
+   //! 
+   //! <b>Complexity</b>: Constant.
    value_compare value_comp() const 
       { return m_flat_tree.key_comp(); }
 
+   //! <b>Effects</b>: Returns a copy of the Allocator that
+   //!   was passed to the object’s constructor.
+   //! 
+   //! <b>Complexity</b>: Constant.
    allocator_type get_allocator() const 
       { return m_flat_tree.get_allocator(); }
 
+   //! <b>Effects</b>: Returns an iterator to the first element contained in 
the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator begin() 
+      { return m_flat_tree.begin(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained 
in the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    const_iterator begin() const 
       { return m_flat_tree.begin(); }
 
+   //! <b>Effects</b>: Returns an iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator end() 
+      { return m_flat_tree.end(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    const_iterator end() const 
       { return m_flat_tree.end(); }
 
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning 
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rbegin() 
+      { return m_flat_tree.rbegin(); } 
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the 
beginning 
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    const_reverse_iterator rbegin() const 
       { return m_flat_tree.rbegin(); } 
 
-   const_reverse_iterator rend() const 
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rend()
       { return m_flat_tree.rend(); }
 
-   iterator begin() 
-      { return m_flat_tree.begin(); }
-
-   iterator end() 
-      { return m_flat_tree.end(); }
-
-   reverse_iterator rbegin() 
-      { return m_flat_tree.rbegin(); } 
-
-   reverse_iterator rend() 
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rend() const 
       { return m_flat_tree.rend(); }
 
+   //! <b>Effects</b>: Returns true if the container contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    bool empty() const 
       { return m_flat_tree.empty(); }
 
+   //! <b>Effects</b>: Returns the number of the elements contained in the 
container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    size_type size() const 
       { return m_flat_tree.size(); }
 
+   //! <b>Effects</b>: Returns the largest possible size of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    size_type max_size() const 
       { return m_flat_tree.max_size(); }
 
+   //! <b>Effects</b>: Swaps the contents of *this and x.
+   //!   If this->allocator_type() != x.allocator_type() allocators are also 
swapped.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Constant.
    void swap(flat_set<T,Pred,Alloc>& x) 
       { m_flat_tree.swap(x.m_flat_tree); }
 
+   //! <b>Effects</b>: Swaps the contents of *this and x.
+   //!   If this->allocator_type() != x.allocator_type() allocators are also 
swapped.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Constant.
    void swap(const detail::moved_object <flat_set<T,Pred,Alloc> >& mx) 
       { this->swap(mx.get()); }
 
-   // insert/erase
+   //! <b>Effects</b>: Inserts x if and only if there is no element in the 
container 
+   //!   with key equivalent to the key of x.
+   //!
+   //! <b>Returns</b>: The bool component of the returned pair is true if and 
only 
+   //!   if the insertion takes place, and the iterator component of the pair
+   //!   points to the element with key equivalent to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus linear insertion
+   //!   to the elements with bigger keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    std::pair<iterator,bool> insert(const value_type& x) 
       {  return m_flat_tree.insert_unique(x);  }
 
+   //! <b>Effects</b>: Inserts a new value_type move constructed from the pair 
if and
+   //! only if there is no element in the container with key equivalent to the 
key of x.
+   //!
+   //! <b>Returns</b>: The bool component of the returned pair is true if and 
only 
+   //!   if the insertion takes place, and the iterator component of the pair
+   //!   points to the element with key equivalent to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus linear insertion
+   //!   to the elements with bigger keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    std::pair<iterator,bool> insert(const detail::moved_object<value_type>& x) 
       {  return m_flat_tree.insert_unique(x);  }
 
+   //! <b>Effects</b>: Inserts a copy of x in the container if and only if 
there is 
+   //!   no element in the container with key equivalent to the key of x.
+   //!   p is a hint pointing to where the insert should start to search.
+   //!
+   //! <b>Returns</b>: An iterator pointing to the element with key equivalent
+   //!   to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time (constant if x is inserted
+   //!   right before p) plus insertion linear to the elements with bigger 
keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    iterator insert(iterator position, const value_type& x) 
       {  return m_flat_tree.insert_unique(position, x); }
 
+   //! <b>Effects</b>: Inserts an element move constructed from x in the 
container.
+   //!   p is a hint pointing to where the insert should start to search.
+   //!
+   //! <b>Returns</b>: An iterator pointing to the element with key equivalent 
to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time (constant if x is inserted
+   //!   right before p) plus insertion linear to the elements with bigger 
keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    iterator insert(iterator position, const detail::moved_object<value_type>& 
x) 
       {  return m_flat_tree.insert_unique(position, x); }
 
+   //! <b>Requires</b>: i, j are not iterators into *this.
+   //!
+   //! <b>Effects</b>: inserts each element from the range [i,j) if and only 
+   //!   if there is no element with key equivalent to the key of that element.
+   //!
+   //! <b>Complexity</b>: N log(size()+N) (N is the distance from i to j)
+   //!   search time plus N*size() insertion time.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    template <class InputIterator>
    void insert(InputIterator first, InputIterator last) 
       {  m_flat_tree.insert_unique(first, last);  }
 
+   //! <b>Effects</b>: Erases the element pointed to by position.
+   //!
+   //! <b>Returns</b>: Returns an iterator pointing to the element immediately
+   //!   following q prior to the element being erased. If no such element 
exists, 
+   //!   returns end().
+   //!
+   //! <b>Complexity</b>: Linear to the elements with keys bigger than position
+   //!
+   //! <b>Note</b>: Invalidates elements with keys
+   //!   not less than the erased element.
    iterator erase(const_iterator position) 
       {  return m_flat_tree.erase(position); }
 
+   //! <b>Effects</b>: Erases all elements in the container with key 
equivalent to x.
+   //!
+   //! <b>Returns</b>: Returns the number of erased elements.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus erasure time
+   //!   linear to the elements with bigger keys.
    size_type erase(const key_type& x) 
       {  return m_flat_tree.erase(x); }
 
+   //! <b>Effects</b>: Erases all the elements in the range [first, last).
+   //!
+   //! <b>Returns</b>: Returns last.
+   //!
+   //! <b>Complexity</b>: size()*N where N is the distance from first to last.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus erasure time
+   //!   linear to the elements with bigger keys.
    iterator erase(const_iterator first, const_iterator last) 
       {  return m_flat_tree.erase(first, last);  }
 
+   //! <b>Effects</b>: erase(a.begin(),a.end()).
+   //!
+   //! <b>Postcondition</b>: size() == 0.
+   //!
+   //! <b>Complexity</b>: linear in size().
    void clear() 
       { m_flat_tree.clear(); }
 
-   // flat_set operations:
-
-   const_iterator find(const key_type& x) const 
+   //! <b>Returns</b>: An iterator pointing to an element with the key
+   //!   equivalent to x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   iterator find(const key_type& x) 
       { return m_flat_tree.find(x); }
 
-   iterator find(const key_type& x) 
+   //! <b>Returns</b>: A const_iterator pointing to an element with the key
+   //!   equivalent to x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic.s
+   const_iterator find(const key_type& x) const 
       { return m_flat_tree.find(x); }
 
+   //! <b>Returns</b>: The number of elements with key equivalent to x.
+   //!
+   //! <b>Complexity</b>: log(size())+count(k)
    size_type count(const key_type& x) const 
       {  return m_flat_tree.find(x) == m_flat_tree.end() ? 0 : 1;  }
 
-   const_iterator lower_bound(const key_type& x) const 
+   //! <b>Returns</b>: An iterator pointing to the first element with key not 
less
+   //!   than k, or a.end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   iterator lower_bound(const key_type& x) 
       {  return m_flat_tree.lower_bound(x); }
 
-   iterator lower_bound(const key_type& x) 
+   //! <b>Returns</b>: A const iterator pointing to the first element with key 
not
+   //!   less than k, or a.end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   const_iterator lower_bound(const key_type& x) const 
       {  return m_flat_tree.lower_bound(x); }
 
-   const_iterator upper_bound(const key_type& x) const 
+   //! <b>Returns</b>: An iterator pointing to the first element with key not 
less
+   //!   than x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   iterator upper_bound(const key_type& x)
       {  return m_flat_tree.upper_bound(x);    }
 
-   iterator upper_bound(const key_type& x)
+   //! <b>Returns</b>: A const iterator pointing to the first element with key 
not
+   //!   less than x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   const_iterator upper_bound(const key_type& x) const 
       {  return m_flat_tree.upper_bound(x);    }
 
+   //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), 
this->upper_bound(k)).
+   //!
+   //! <b>Complexity</b>: Logarithmic
    std::pair<const_iterator, const_iterator> 
       equal_range(const key_type& x) const 
       {  return m_flat_tree.equal_range(x); }
 
+   //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), 
this->upper_bound(k)).
+   //!
+   //! <b>Complexity</b>: Logarithmic
    std::pair<iterator,iterator> 
       equal_range(const key_type& x) 
       {  return m_flat_tree.equal_range(x); }
 
+   //! <b>Effects</b>: Number of elements for which memory has been allocated.
+   //!   capacity() is always greater than or equal to size().
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    size_type capacity() const           
       { return m_flat_tree.capacity(); }
 
+   //! <b>Effects</b>: If n is less than or equal to capacity(), this call has 
no
+   //!   effect. Otherwise, it is a request for allocation of additional 
memory.
+   //!   If the request is successful, then capacity() is greater than or 
equal to
+   //!   n; otherwise, capacity() is unchanged. In either case, size() is 
unchanged.
+   //! 
+   //! <b>Throws</b>: If memory allocation allocation throws or T's copy 
constructor throws.
+   //!
+   //! <b>Note</b>: If capacity() is less than "count", iterators and 
references to
+   //!   to values might be invalidated.
    void reserve(size_type count)       
       { m_flat_tree.reserve(count);   }
 
+   /// @cond
    template <class K1, class C1, class A1>
    friend bool operator== (const flat_set<K1,C1,A1>&, const 
flat_set<K1,C1,A1>&);
 
    template <class K1, class C1, class A1>
    friend bool operator< (const flat_set<K1,C1,A1>&, const 
flat_set<K1,C1,A1>&);
+   /// @endcond
 };
 
 template <class T, class Pred, class Alloc>
@@ -289,6 +505,7 @@
                  const detail::moved_object<flat_set<T,Pred,Alloc> >& y) 
    {  x.swap(y.get());  }
 
+/// @cond
 /*!This class is movable*/
 template <class T, class P, class A>
 struct is_movable<flat_set<T, P, A> >
@@ -296,6 +513,16 @@
    enum {   value = true };
 };
 
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class C, class A>
+struct has_trivial_destructor_after_move<flat_set<T, C, A> >
+{
+   enum {   value = 
+               has_trivial_destructor<A>::value &&
+               has_trivial_destructor<C>::value  };
+};
+
 // Forward declaration of operators < and ==, needed for friend declaration.
 
 template <class T, class Pred, class Alloc>
@@ -308,16 +535,19 @@
 template <class T, class Pred, class Alloc>
 inline bool operator<(const flat_multiset<T,Pred,Alloc>& x, 
                       const flat_multiset<T,Pred,Alloc>& y);
+/// @endcond
 
 template <class T, class Pred, class Alloc>
 class flat_multiset 
 {
- private:
+   /// @cond
+   private:
    typedef detail::flat_tree<T, T, 
                      detail::identity<T>, Pred, Alloc> tree_t;
    tree_t m_flat_tree;  // flat tree representing flat_multiset
+   /// @endcond
 
- public:
+   public:
    // typedefs:
    typedef typename tree_t::key_type               key_type;
    typedef typename tree_t::value_type             value_type;
@@ -356,130 +586,330 @@
    flat_multiset<T,Pred,Alloc>& operator=(const flat_multiset<T,Pred,Alloc>& 
x) 
       {  m_flat_tree = x.m_flat_tree;   return *this;  }
 
-   flat_multiset<T,Pred,Alloc>& operator=(const 
detail::moved_object<flat_multiset<T,Pred,Alloc> >& x) 
-      {  m_flat_tree.swap(x.get().m_flat_tree);   return *this;  }
-
-   // accessors:
+   flat_multiset<T,Pred,Alloc>& operator=(const 
detail::moved_object<flat_multiset<T,Pred,Alloc> >& mx) 
+      {  m_flat_tree = move(mx.get().m_flat_tree);   return *this;  }
 
+   //! <b>Effects</b>: Returns the comparison object out
+   //!   of which a was constructed.
+   //! 
+   //! <b>Complexity</b>: Constant.
    key_compare key_comp() const 
       { return m_flat_tree.key_comp(); }
 
+   //! <b>Effects</b>: Returns an object of value_compare constructed out
+   //!   of the comparison object.
+   //! 
+   //! <b>Complexity</b>: Constant.
    value_compare value_comp() const 
       { return m_flat_tree.key_comp(); }
 
+   //! <b>Effects</b>: Returns a copy of the Allocator that
+   //!   was passed to the object’s constructor.
+   //! 
+   //! <b>Complexity</b>: Constant.
    allocator_type get_allocator() const 
       { return m_flat_tree.get_allocator(); }
 
+   //! <b>Effects</b>: Returns an iterator to the first element contained in 
the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator begin() 
+      { return m_flat_tree.begin(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained 
in the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    const_iterator begin() const 
       { return m_flat_tree.begin(); }
 
+   //! <b>Effects</b>: Returns an iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator end() 
+      { return m_flat_tree.end(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    const_iterator end() const 
       { return m_flat_tree.end(); }
 
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning 
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rbegin() 
+      { return m_flat_tree.rbegin(); } 
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the 
beginning 
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    const_reverse_iterator rbegin() const 
       { return m_flat_tree.rbegin(); } 
 
-   const_reverse_iterator rend() const 
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rend()
       { return m_flat_tree.rend(); }
 
-   iterator begin() 
-      { return m_flat_tree.begin(); }
-
-   iterator end() 
-      { return m_flat_tree.end(); }
-
-   reverse_iterator rbegin() 
-      { return m_flat_tree.rbegin(); } 
-
-   reverse_iterator rend() 
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rend() const 
       { return m_flat_tree.rend(); }
 
+   //! <b>Effects</b>: Returns true if the container contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    bool empty() const 
       { return m_flat_tree.empty(); }
 
+   //! <b>Effects</b>: Returns the number of the elements contained in the 
container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    size_type size() const 
       { return m_flat_tree.size(); }
 
+   //! <b>Effects</b>: Returns the largest possible size of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    size_type max_size() const 
       { return m_flat_tree.max_size(); }
 
+   //! <b>Effects</b>: Swaps the contents of *this and x.
+   //!   If this->allocator_type() != x.allocator_type() allocators are also 
swapped.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Constant.
    void swap(flat_multiset<T,Pred,Alloc>& x) 
       { m_flat_tree.swap(x.m_flat_tree); }
 
+   //! <b>Effects</b>: Swaps the contents of *this and x.
+   //!   If this->allocator_type() != x.allocator_type() allocators are also 
swapped.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Constant.
    void swap(const detail::moved_object<flat_multiset<T,Pred,Alloc> >& mx) 
       { this->swap(mx.get()); }
 
-   // insert/erase
+   //! <b>Effects</b>: Inserts x and returns the iterator pointing to the
+   //!   newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus linear insertion
+   //!   to the elements with bigger keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    iterator insert(const value_type& x) 
       {  return m_flat_tree.insert_equal(x);   }
 
+   //! <b>Effects</b>: Inserts a new value_type move constructed from x
+   //!   and returns the iterator pointing to the newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus linear insertion
+   //!   to the elements with bigger keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    iterator insert(const detail::moved_object<value_type>& x) 
       {  return m_flat_tree.insert_equal(x);   }
 
+   //! <b>Effects</b>: Inserts a copy of x in the container.
+   //!   p is a hint pointing to where the insert should start to search.
+   //!
+   //! <b>Returns</b>: An iterator pointing to the element with key equivalent
+   //!   to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time (constant if x is inserted
+   //!   right before p) plus insertion linear to the elements with bigger 
keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    iterator insert(iterator position, const value_type& x) 
       {  return m_flat_tree.insert_equal(position, x);  }
 
+   //! <b>Effects</b>: Inserts a new value move constructed  from x in the 
container.
+   //!   p is a hint pointing to where the insert should start to search.
+   //!
+   //! <b>Returns</b>: An iterator pointing to the element with key equivalent
+   //!   to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time (constant if x is inserted
+   //!   right before p) plus insertion linear to the elements with bigger 
keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    iterator insert(iterator position, const detail::moved_object<value_type>& 
x) 
       {  return m_flat_tree.insert_equal(position, x);  }
 
+   //! <b>Requires</b>: i, j are not iterators into *this.
+   //!
+   //! <b>Effects</b>: inserts each element from the range [i,j) .
+   //!
+   //! <b>Complexity</b>: N log(size()+N) (N is the distance from i to j)
+   //!   search time plus N*size() insertion time.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
    template <class InputIterator>
    void insert(InputIterator first, InputIterator last) 
       {  m_flat_tree.insert_equal(first, last);  }
 
+   //! <b>Effects</b>: Erases the element pointed to by position.
+   //!
+   //! <b>Returns</b>: Returns an iterator pointing to the element immediately
+   //!   following q prior to the element being erased. If no such element 
exists, 
+   //!   returns end().
+   //!
+   //! <b>Complexity</b>: Linear to the elements with keys bigger than position
+   //!
+   //! <b>Note</b>: Invalidates elements with keys
+   //!   not less than the erased element.
    iterator erase(const_iterator position) 
       {  return m_flat_tree.erase(position); }
 
+   //! <b>Effects</b>: Erases all elements in the container with key 
equivalent to x.
+   //!
+   //! <b>Returns</b>: Returns the number of erased elements.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus erasure time
+   //!   linear to the elements with bigger keys.
    size_type erase(const key_type& x) 
       {  return m_flat_tree.erase(x); }
 
-   iterator erase(const_iterator first, const_iterator last)
-      {  return m_flat_tree.erase(first, last); }
+   //! <b>Effects</b>: Erases all the elements in the range [first, last).
+   //!
+   //! <b>Returns</b>: Returns last.
+   //!
+   //! <b>Complexity</b>: size()*N where N is the distance from first to last.
+   //!
+   //! <b>Complexity</b>: Logarithmic search time plus erasure time
+   //!   linear to the elements with bigger keys.
+   iterator erase(const_iterator first, const_iterator last) 
+      {  return m_flat_tree.erase(first, last);  }
 
+   //! <b>Effects</b>: erase(a.begin(),a.end()).
+   //!
+   //! <b>Postcondition</b>: size() == 0.
+   //!
+   //! <b>Complexity</b>: linear in size().
    void clear() 
       { m_flat_tree.clear(); }
 
-   // flat_multiset operations:
-   const_iterator find(const key_type& x) const 
+   //! <b>Returns</b>: An iterator pointing to an element with the key
+   //!   equivalent to x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   iterator find(const key_type& x) 
       { return m_flat_tree.find(x); }
 
-   iterator find(const key_type& x) 
+   //! <b>Returns</b>: A const_iterator pointing to an element with the key
+   //!   equivalent to x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic.s
+   const_iterator find(const key_type& x) const 
       { return m_flat_tree.find(x); }
 
+   //! <b>Returns</b>: The number of elements with key equivalent to x.
+   //!
+   //! <b>Complexity</b>: log(size())+count(k)
    size_type count(const key_type& x) const 
-      {  return m_flat_tree.count(x);  }
+      { return m_flat_tree.count(x); }
 
-   const_iterator lower_bound(const key_type& x) const 
+   //! <b>Returns</b>: An iterator pointing to the first element with key not 
less
+   //!   than k, or a.end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   iterator lower_bound(const key_type& x) 
       {  return m_flat_tree.lower_bound(x); }
 
-   iterator lower_bound(const key_type& x) 
+   //! <b>Returns</b>: A const iterator pointing to the first element with key 
not
+   //!   less than k, or a.end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   const_iterator lower_bound(const key_type& x) const 
       {  return m_flat_tree.lower_bound(x); }
 
-   const_iterator upper_bound(const key_type& x) const 
+   //! <b>Returns</b>: An iterator pointing to the first element with key not 
less
+   //!   than x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   iterator upper_bound(const key_type& x)
       {  return m_flat_tree.upper_bound(x);    }
 
-   iterator upper_bound(const key_type& x)
+   //! <b>Returns</b>: A const iterator pointing to the first element with key 
not
+   //!   less than x, or end() if such an element is not found.
+   //!
+   //! <b>Complexity</b>: Logarithmic
+   const_iterator upper_bound(const key_type& x) const 
       {  return m_flat_tree.upper_bound(x);    }
 
+   //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), 
this->upper_bound(k)).
+   //!
+   //! <b>Complexity</b>: Logarithmic
    std::pair<const_iterator, const_iterator> 
       equal_range(const key_type& x) const 
       {  return m_flat_tree.equal_range(x); }
 
+   //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), 
this->upper_bound(k)).
+   //!
+   //! <b>Complexity</b>: Logarithmic
    std::pair<iterator,iterator> 
       equal_range(const key_type& x) 
       {  return m_flat_tree.equal_range(x); }
 
+   //! <b>Effects</b>: Number of elements for which memory has been allocated.
+   //!   capacity() is always greater than or equal to size().
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
    size_type capacity() const           
       { return m_flat_tree.capacity(); }
 
+   //! <b>Effects</b>: If n is less than or equal to capacity(), this call has 
no
+   //!   effect. Otherwise, it is a request for allocation of additional 
memory.
+   //!   If the request is successful, then capacity() is greater than or 
equal to
+   //!   n; otherwise, capacity() is unchanged. In either case, size() is 
unchanged.
+   //! 
+   //! <b>Throws</b>: If memory allocation allocation throws or T's copy 
constructor throws.
+   //!
+   //! <b>Note</b>: If capacity() is less than "count", iterators and 
references to
+   //!   to values might be invalidated.
    void reserve(size_type count)       
       { m_flat_tree.reserve(count);   }
 
+   /// @cond
    template <class K1, class C1, class A1>
    friend bool operator== (const flat_multiset<K1,C1,A1>&,
                            const flat_multiset<K1,C1,A1>&);
    template <class K1, class C1, class A1>
    friend bool operator< (const flat_multiset<K1,C1,A1>&,
                           const flat_multiset<K1,C1,A1>&);
+   /// @endcond
 };
 
 template <class T, class Pred, class Alloc>
@@ -527,6 +957,7 @@
                  const detail::moved_object<flat_multiset<T,Pred,Alloc> >& y) 
    {  x.swap(y.get());  }
 
+/// @cond
 /*!This class is movable*/
 template <class T, class P, class A>
 struct is_movable<flat_multiset<T, P, A> >
@@ -534,12 +965,19 @@
    enum {   value = true };
 };
 
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class C, class A>
+struct has_trivial_destructor_after_move<flat_multiset<T, C, A> >
+{
+   enum {   value = 
+               has_trivial_destructor<A>::value &&
+               has_trivial_destructor<C>::value  };
+};
+/// @endcond
+
 }} //namespace boost {   namespace interprocess {
 
 #include <boost/interprocess/detail/config_end.hpp>
 
 #endif /* BOOST_INTERPROCESS_SHMEM_FLAT_SET_HPP */
-
-// Local Variables:
-// mode:C++
-// End:

Index: list.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/list.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- list.hpp    2 Dec 2006 00:00:50 -0000       1.4
+++ list.hpp    4 May 2007 20:53:08 -0000       1.5
@@ -1,3 +1,18 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztañaga 2005-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 http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_list.h file. Modified by Ion Gaztañaga 2004
[...1762 lines suppressed...]
-template <class T, class A>
-struct is_movable<detail::interprocess_list_alloc<T, A> >
+template <class A>
+struct is_movable<detail::list_alloc<A> >
 {
    enum {   value = true };
 };
 
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class A>
+struct has_trivial_destructor_after_move<list<T, A> >
+{
+   enum {   value = has_trivial_destructor<A>::value  };
+};
+/// @endcond
+
 }  //namespace interprocess {
 }  //namespace boost {
 

Index: map.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/map.hpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- map.hpp     15 Oct 2006 13:11:06 -0000      1.2
+++ map.hpp     4 May 2007 20:53:08 -0000       1.3
@@ -1,3 +1,18 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gazta�ga 2005-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 http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_map/stl_multimap files. Modified by Ion 
Gazta�ga 2004.
[...1185 lines suppressed...]
 template <class T, class P, class A>
 struct is_movable<multimap<T, P, A> >
 {
    enum {   value = true };
 };
 
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class K, class T, class C, class A>
+struct has_trivial_destructor_after_move<multimap<K, T, C, A> >
+{
+   enum {   value = 
+               has_trivial_destructor<A>::value &&
+               has_trivial_destructor<C>::value  };
+};
+/// @endcond
+
 }} //namespace boost { namespace interprocess {
 
 #include <boost/interprocess/detail/config_end.hpp>

Index: set.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/set.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- set.hpp     17 Oct 2006 05:09:40 -0000      1.3
+++ set.hpp     4 May 2007 20:53:08 -0000       1.4
@@ -1,3 +1,18 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztañaga 2005-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 http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_set/stl_multiset files. Modified by Ion 
Gaztañaga 2004.
[...961 lines suppressed...]
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class C, class A>
+struct has_trivial_destructor_after_move<multiset<T, C, A> >
+{
+   enum {   value = 
+               has_trivial_destructor<A>::value &&
+               has_trivial_destructor<C>::value  };
+};
+/// @endcond
 
 }} //namespace boost {   namespace interprocess {
 
@@ -535,6 +956,3 @@
 
 #endif /* BOOST_INTERPROCESS_SET_HPP */
 
-// Local Variables:
-// mode:C++
-// End:

Index: slist.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/slist.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- slist.hpp   2 Dec 2006 00:00:50 -0000       1.3
+++ slist.hpp   4 May 2007 20:53:08 -0000       1.4
@@ -1,3 +1,18 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztañaga 2004-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 http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_slist.h file. Modified by Ion Gaztañaga 
2004-2007
[...2138 lines suppressed...]
                    typename Container::iterator i, 
                    bool is_previous = false) 
-      : container(&x), iter(is_previous ? i : x.previous(i)) { }
+      : container(&x), iter(is_previous ? i : x.previous(i)){ }
 
    insert_iterator<Container>& 
       operator=(const typename Container::value_type& value) 
@@ -1270,9 +1428,9 @@
       iter = container->insert_after(iter, value);
       return *this;
    }
-   insert_iterator<Container>& operator*() { return *this; }
-   insert_iterator<Container>& operator++() { return *this; }
-   insert_iterator<Container>& operator++(int) { return *this; }
+   insert_iterator<Container>& operator*(){ return *this; }
+   insert_iterator<Container>& operator++(){ return *this; }
+   insert_iterator<Container>& operator++(int){ return *this; }
 };
 
 }  //namespace std;

Index: string.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/string.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- string.hpp  15 Oct 2006 13:14:54 -0000      1.3
+++ string.hpp  4 May 2007 20:53:08 -0000       1.4
@@ -1,18 +1,6 @@
-/*
- * Copyright (c) 1997-1999
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
[...1850 lines suppressed...]
 /*!This class is movable*/
 template <class A>
-struct is_movable<basic_string_base<A> >
+struct is_movable<detail::basic_string_base<A> >
 {
    enum {   value = true };
 };
 
-typedef basic_string<char, std::char_traits<char>, std::allocator<char> > 
string;
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class C, class T, class A>
+struct has_trivial_destructor_after_move<basic_string<C, T, A> >
+{
+   enum {   value = has_trivial_destructor<A>::value  };
+};
+/// @endcond
 
 }} //namespace boost {  namespace interprocess
 

Index: vector.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/interprocess/containers/vector.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- vector.hpp  15 Oct 2006 13:11:06 -0000      1.4
+++ vector.hpp  4 May 2007 20:53:08 -0000       1.5
@@ -1,32 +1,6 @@
-/*
- *
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
[...1097 lines suppressed...]
+/// @cond
 /*!This class is movable*/
 template <class T, class A>
 struct is_movable<vector<T, A> >
@@ -1377,6 +1684,15 @@
    enum {   value = true };
 };
 
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class A>
+struct has_trivial_destructor_after_move<vector<T, A> >
+{
+   enum {   value = has_trivial_destructor<A>::value  };
+};
+/// @endcond
+
 }  //namespace interprocess {
 }  //namespace boost {
 


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs

Reply via email to