$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r52356 - in sandbox/move: . boost boost/container boost/container/detail boost/move libs libs/move libs/move/doc libs/move/doc/html libs/move/doc/html/images libs/move/example libs/move/proj libs/move/proj/vc7ide libs/move/test
From: igaztanaga_at_[hidden]
Date: 2009-04-12 15:35:05
Author: igaztanaga
Date: 2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
New Revision: 52356
URL: http://svn.boost.org/trac/boost/changeset/52356
Log:
Move emulation + move-aware containers
Added:
   sandbox/move/
   sandbox/move/boost/
   sandbox/move/boost/container/
   sandbox/move/boost/container/containers_fwd.hpp   (contents, props changed)
   sandbox/move/boost/container/deque.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/
   sandbox/move/boost/container/detail/advanced_insert_int.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/algorithms.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/allocation_type.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/config_begin.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/config_end.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/destroyers.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/flat_tree.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/iterators.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/mpl.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/multiallocation_chain.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/node_alloc_holder.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/pair.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/preprocessor.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/transform_iterator.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/tree.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/type_traits.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/utilities.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/value_init.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/variadic_templates_tools.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/version_type.hpp   (contents, props changed)
   sandbox/move/boost/container/detail/workaround.hpp   (contents, props changed)
   sandbox/move/boost/container/flat_map.hpp   (contents, props changed)
   sandbox/move/boost/container/flat_set.hpp   (contents, props changed)
   sandbox/move/boost/container/list.hpp   (contents, props changed)
   sandbox/move/boost/container/map.hpp   (contents, props changed)
   sandbox/move/boost/container/set.hpp   (contents, props changed)
   sandbox/move/boost/container/slist.hpp   (contents, props changed)
   sandbox/move/boost/container/stable_vector.hpp   (contents, props changed)
   sandbox/move/boost/container/string.hpp   (contents, props changed)
   sandbox/move/boost/container/vector.hpp   (contents, props changed)
   sandbox/move/boost/move/
   sandbox/move/boost/move/move.hpp   (contents, props changed)
   sandbox/move/libs/
   sandbox/move/libs/move/
   sandbox/move/libs/move/doc/
   sandbox/move/libs/move/doc/Jamfile.v2   (contents, props changed)
   sandbox/move/libs/move/doc/html/
   sandbox/move/libs/move/doc/html/boostbook.css   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/
   sandbox/move/libs/move/doc/html/images/blank.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/caution.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/draft.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/home.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/important.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/next.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/note.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/prev.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/tip.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/toc-blank.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/toc-minus.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/toc-plus.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/up.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/images/warning.png   (contents, props changed)
   sandbox/move/libs/move/doc/html/reference.css   (contents, props changed)
   sandbox/move/libs/move/doc/move.qbk   (contents, props changed)
   sandbox/move/libs/move/example/
   sandbox/move/libs/move/example/Jamfile.v2   (contents, props changed)
   sandbox/move/libs/move/example/doc_clone_ptr.cpp   (contents, props changed)
   sandbox/move/libs/move/example/doc_construct_forward.cpp   (contents, props changed)
   sandbox/move/libs/move/example/doc_file_descriptor.cpp   (contents, props changed)
   sandbox/move/libs/move/example/doc_move_algorithms.cpp   (contents, props changed)
   sandbox/move/libs/move/example/doc_move_inserter.cpp   (contents, props changed)
   sandbox/move/libs/move/example/doc_move_iterator.cpp   (contents, props changed)
   sandbox/move/libs/move/example/movable.hpp   (contents, props changed)
   sandbox/move/libs/move/proj/
   sandbox/move/libs/move/proj/vc7ide/
   sandbox/move/libs/move/proj/vc7ide/Move.sln   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/back_move_inserter_test.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/construct_forward_test.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/doc_clone_ptr.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/doc_construct_forward.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/doc_file_descriptor.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/doc_move_algorithms.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/doc_move_inserter.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/doc_move_iterator.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/move_algorithm.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/move_iterator_test.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/move_test.vcproj   (contents, props changed)
   sandbox/move/libs/move/proj/vc7ide/todo.txt   (contents, props changed)
   sandbox/move/libs/move/test/
   sandbox/move/libs/move/test/Jamfile.v2   (contents, props changed)
   sandbox/move/libs/move/test/back_move_inserter.cpp   (contents, props changed)
   sandbox/move/libs/move/test/construct_forward.cpp   (contents, props changed)
   sandbox/move/libs/move/test/move.cpp   (contents, props changed)
   sandbox/move/libs/move/test/move_algorithm.cpp   (contents, props changed)
   sandbox/move/libs/move/test/move_iterator.cpp   (contents, props changed)
Added: sandbox/move/boost/container/containers_fwd.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/containers_fwd.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,153 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_CONTAINERS_FWD_HPP
+#define BOOST_CONTAINERS_CONTAINERS_FWD_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//                        Standard predeclarations
+//////////////////////////////////////////////////////////////////////////////
+
+/// @cond
+
+namespace boost{ 
+namespace intrusive{ 
+   //Create namespace to avoid compilation errors
+}}
+
+namespace boost{ namespace container{ namespace containers_detail{
+
+namespace bi = boost::intrusive;
+
+}}}
+
+namespace std {
+
+template <class T>
+class allocator;
+
+template <class T>
+struct less;
+
+template <class T1, class T2>
+struct pair;
+
+template <class CharType> 
+struct char_traits;
+
+}  //namespace std {
+
+/// @endcond
+
+//////////////////////////////////////////////////////////////////////////////
+//                             Containers
+//////////////////////////////////////////////////////////////////////////////
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+//vector class
+template <class T
+         ,class A = std::allocator<T> >
+class vector;
+
+//vector class
+template <class T
+,class A = std::allocator<T> >
+class deque;
+
+//list class
+template <class T
+         ,class A = std::allocator<T> >
+class list;
+
+//slist class
+template <class T
+         ,class Alloc = std::allocator<T> >
+class slist;
+
+//set class
+template <class T
+         ,class Pred  = std::less<T>
+         ,class Alloc = std::allocator<T> >
+class set;
+
+//multiset class
+template <class T
+         ,class Pred  = std::less<T>
+         ,class Alloc = std::allocator<T> >
+class multiset;
+
+//map class
+template <class Key
+         ,class T
+         ,class Pred  = std::less<Key>
+         ,class Alloc = std::allocator<std::pair<const Key, T> > >
+class map;
+
+//multimap class
+template <class Key
+         ,class T
+         ,class Pred  = std::less<Key>
+         ,class Alloc = std::allocator<std::pair<const Key, T> > >
+class multimap;
+
+//flat_set class
+template <class T
+         ,class Pred  = std::less<T>
+         ,class Alloc = std::allocator<T> >
+class flat_set;
+
+//flat_multiset class
+template <class T
+         ,class Pred  = std::less<T>
+         ,class Alloc = std::allocator<T> >
+class flat_multiset;
+
+//flat_map class
+template <class Key
+         ,class T
+         ,class Pred  = std::less<Key>
+         ,class Alloc = std::allocator<std::pair<Key, T> > >
+class flat_map;
+
+//flat_multimap class
+template <class Key
+         ,class T
+         ,class Pred  = std::less<Key>
+         ,class Alloc = std::allocator<std::pair<Key, T> > >
+class flat_multimap;
+
+//basic_string class
+template <class CharT
+         ,class Traits = std::char_traits<CharT>
+         ,class Alloc  = std::allocator<CharT> > 
+class basic_string;
+
+//string class
+typedef basic_string
+   <char
+   ,std::char_traits<char>
+   ,std::allocator<char> >
+string;
+
+}}  //namespace boost { namespace container {
+
+#endif //#ifndef BOOST_CONTAINERS_CONTAINERS_FWD_HPP
+
Added: sandbox/move/boost/container/deque.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/deque.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1481 @@
+/*
+ *
+ * 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 Gaztanaga 2005-2006. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_deque.h and stl_uninitialized.h files. 
+// Modified by Ion Gaztanaga 2005.
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DEQUE_HPP
+#define BOOST_CONTAINERS_DEQUE_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/iterators.hpp>
+#include <boost/container/detail/algorithms.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/containers_fwd.hpp>
+#include <cstddef>
+#include <iterator>
+#include <cassert>
+#include <memory>
+#include <algorithm>
+#include <stdexcept>
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/has_trivial_assign.hpp>
+#include <boost/type_traits/has_nothrow_copy.hpp>
+#include <boost/type_traits/has_nothrow_assign.hpp>
+#include <boost/move/move.hpp>
+#include <boost/container/detail/advanced_insert_int.hpp>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+template <class T, class Alloc>
+class deque;
+
+template <class T, class A>
+struct deque_value_traits
+{
+   typedef T value_type;
+   typedef A allocator_type;
+   static const bool trivial_dctr = boost::has_trivial_destructor<value_type>::value;
+   static const bool trivial_dctr_after_move = 
+      boost::has_trivial_destructor_after_move<value_type>::value || trivial_dctr;
+   static const bool trivial_copy = has_trivial_copy<value_type>::value;
+   static const bool nothrow_copy = has_nothrow_copy<value_type>::value;
+   static const bool trivial_assign = has_trivial_assign<value_type>::value;
+   static const bool nothrow_assign = has_nothrow_assign<value_type>::value;
+
+};
+
+// Note: this function is simply a kludge to work around several compilers'
+//  bugs in handling constant expressions.
+inline std::size_t deque_buf_size(std::size_t size) 
+   {  return size < 512 ? std::size_t(512 / size) : std::size_t(1);  }
+
+// Deque base class.  It has two purposes.  First, its constructor
+//  and destructor allocate (but don't initialize) storage.  This makes
+//  exception safety easier.
+template <class T, class Alloc>
+class deque_base
+{
+   public:
+   typedef typename Alloc::value_type              val_alloc_val;
+   typedef typename Alloc::pointer                 val_alloc_ptr;
+   typedef typename Alloc::const_pointer           val_alloc_cptr;
+   typedef typename Alloc::reference               val_alloc_ref;
+   typedef typename Alloc::const_reference         val_alloc_cref;
+   typedef typename Alloc::value_type              val_alloc_diff;
+   typedef typename Alloc::template rebind
+      <typename Alloc::pointer>::other             ptr_alloc_t;
+   typedef typename ptr_alloc_t::value_type        ptr_alloc_val;
+   typedef typename ptr_alloc_t::pointer           ptr_alloc_ptr;
+   typedef typename ptr_alloc_t::const_pointer     ptr_alloc_cptr;
+   typedef typename ptr_alloc_t::reference         ptr_alloc_ref;
+   typedef typename ptr_alloc_t::const_reference   ptr_alloc_cref;
+   typedef typename Alloc::template
+      rebind<T>::other                             allocator_type;
+   typedef allocator_type                          stored_allocator_type;
+
+   protected:
+
+   typedef deque_value_traits<T, Alloc>            traits_t;
+   typedef typename Alloc::template
+      rebind<typename Alloc::pointer>::other map_allocator_type;
+
+   static std::size_t s_buffer_size() { return deque_buf_size(sizeof(T)); }
+
+   val_alloc_ptr priv_allocate_node() 
+      {  return this->alloc().allocate(s_buffer_size());  }
+
+   void priv_deallocate_node(val_alloc_ptr p) 
+      {  this->alloc().deallocate(p, s_buffer_size());  }
+
+   ptr_alloc_ptr priv_allocate_map(std::size_t n) 
+      { return this->ptr_alloc().allocate(n); }
+
+   void priv_deallocate_map(ptr_alloc_ptr p, std::size_t n) 
+      { this->ptr_alloc().deallocate(p, n); }
+
+ public:
+   // Class invariants:
+   //  For any nonsingular iterator i:
+   //    i.node is the address of an element in the map array.  The
+   //      contents of i.node is a pointer to the beginning of a node.
+   //    i.first == //(i.node) 
+   //    i.last  == i.first + node_size
+   //    i.cur is a pointer in the range [i.first, i.last).  NOTE:
+   //      the implication of this is that i.cur is always a dereferenceable
+   //      pointer, even if i is a past-the-end iterator.
+   //  Start and Finish are always nonsingular iterators.  NOTE: this means
+   //    that an empty deque must have one node, and that a deque
+   //    with N elements, where N is the buffer size, must have two nodes.
+   //  For every node other than start.node and finish.node, every element
+   //    in the node is an initialized object.  If start.node == finish.node,
+   //    then [start.cur, finish.cur) are initialized objects, and
+   //    the elements outside that range are uninitialized storage.  Otherwise,
+   //    [start.cur, start.last) and [finish.first, finish.cur) are initialized
+   //    objects, and [start.first, start.cur) and [finish.cur, finish.last)
+   //    are uninitialized storage.
+   //  [map, map + map_size) is a valid, non-empty range.  
+   //  [start.node, finish.node] is a valid range contained within 
+   //    [map, map + map_size).  
+   //  A pointer in the range [map, map + map_size) points to an allocated node
+   //    if and only if the pointer is in the range [start.node, finish.node].
+   class const_iterator 
+      : public std::iterator<std::random_access_iterator_tag, 
+                              val_alloc_val,  val_alloc_diff, 
+                              val_alloc_cptr, val_alloc_cref>
+   {
+      public:
+      static std::size_t s_buffer_size() { return deque_base<T, Alloc>::s_buffer_size(); }
+
+      typedef std::random_access_iterator_tag   iterator_category;
+      typedef val_alloc_val                     value_type;
+      typedef val_alloc_cptr                    pointer;
+      typedef val_alloc_cref                    reference;
+      typedef std::size_t                       size_type;
+      typedef std::ptrdiff_t                    difference_type;
+
+      typedef ptr_alloc_ptr                     index_pointer;
+      typedef const_iterator                    self_t;
+
+      friend class deque<T, Alloc>;
+      friend class deque_base<T, Alloc>;
+
+      protected: 
+      val_alloc_ptr  m_cur;
+      val_alloc_ptr  m_first;
+      val_alloc_ptr  m_last;
+      index_pointer  m_node;
+
+      public: 
+      const_iterator(val_alloc_ptr x, index_pointer y) 
+         : m_cur(x), m_first(*y),
+           m_last(*y + s_buffer_size()), m_node(y) {}
+
+      const_iterator() : m_cur(0), m_first(0), m_last(0), m_node(0) {}
+
+      const_iterator(const const_iterator& x)
+         : m_cur(x.m_cur),   m_first(x.m_first), 
+           m_last(x.m_last), m_node(x.m_node) {}
+
+      reference operator*() const 
+         { return *this->m_cur; }
+
+      pointer operator->() const 
+         { return this->m_cur; }
+
+      difference_type operator-(const self_t& x) const 
+      {
+         if(!this->m_cur && !x.m_cur){
+            return 0;
+         }
+         return difference_type(this->s_buffer_size()) * (this->m_node - x.m_node - 1) +
+            (this->m_cur - this->m_first) + (x.m_last - x.m_cur);
+      }
+
+      self_t& operator++() 
+      {
+         ++this->m_cur;
+         if (this->m_cur == this->m_last) {
+            this->priv_set_node(this->m_node + 1);
+            this->m_cur = this->m_first;
+         }
+         return *this; 
+      }
+
+      self_t operator++(int)  
+      {
+         self_t tmp = *this;
+         ++*this;
+         return tmp;
+      }
+
+      self_t& operator--() 
+      {
+         if (this->m_cur == this->m_first) {
+            this->priv_set_node(this->m_node - 1);
+            this->m_cur = this->m_last;
+         }
+         --this->m_cur;
+         return *this;
+      }
+
+      self_t operator--(int) 
+      {
+         self_t tmp = *this;
+         --*this;
+         return tmp;
+      }
+
+      self_t& operator+=(difference_type n)
+      {
+         difference_type offset = n + (this->m_cur - this->m_first);
+         if (offset >= 0 && offset < difference_type(this->s_buffer_size()))
+            this->m_cur += n;
+         else {
+            difference_type node_offset =
+            offset > 0 ? offset / difference_type(this->s_buffer_size())
+                        : -difference_type((-offset - 1) / this->s_buffer_size()) - 1;
+            this->priv_set_node(this->m_node + node_offset);
+            this->m_cur = this->m_first + 
+            (offset - node_offset * difference_type(this->s_buffer_size()));
+         }
+         return *this;
+      }
+
+      self_t operator+(difference_type n) const
+         {  self_t tmp = *this; return tmp += n;  }
+
+      self_t& operator-=(difference_type n) 
+         { return *this += -n; }
+       
+      self_t operator-(difference_type n) const 
+         {  self_t tmp = *this; return tmp -= n;  }
+
+      reference operator[](difference_type n) const 
+         { return *(*this + n); }
+
+      bool operator==(const self_t& x) const 
+         { return this->m_cur == x.m_cur; }
+
+      bool operator!=(const self_t& x) const 
+         { return !(*this == x); }
+
+      bool operator<(const self_t& x) const 
+      {
+         return (this->m_node == x.m_node) ? 
+            (this->m_cur < x.m_cur) : (this->m_node < x.m_node);
+      }
+
+      bool operator>(const self_t& x) const  
+         { return x < *this; }
+
+      bool operator<=(const self_t& x) const 
+         { return !(x < *this); }
+
+      bool operator>=(const self_t& x) const 
+         { return !(*this < x); }
+
+      void priv_set_node(index_pointer new_node) 
+      {
+         this->m_node = new_node;
+         this->m_first = *new_node;
+         this->m_last = this->m_first + difference_type(this->s_buffer_size());
+      }
+
+      friend const_iterator operator+(std::ptrdiff_t n, const const_iterator& x)
+         {  return x + n;  }
+   };
+
+   //Deque iterator
+   class iterator : public const_iterator
+   {
+      public:
+      typedef std::random_access_iterator_tag   iterator_category;
+      typedef val_alloc_val                     value_type;
+      typedef val_alloc_ptr                     pointer;
+      typedef val_alloc_ref                     reference;
+      typedef std::size_t                       size_type;
+      typedef std::ptrdiff_t                    difference_type;
+      typedef ptr_alloc_ptr                     index_pointer;
+      typedef const_iterator                    self_t;
+
+      friend class deque<T, Alloc>;
+      friend class deque_base<T, Alloc>;
+
+      private:
+      explicit iterator(const const_iterator& x) : const_iterator(x){}
+
+      public:
+      //Constructors
+      iterator(val_alloc_ptr x, index_pointer y) : const_iterator(x, y){}
+      iterator() : const_iterator(){}
+      //iterator(const const_iterator &cit) : const_iterator(cit){}
+      iterator(const iterator& x) : const_iterator(x){}
+
+      //Pointer like operators
+      reference operator*() const { return *this->m_cur; }
+      pointer operator->() const { return this->m_cur; }
+
+      reference operator[](difference_type n) const { return *(*this + n); }
+
+      //Increment / Decrement
+      iterator& operator++()  
+         { this->const_iterator::operator++(); return *this;  }
+
+      iterator operator++(int)
+         { iterator tmp = *this; ++*this; return tmp; }
+      
+      iterator& operator--()
+         {  this->const_iterator::operator--(); return *this;  }
+
+      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) const
+         {  return iterator(this->const_iterator::operator+(off));  }
+
+      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) const
+         {  return iterator(this->const_iterator::operator-(off));  }
+
+      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)
+      :  members_(a)
+   { this->priv_initialize_map(num_elements); }
+
+   deque_base(const allocator_type& a) 
+      :  members_(a)
+   {}
+
+   ~deque_base()
+   {
+      if (this->members_.m_map) {
+         this->priv_destroy_nodes(this->members_.m_start.m_node, this->members_.m_finish.m_node + 1);
+         this->priv_deallocate_map(this->members_.m_map, this->members_.m_map_size);
+      }
+   }
+
+   private:
+   deque_base(const deque_base&);
+  
+   protected:
+
+   void priv_initialize_map(std::size_t num_elements)
+   {
+//      if(num_elements){
+         std::size_t num_nodes = num_elements / s_buffer_size() + 1;
+
+         this->members_.m_map_size = containers_detail::max_value((std::size_t) InitialMapSize, num_nodes + 2);
+         this->members_.m_map = this->priv_allocate_map(this->members_.m_map_size);
+
+         ptr_alloc_ptr nstart = this->members_.m_map + (this->members_.m_map_size - num_nodes) / 2;
+         ptr_alloc_ptr nfinish = nstart + num_nodes;
+             
+         BOOST_TRY {
+            this->priv_create_nodes(nstart, nfinish);
+         }
+         BOOST_CATCH(...){
+            this->priv_deallocate_map(this->members_.m_map, this->members_.m_map_size);
+            this->members_.m_map = 0;
+            this->members_.m_map_size = 0;
+            BOOST_RETHROW
+         }
+         BOOST_CATCH_END
+
+         this->members_.m_start.priv_set_node(nstart);
+         this->members_.m_finish.priv_set_node(nfinish - 1);
+         this->members_.m_start.m_cur = this->members_.m_start.m_first;
+         this->members_.m_finish.m_cur = this->members_.m_finish.m_first +
+                        num_elements % s_buffer_size();
+//      }
+   }
+
+   void priv_create_nodes(ptr_alloc_ptr nstart, ptr_alloc_ptr nfinish)
+   {
+      ptr_alloc_ptr cur;
+      BOOST_TRY {
+         for (cur = nstart; cur < nfinish; ++cur)
+            *cur = this->priv_allocate_node();
+      }
+      BOOST_CATCH(...){
+         this->priv_destroy_nodes(nstart, cur);
+         BOOST_RETHROW
+      }
+      BOOST_CATCH_END
+   }
+
+   void priv_destroy_nodes(ptr_alloc_ptr nstart, ptr_alloc_ptr nfinish)
+   {
+      for (ptr_alloc_ptr n = nstart; n < nfinish; ++n)
+         this->priv_deallocate_node(*n);
+   }
+
+   enum { InitialMapSize = 8 };
+
+   protected:
+   struct members_holder
+      :  public ptr_alloc_t
+      ,  public allocator_type
+   {
+      members_holder(const allocator_type &a)
+         :  map_allocator_type(a), allocator_type(a)
+         ,  m_map(0), m_map_size(0)
+         ,  m_start(), m_finish(m_start)
+      {}
+
+      ptr_alloc_ptr   m_map;
+      std::size_t     m_map_size;
+      iterator        m_start;
+      iterator        m_finish;
+   } members_;
+
+   ptr_alloc_t &ptr_alloc() 
+   {  return members_;  }
+   
+   const ptr_alloc_t &ptr_alloc() const 
+   {  return members_;  }
+
+   allocator_type &alloc() 
+   {  return members_;  }
+   
+   const allocator_type &alloc() const 
+   {  return members_;  }
+};
+/// @endcond
+
+//! Deque class
+//!
+template <class T, class Alloc>
+class deque : protected deque_base<T, Alloc>
+{
+   /// @cond
+  typedef deque_base<T, Alloc> Base;
+
+   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;
+   typedef typename Alloc::reference            val_alloc_ref;
+   typedef typename Alloc::const_reference      val_alloc_cref;
+   typedef typename Alloc::template
+      rebind<val_alloc_ptr>::other                ptr_alloc_t;
+   typedef typename ptr_alloc_t::value_type       ptr_alloc_val;
+   typedef typename ptr_alloc_t::pointer          ptr_alloc_ptr;
+   typedef typename ptr_alloc_t::const_pointer    ptr_alloc_cptr;
+   typedef typename ptr_alloc_t::reference        ptr_alloc_ref;
+   typedef typename ptr_alloc_t::const_reference  ptr_alloc_cref;
+   /// @endcond
+
+   typedef T                                    value_type;
+   typedef val_alloc_ptr                        pointer;
+   typedef val_alloc_cptr                       const_pointer;
+   typedef val_alloc_ref                        reference;
+   typedef val_alloc_cref                       const_reference;
+   typedef std::size_t                          size_type;
+   typedef std::ptrdiff_t                       difference_type;
+
+   typedef typename Base::allocator_type        allocator_type;
+
+   public:                                // Iterators
+   typedef typename Base::iterator              iterator;
+   typedef typename Base::const_iterator        const_iterator;
+
+   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+   typedef std::reverse_iterator<iterator>      reverse_iterator;
+
+   /// @cond
+   private:                      // Internal typedefs
+   typedef ptr_alloc_ptr index_pointer;
+   static std::size_t s_buffer_size() 
+      { return Base::s_buffer_size(); }
+   typedef containers_detail::advanced_insert_aux_int<value_type, iterator> advanced_insert_aux_int_t;
+   typedef repeat_iterator<T, difference_type>  r_iterator;
+   typedef boost::move_iterator<r_iterator>    move_it;
+
+   /// @endcond
+
+   allocator_type get_allocator() const { return Base::alloc(); }
+
+   public:                         // Basic accessors
+   BOOST_ENABLE_MOVE_EMULATION(deque)
+
+   iterator begin() 
+      { return this->members_.m_start; }
+
+   iterator end() 
+      { return this->members_.m_finish; }
+
+   const_iterator begin() const 
+      { return this->members_.m_start; }
+
+   const_iterator end() const 
+      { return this->members_.m_finish; }
+
+   reverse_iterator rbegin() 
+      { return reverse_iterator(this->members_.m_finish); }
+
+   reverse_iterator rend() 
+      { return reverse_iterator(this->members_.m_start); }
+
+   const_reverse_iterator rbegin() const 
+      { return const_reverse_iterator(this->members_.m_finish); }
+
+   const_reverse_iterator rend() const 
+      { return const_reverse_iterator(this->members_.m_start); }
+
+   const_iterator cbegin() const 
+      { return this->members_.m_start; }
+
+   const_iterator cend() const 
+      { return this->members_.m_finish; }
+
+   const_reverse_iterator crbegin() const 
+      { return const_reverse_iterator(this->members_.m_finish); }
+
+   const_reverse_iterator crend() const 
+      { return const_reverse_iterator(this->members_.m_start); }
+
+   reference operator[](size_type n)
+      { return this->members_.m_start[difference_type(n)]; }
+
+   const_reference operator[](size_type n) const 
+      { return this->members_.m_start[difference_type(n)]; }
+
+   void priv_range_check(size_type n) const 
+      {  if (n >= this->size())  BOOST_RETHROW std::out_of_range("deque");   }
+
+   reference at(size_type n)
+      { this->priv_range_check(n); return (*this)[n]; }
+
+   const_reference at(size_type n) const
+      { this->priv_range_check(n); return (*this)[n]; }
+
+   reference front() { return *this->members_.m_start; }
+
+   reference back()  {  return *(end()-1); }
+
+   const_reference front() const 
+      { return *this->members_.m_start; }
+
+   const_reference back() const  {  return *(cend()-1);  }
+
+   size_type size() const 
+      { return this->members_.m_finish - this->members_.m_start; }
+
+   size_type max_size() const 
+      { return this->alloc().max_size(); }
+
+   bool empty() const 
+   { return this->members_.m_finish == this->members_.m_start; }
+
+   explicit deque(const allocator_type& a = allocator_type()) 
+      : Base(a)
+   {}
+
+   deque(const deque& x)
+      :  Base(x.alloc()) 
+   {
+      if(x.size()){
+         this->priv_initialize_map(x.size());
+         std::uninitialized_copy(x.begin(), x.end(), this->members_.m_start);
+      }
+   }
+
+   deque(BOOST_RV_REF(deque) mx) 
+      :  Base(mx.alloc())
+   {  this->swap(mx);   }
+
+   deque(size_type n, const value_type& value,
+         const allocator_type& a = allocator_type()) : Base(a, n)
+   { this->priv_fill_initialize(value); }
+
+   explicit deque(size_type n) : Base(allocator_type(), n)
+   {  this->resize(n); }
+
+   // Check whether it's an integral type.  If so, it's not an iterator.
+   template <class InpIt>
+   deque(InpIt first, InpIt last, const allocator_type& a = allocator_type())
+      : Base(a) 
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InpIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_initialize_dispatch(first, last, Result());
+   }
+
+   ~deque() 
+   {
+      priv_destroy_range(this->members_.m_start, this->members_.m_finish);
+   }
+
+   deque& operator= (const deque& x) 
+   {
+      const size_type len = size();
+      if (&x != this) {
+         if (len >= x.size())
+            this->erase(std::copy(x.begin(), x.end(), this->members_.m_start), this->members_.m_finish);
+         else {
+            const_iterator mid = x.begin() + difference_type(len);
+            std::copy(x.begin(), mid, this->members_.m_start);
+            this->insert(this->members_.m_finish, mid, x.end());
+         }
+      }
+      return *this;
+   }        
+
+   deque& operator= (BOOST_RV_REF(deque) x)
+   {
+      this->clear();
+      this->swap(x);
+      return *this;
+   }
+
+   void swap(deque &x)
+   {
+      std::swap(this->members_.m_start, x.members_.m_start);
+      std::swap(this->members_.m_finish, x.members_.m_finish);
+      std::swap(this->members_.m_map, x.members_.m_map);
+      std::swap(this->members_.m_map_size, x.members_.m_map_size);
+   }
+
+   void assign(size_type n, const T& val)
+   {  this->priv_fill_assign(n, val);  }
+
+   template <class InpIt>
+   void assign(InpIt first, InpIt last)
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InpIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_assign_dispatch(first, last, Result());
+   }
+
+   void push_back(const value_type& t) 
+   {
+      if(this->priv_push_back_simple_available()){
+         new(this->priv_push_back_simple_pos())value_type(t);
+         this->priv_push_back_simple_commit();
+      }
+      else{
+         this->priv_insert_aux(cend(), size_type(1), t);
+      }
+   }
+
+   void push_back(BOOST_RV_REF(value_type) t) 
+   {
+      if(this->priv_push_back_simple_available()){
+         new(this->priv_push_back_simple_pos())value_type(boost::move(t));
+         this->priv_push_back_simple_commit();
+      }
+      else{
+         this->priv_insert_aux(cend(), move_it(r_iterator(t, 1)), move_it(r_iterator()));
+      }
+   }
+
+   void push_front(const value_type& t)
+   {
+      if(this->priv_push_front_simple_available()){
+         new(this->priv_push_front_simple_pos())value_type(t);
+         this->priv_push_front_simple_commit();
+      }
+      else{
+         this->priv_insert_aux(cbegin(), size_type(1), t);
+      }
+   }
+
+   void push_front(BOOST_RV_REF(value_type) t)
+   {
+      if(this->priv_push_front_simple_available()){
+         new(this->priv_push_front_simple_pos())value_type(boost::move(t));
+         this->priv_push_front_simple_commit();
+      }
+      else{
+         this->priv_insert_aux(cbegin(), move_it(r_iterator(t, 1)), move_it(r_iterator()));
+      }
+   }
+
+   void pop_back() 
+   {
+      if (this->members_.m_finish.m_cur != this->members_.m_finish.m_first) {
+         --this->members_.m_finish.m_cur;
+         containers_detail::get_pointer(this->members_.m_finish.m_cur)->~value_type();
+      }
+      else
+         this->priv_pop_back_aux();
+   }
+
+   void pop_front() 
+   {
+      if (this->members_.m_start.m_cur != this->members_.m_start.m_last - 1) {
+         containers_detail::get_pointer(this->members_.m_start.m_cur)->~value_type();
+         ++this->members_.m_start.m_cur;
+      }
+      else 
+         this->priv_pop_front_aux();
+   }
+
+   iterator insert(const_iterator position, const value_type& x) 
+   {
+      if (position == cbegin()){
+         this->push_front(x);
+         return begin();
+      }
+      else if (position == cend()){
+         this->push_back(x);
+         return (end()-1);
+      }
+      else {
+         size_type n = position - cbegin();
+         this->priv_insert_aux(position, size_type(1), x);
+         return iterator(this->begin() + n);
+      }
+   }
+
+   iterator insert(const_iterator position, BOOST_RV_REF(value_type) mx) 
+   {
+      if (position == cbegin()) {
+         this->push_front(boost::move(mx));
+         return begin();
+      }
+      else if (position == cend()) {
+         this->push_back(boost::move(mx));
+         return(end()-1);
+      }
+      else {
+         //Just call more general insert(pos, size, value) and return iterator
+         size_type n = position - begin();
+         this->priv_insert_aux(position, move_it(r_iterator(mx, 1)), move_it(r_iterator()));
+         return iterator(this->begin() + n);
+      }
+   }
+
+   void insert(const_iterator pos, size_type n, const value_type& x)
+   { this->priv_fill_insert(pos, n, x); }
+
+   // Check whether it's an integral type.  If so, it's not an iterator.
+   template <class InpIt>
+   void insert(const_iterator pos, InpIt first, InpIt last) 
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InpIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_insert_dispatch(pos, first, last, Result());
+   }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   template <class... Args>
+   void emplace_back(Args&&... args)
+   {
+      if(this->priv_push_back_simple_available()){
+         new(this->priv_push_back_simple_pos())value_type(boost::forward<Args>(args)...);
+         this->priv_push_back_simple_commit();
+      }
+      else{
+         containers_detail::advanced_insert_aux_emplace<T, iterator, Args...> proxy(boost::forward<Args>(args)...);
+         this->priv_insert_aux_impl(this->cend(), 1, proxy);
+      }
+   }
+
+   template <class... Args>
+   void emplace_front(Args&&... args)
+   {
+      if(this->priv_push_front_simple_available()){
+         new(this->priv_push_front_simple_pos())value_type(boost::forward<Args>(args)...);
+         this->priv_push_front_simple_commit();
+      }
+      else{
+         containers_detail::advanced_insert_aux_emplace<T, iterator, Args...> proxy(boost::forward<Args>(args)...);
+         this->priv_insert_aux_impl(this->cbegin(), 1, proxy);
+      }
+   }
+
+   template <class... Args>
+   iterator emplace(const_iterator p, Args&&... args)
+   {
+      if(p == this->cbegin()){
+         this->emplace_front(boost::forward<Args>(args)...);
+         return this->begin();
+      }
+      else if(p == this->cend()){
+         this->emplace_back(boost::forward<Args>(args)...);
+         return (this->end()-1);
+      }
+      else{
+         size_type n = p - this->cbegin();
+         containers_detail::advanced_insert_aux_emplace<T, iterator, Args...> proxy(boost::forward<Args>(args)...);
+         this->priv_insert_aux_impl(p, 1, proxy);
+         return iterator(this->begin() + n);
+      }
+   }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //0 args
+   void emplace_back()
+   {
+      if(priv_push_front_simple_available()){
+         new(priv_push_front_simple_pos())value_type();
+         priv_push_front_simple_commit();
+      }
+      else{
+         containers_detail::advanced_insert_aux_emplace<T, iterator> proxy;
+         priv_insert_aux_impl(cend(), 1, proxy);
+      }
+   }
+
+   void emplace_front()
+   {
+      if(priv_push_front_simple_available()){
+         new(priv_push_front_simple_pos())value_type();
+         priv_push_front_simple_commit();
+      }
+      else{
+         containers_detail::advanced_insert_aux_emplace<T, iterator> proxy;
+         priv_insert_aux_impl(cbegin(), 1, proxy);
+      }
+   }
+
+   iterator emplace(const_iterator p)
+   {
+      if(p == cbegin()){
+         emplace_front();
+         return begin();
+      }
+      else if(p == cend()){
+         emplace_back();
+         return (end()-1);
+      }
+      else{
+         size_type n = p - cbegin();
+         containers_detail::advanced_insert_aux_emplace<T, iterator> proxy;
+         priv_insert_aux_impl(p, 1, proxy);
+         return iterator(this->begin() + n);
+      }
+   }
+
+   //advanced_insert_int.hpp includes all necessary preprocessor machinery...
+   #define BOOST_PP_LOCAL_MACRO(n)                                                           \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   void emplace_back(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                  \
+   {                                                                                         \
+      if(priv_push_back_simple_available()){                                                 \
+         new(priv_push_back_simple_pos())value_type                                          \
+         (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                         \
+         priv_push_back_simple_commit();                                                     \
+      }                                                                                      \
+      else{                                                                                  \
+         containers_detail::BOOST_PP_CAT(BOOST_PP_CAT(advanced_insert_aux_emplace, n), arg)             \
+            <value_type, iterator, BOOST_PP_ENUM_PARAMS(n, P)>                               \
+               proxy(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));              \
+         priv_insert_aux_impl(cend(), 1, proxy);                                             \
+      }                                                                                      \
+   }                                                                                         \
+                                                                                             \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   void emplace_front(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                 \
+   {                                                                                         \
+      if(priv_push_front_simple_available()){                                                \
+         new(priv_push_front_simple_pos())value_type                                         \
+            (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                      \
+         priv_push_front_simple_commit();                                                    \
+      }                                                                                      \
+      else{                                                                                  \
+         containers_detail::BOOST_PP_CAT(BOOST_PP_CAT(advanced_insert_aux_emplace, n), arg)             \
+            <value_type, iterator, BOOST_PP_ENUM_PARAMS(n, P)>                               \
+               proxy(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));              \
+         priv_insert_aux_impl(cbegin(), 1, proxy);                                           \
+      }                                                                                      \
+   }                                                                                         \
+                                                                                             \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   iterator emplace(const_iterator p, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _)) \
+   {                                                                                         \
+      if(p == this->cbegin()){                                                               \
+         this->emplace_front(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));      \
+         return this->begin();                                                               \
+      }                                                                                      \
+      else if(p == cend()){                                                                  \
+         this->emplace_back(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));       \
+         return (this->end()-1);                                                             \
+      }                                                                                      \
+      else{                                                                                  \
+         size_type pos_num = p - this->cbegin();                                             \
+         containers_detail::BOOST_PP_CAT(BOOST_PP_CAT(advanced_insert_aux_emplace, n), arg)             \
+            <value_type, iterator, BOOST_PP_ENUM_PARAMS(n, P)>                               \
+               proxy(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));              \
+         this->priv_insert_aux_impl(p, 1, proxy);                                            \
+         return iterator(this->begin() + pos_num);                                           \
+      }                                                                                      \
+   }                                                                                         \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   void resize(size_type new_size, const value_type& x) 
+   {
+      const size_type len = size();
+      if (new_size < len) 
+         this->erase(this->members_.m_start + new_size, this->members_.m_finish);
+      else
+         this->insert(this->members_.m_finish, new_size - len, x);
+   }
+
+   void resize(size_type new_size) 
+   {
+      const size_type len = size();
+      if (new_size < len) 
+         this->erase(this->members_.m_start + new_size, this->members_.m_finish);
+      else{
+         size_type n = new_size - this->size();
+         containers_detail::default_construct_aux_proxy<T, iterator, size_type> proxy(n);
+         priv_insert_aux_impl(this->cend(), n, proxy);
+      }
+   }
+
+   iterator erase(const_iterator pos) 
+   {
+      const_iterator next = pos;
+      ++next;
+      difference_type index = pos - this->members_.m_start;
+      if (size_type(index) < (this->size() >> 1)) {
+         boost::move_backward(begin(), iterator(pos), iterator(next));
+         pop_front();
+      }
+      else {
+         boost::move(iterator(next), end(), iterator(pos));
+         pop_back();
+      }
+      return this->members_.m_start + index;
+   }
+
+   iterator erase(const_iterator first, const_iterator last)
+   {
+      if (first == this->members_.m_start && last == this->members_.m_finish) {
+         this->clear();
+         return this->members_.m_finish;
+      }
+      else {
+         difference_type n = last - first;
+         difference_type elems_before = first - this->members_.m_start;
+         if (elems_before < static_cast<difference_type>(this->size() - n) - elems_before) {
+            boost::move_backward(begin(), iterator(first), iterator(last));
+            iterator new_start = this->members_.m_start + n;
+            if(!Base::traits_t::trivial_dctr_after_move)
+               this->priv_destroy_range(this->members_.m_start, new_start);
+            this->priv_destroy_nodes(new_start.m_node, this->members_.m_start.m_node);
+            this->members_.m_start = new_start;
+         }
+         else {
+            boost::move(iterator(last), end(), iterator(first));
+            iterator new_finish = this->members_.m_finish - n;
+            if(!Base::traits_t::trivial_dctr_after_move)
+               this->priv_destroy_range(new_finish, this->members_.m_finish);
+            this->priv_destroy_nodes(new_finish.m_node + 1, this->members_.m_finish.m_node + 1);
+            this->members_.m_finish = new_finish;
+         }
+         return this->members_.m_start + elems_before;
+      }
+   }
+
+   void clear()
+   {
+      for (index_pointer node = this->members_.m_start.m_node + 1;
+            node < this->members_.m_finish.m_node;
+            ++node) {
+         this->priv_destroy_range(*node, *node + this->s_buffer_size());
+         this->priv_deallocate_node(*node);
+      }
+
+      if (this->members_.m_start.m_node != this->members_.m_finish.m_node) {
+         this->priv_destroy_range(this->members_.m_start.m_cur, this->members_.m_start.m_last);
+         this->priv_destroy_range(this->members_.m_finish.m_first, this->members_.m_finish.m_cur);
+         this->priv_deallocate_node(this->members_.m_finish.m_first);
+      }
+      else
+         this->priv_destroy_range(this->members_.m_start.m_cur, this->members_.m_finish.m_cur);
+
+      this->members_.m_finish = this->members_.m_start;
+   }
+
+   /// @cond
+   private:
+
+   bool priv_push_back_simple_available() const
+   {
+      return this->members_.m_map &&
+         (this->members_.m_finish.m_cur != (this->members_.m_finish.m_last - 1));
+   }
+
+   void *priv_push_back_simple_pos() const
+   {
+      return static_cast<void*>(containers_detail::get_pointer(this->members_.m_finish.m_cur));
+   }
+
+   void priv_push_back_simple_commit()
+   {
+      ++this->members_.m_finish.m_cur;
+   }
+
+   bool priv_push_front_simple_available() const
+   {
+      return this->members_.m_map &&
+         (this->members_.m_start.m_cur != this->members_.m_start.m_first);
+   }
+
+   void *priv_push_front_simple_pos() const
+   {  return static_cast<void*>(containers_detail::get_pointer(this->members_.m_start.m_cur) - 1);  }
+
+   void priv_push_front_simple_commit()
+   {  --this->members_.m_start.m_cur;   }
+
+   template <class InpIt>
+   void priv_insert_aux(const_iterator pos, InpIt first, InpIt last, std::input_iterator_tag)
+   {
+      for(;first != last; ++first){
+         this->insert(pos, boost::move(value_type(*first)));
+      }
+   }
+
+   template <class FwdIt>
+   void priv_insert_aux(const_iterator pos, FwdIt first, FwdIt last, std::forward_iterator_tag) 
+   {  this->priv_insert_aux(pos, first, last);  }
+
+  // assign(), a generalized assignment member function.  Two
+  // versions: one that takes a count, and one that takes a range.
+  // The range version is a member template, so we dispatch on whether
+  // or not the type is an integer.
+   void priv_fill_assign(size_type n, const T& val)
+   {
+      if (n > size()) {
+         std::fill(begin(), end(), val);
+         this->insert(cend(), n - size(), val);
+      }
+      else {
+         this->erase(cbegin() + n, cend());
+         std::fill(begin(), end(), val);
+      }
+   }
+
+   template <class Integer>
+   void priv_initialize_dispatch(Integer n, Integer x, containers_detail::true_) 
+   {
+      this->priv_initialize_map(n);
+      this->priv_fill_initialize(x);
+   }
+
+   template <class InpIt>
+   void priv_initialize_dispatch(InpIt first, InpIt last, containers_detail::false_) 
+   {
+      typedef typename std::iterator_traits<InpIt>::iterator_category ItCat;
+      this->priv_range_initialize(first, last, ItCat());
+   }
+
+   void priv_destroy_range(iterator p, iterator p2)
+   {
+      for(;p != p2; ++p)
+         containers_detail::get_pointer(&*p)->~value_type();
+   }
+
+   void priv_destroy_range(pointer p, pointer p2)
+   {
+      for(;p != p2; ++p)
+         containers_detail::get_pointer(&*p)->~value_type();
+   }
+
+   template <class Integer>
+   void priv_assign_dispatch(Integer n, Integer val, containers_detail::true_)
+      { this->priv_fill_assign((size_type) n, (T) val); }
+
+   template <class InpIt>
+   void priv_assign_dispatch(InpIt first, InpIt last, containers_detail::false_) 
+   {
+      typedef typename std::iterator_traits<InpIt>::iterator_category ItCat;
+      this->priv_assign_aux(first, last, ItCat());
+   }
+
+   template <class InpIt>
+   void priv_assign_aux(InpIt first, InpIt last, std::input_iterator_tag)
+   {
+      iterator cur = begin();
+      for ( ; first != last && cur != end(); ++cur, ++first)
+         *cur = *first;
+      if (first == last)
+         this->erase(cur, cend());
+      else
+         this->insert(cend(), first, last);
+   }
+
+   template <class FwdIt>
+   void priv_assign_aux(FwdIt first, FwdIt last, std::forward_iterator_tag)
+   {
+      size_type len = std::distance(first, last);
+      if (len > size()) {
+         FwdIt mid = first;
+         std::advance(mid, size());
+         std::copy(first, mid, begin());
+         this->insert(cend(), mid, last);
+      }
+      else
+         this->erase(std::copy(first, last, begin()), cend());
+   }
+
+   template <class Integer>
+   void priv_insert_dispatch(const_iterator pos, Integer n, Integer x, containers_detail::true_) 
+   {  this->priv_fill_insert(pos, (size_type) n, (value_type) x); }
+
+   template <class InpIt>
+   void priv_insert_dispatch(const_iterator pos,InpIt first, InpIt last, containers_detail::false_) 
+   {
+      typedef typename std::iterator_traits<InpIt>::iterator_category ItCat;
+      this->priv_insert_aux(pos, first, last, ItCat());
+   }
+
+   void priv_insert_aux(const_iterator pos, size_type n, const value_type& x)
+   {
+      typedef constant_iterator<value_type, difference_type> c_it;
+      this->priv_insert_aux(pos, c_it(x, n), c_it());
+   }
+
+   //Just forward all operations to priv_insert_aux_impl
+   template <class FwdIt>
+   void priv_insert_aux(const_iterator p, FwdIt first, FwdIt last)
+   {
+      containers_detail::advanced_insert_aux_proxy<T, FwdIt, iterator> proxy(first, last);
+      priv_insert_aux_impl(p, (size_type)std::distance(first, last), proxy);
+   }
+
+   void priv_insert_aux_impl(const_iterator p, size_type n, advanced_insert_aux_int_t &interf)
+   {
+      iterator pos(p);
+      if(!this->members_.m_map){
+         this->priv_initialize_map(0);
+         pos = this->begin();
+      }
+
+      const difference_type elemsbefore = pos - this->members_.m_start;
+      size_type length = this->size();
+      if (elemsbefore < static_cast<difference_type>(length / 2)) {
+         iterator new_start = this->priv_reserve_elements_at_front(n);
+         iterator old_start = this->members_.m_start;
+         pos = this->members_.m_start + elemsbefore;
+         if (elemsbefore >= difference_type(n)) {
+            iterator start_n = this->members_.m_start + difference_type(n); 
+            boost::uninitialized_move(this->members_.m_start, start_n, new_start);
+            this->members_.m_start = new_start;
+            boost::move(start_n, pos, old_start);
+            interf.copy_all_to(pos - difference_type(n));
+         }
+         else {
+            difference_type mid_count = (difference_type(n) - elemsbefore);
+            iterator mid_start = old_start - mid_count;
+            interf.uninitialized_copy_some_and_update(mid_start, mid_count, true);
+            this->members_.m_start = mid_start;
+            boost::uninitialized_move(old_start, pos, new_start);
+            this->members_.m_start = new_start;
+            interf.copy_all_to(old_start);
+         }
+      }
+      else {
+         iterator new_finish = this->priv_reserve_elements_at_back(n);
+         iterator old_finish = this->members_.m_finish;
+         const difference_type elemsafter = 
+            difference_type(length) - elemsbefore;
+         pos = this->members_.m_finish - elemsafter;
+         if (elemsafter >= difference_type(n)) {
+            iterator finish_n = this->members_.m_finish - difference_type(n);
+            boost::uninitialized_move(finish_n, this->members_.m_finish, this->members_.m_finish);
+            this->members_.m_finish = new_finish;
+            boost::move_backward(pos, finish_n, old_finish);
+            interf.copy_all_to(pos);
+         }
+         else {
+            interf.uninitialized_copy_some_and_update(old_finish, elemsafter, false);
+            this->members_.m_finish += n-elemsafter;
+            boost::uninitialized_move(pos, old_finish, this->members_.m_finish);
+            this->members_.m_finish = new_finish;
+            interf.copy_all_to(pos);
+         }
+      }
+   }
+
+   void priv_fill_insert(const_iterator pos, size_type n, const value_type& x)
+   {
+      typedef constant_iterator<value_type, difference_type> c_it;
+      this->insert(pos, c_it(x, n), c_it());
+   }
+
+   // Precondition: this->members_.m_start and this->members_.m_finish have already been initialized,
+   // but none of the deque's elements have yet been constructed.
+   void priv_fill_initialize(const value_type& value) 
+   {
+      index_pointer cur;
+      BOOST_TRY {
+         for (cur = this->members_.m_start.m_node; cur < this->members_.m_finish.m_node; ++cur){
+            std::uninitialized_fill(*cur, *cur + this->s_buffer_size(), value);
+         }
+         std::uninitialized_fill(this->members_.m_finish.m_first, this->members_.m_finish.m_cur, value);
+      }
+      BOOST_CATCH(...){
+         this->priv_destroy_range(this->members_.m_start, iterator(*cur, cur));
+         BOOST_RETHROW
+      }
+      BOOST_CATCH_END
+   }
+
+   template <class InpIt>
+   void priv_range_initialize(InpIt first, InpIt last, std::input_iterator_tag)
+   {
+      this->priv_initialize_map(0);
+      BOOST_TRY {
+         for ( ; first != last; ++first)
+            this->push_back(*first);
+      }
+      BOOST_CATCH(...){
+         this->clear();
+         BOOST_RETHROW
+      }
+      BOOST_CATCH_END
+   }
+
+   template <class FwdIt>
+   void priv_range_initialize(FwdIt first, FwdIt last, std::forward_iterator_tag)
+   {
+      size_type n = 0;
+      n = std::distance(first, last);
+      this->priv_initialize_map(n);
+
+      index_pointer cur_node;
+      BOOST_TRY {
+         for (cur_node = this->members_.m_start.m_node; 
+               cur_node < this->members_.m_finish.m_node; 
+               ++cur_node) {
+            FwdIt mid = first;
+            std::advance(mid, this->s_buffer_size());
+            boost::uninitialized_copy_or_move(first, mid, *cur_node);
+            first = mid;
+         }
+         boost::uninitialized_copy_or_move(first, last, this->members_.m_finish.m_first);
+      }
+      BOOST_CATCH(...){
+         this->priv_destroy_range(this->members_.m_start, iterator(*cur_node, cur_node));
+         BOOST_RETHROW
+      }
+      BOOST_CATCH_END
+   }
+
+   // Called only if this->members_.m_finish.m_cur == this->members_.m_finish.m_first.
+   void priv_pop_back_aux()
+   {
+      this->priv_deallocate_node(this->members_.m_finish.m_first);
+      this->members_.m_finish.priv_set_node(this->members_.m_finish.m_node - 1);
+      this->members_.m_finish.m_cur = this->members_.m_finish.m_last - 1;
+      containers_detail::get_pointer(this->members_.m_finish.m_cur)->~value_type();
+   }
+
+   // Called only if this->members_.m_start.m_cur == this->members_.m_start.m_last - 1.  Note that 
+   // if the deque has at least one element (a precondition for this member 
+   // function), and if this->members_.m_start.m_cur == this->members_.m_start.m_last, then the deque 
+   // must have at least two nodes.
+   void priv_pop_front_aux()
+   {
+      containers_detail::get_pointer(this->members_.m_start.m_cur)->~value_type();
+      this->priv_deallocate_node(this->members_.m_start.m_first);
+      this->members_.m_start.priv_set_node(this->members_.m_start.m_node + 1);
+      this->members_.m_start.m_cur = this->members_.m_start.m_first;
+   }      
+
+   iterator priv_reserve_elements_at_front(size_type n) 
+   {
+      size_type vacancies = this->members_.m_start.m_cur - this->members_.m_start.m_first;
+      if (n > vacancies){
+         size_type new_elems = n-vacancies;
+         size_type new_nodes = (new_elems + this->s_buffer_size() - 1) / 
+            this->s_buffer_size();
+         size_type s = (size_type)(this->members_.m_start.m_node - this->members_.m_map);
+         if (new_nodes > s){
+            this->priv_reallocate_map(new_nodes, true);
+         }
+         size_type i = 1;
+         BOOST_TRY {
+            for (; i <= new_nodes; ++i)
+               *(this->members_.m_start.m_node - i) = this->priv_allocate_node();
+         }
+         BOOST_CATCH(...) {
+            for (size_type j = 1; j < i; ++j)
+               this->priv_deallocate_node(*(this->members_.m_start.m_node - j));      
+            BOOST_RETHROW
+         }
+         BOOST_CATCH_END
+      }
+      return this->members_.m_start - difference_type(n);
+   }
+
+   iterator priv_reserve_elements_at_back(size_type n) 
+   {
+      size_type vacancies = (this->members_.m_finish.m_last - this->members_.m_finish.m_cur) - 1;
+      if (n > vacancies){
+         size_type new_elems = n - vacancies;
+         size_type new_nodes = (new_elems + this->s_buffer_size() - 1)/s_buffer_size();
+         size_type s = (size_type)(this->members_.m_map_size - (this->members_.m_finish.m_node - this->members_.m_map));
+         if (new_nodes + 1 > s){
+            this->priv_reallocate_map(new_nodes, false);
+         }
+         size_type i;
+         BOOST_TRY {
+            for (i = 1; i <= new_nodes; ++i)
+               *(this->members_.m_finish.m_node + i) = this->priv_allocate_node();
+         }
+         BOOST_CATCH(...) {
+            for (size_type j = 1; j < i; ++j)
+               this->priv_deallocate_node(*(this->members_.m_finish.m_node + j));      
+            BOOST_RETHROW
+         }
+         BOOST_CATCH_END
+      }
+      return this->members_.m_finish + difference_type(n);
+   }
+
+   void priv_reallocate_map(size_type nodes_to_add, bool add_at_front)
+   {
+      size_type old_num_nodes = this->members_.m_finish.m_node - this->members_.m_start.m_node + 1;
+      size_type new_num_nodes = old_num_nodes + nodes_to_add;
+
+      index_pointer new_nstart;
+      if (this->members_.m_map_size > 2 * new_num_nodes) {
+         new_nstart = this->members_.m_map + (this->members_.m_map_size - new_num_nodes) / 2 
+                           + (add_at_front ? nodes_to_add : 0);
+         if (new_nstart < this->members_.m_start.m_node)
+            boost::move(this->members_.m_start.m_node, this->members_.m_finish.m_node + 1, new_nstart);
+         else
+            boost::move_backward
+               (this->members_.m_start.m_node, this->members_.m_finish.m_node + 1, new_nstart + old_num_nodes);
+      }
+      else {
+         size_type new_map_size = 
+            this->members_.m_map_size + containers_detail::max_value(this->members_.m_map_size, nodes_to_add) + 2;
+
+         index_pointer new_map = this->priv_allocate_map(new_map_size);
+         new_nstart = new_map + (new_map_size - new_num_nodes) / 2
+                              + (add_at_front ? nodes_to_add : 0);
+         boost::move(this->members_.m_start.m_node, this->members_.m_finish.m_node + 1, new_nstart);
+         this->priv_deallocate_map(this->members_.m_map, this->members_.m_map_size);
+
+         this->members_.m_map = new_map;
+         this->members_.m_map_size = new_map_size;
+      }
+
+      this->members_.m_start.priv_set_node(new_nstart);
+      this->members_.m_finish.priv_set_node(new_nstart + old_num_nodes - 1);
+   }
+   /// @endcond
+};
+
+// Nonmember functions.
+template <class T, class Alloc>
+inline bool operator==(const deque<T, Alloc>& x,
+                       const deque<T, Alloc>& y)
+{
+   return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
+}
+
+template <class T, class Alloc>
+inline bool operator<(const deque<T, Alloc>& x,
+                      const deque<T, Alloc>& y) 
+{
+   return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+template <class T, class Alloc>
+inline bool operator!=(const deque<T, Alloc>& x,
+                       const deque<T, Alloc>& y) 
+   {  return !(x == y);   }
+
+template <class T, class Alloc>
+inline bool operator>(const deque<T, Alloc>& x,
+                      const deque<T, Alloc>& y) 
+   {  return y < x; }
+
+template <class T, class Alloc>
+inline bool operator<=(const deque<T, Alloc>& x,
+                       const deque<T, Alloc>& y) 
+   {  return !(y < x); }
+
+template <class T, class Alloc>
+inline bool operator>=(const deque<T, Alloc>& x,
+                       const deque<T, Alloc>& y) 
+   {  return !(x < y); }
+
+
+template <class T, class A>
+inline void swap(deque<T, A>& x, deque<T, A>& y)
+{  x.swap(y);  }
+
+}}
+
+/// @cond
+
+namespace boost {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class A>
+struct has_trivial_destructor_after_move<boost::container::deque<T, A> >
+{
+   enum {   value = has_trivial_destructor<A>::value  };
+};
+
+}
+
+/// @endcond
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //   #ifndef  BOOST_CONTAINERS_DEQUE_HPP
Added: sandbox/move/boost/container/detail/advanced_insert_int.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/advanced_insert_int.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,386 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2008-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_ADVANCED_INSERT_INT_HPP
+#define BOOST_CONTAINERS_ADVANCED_INSERT_INT_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/move/move.hpp>
+#include <iterator>  //std::iterator_traits
+#include <algorithm> //std::copy, std::uninitialized_copy
+#include <new>       //placement new
+#include <cassert>
+
+namespace boost { namespace container { namespace containers_detail {
+
+//This class will be interface for operations dependent on FwdIt types used advanced_insert_aux_impl
+template<class T, class Iterator>
+struct advanced_insert_aux_int
+{
+   typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
+   virtual void copy_all_to(Iterator p) = 0;
+   virtual void uninitialized_copy_all_to(Iterator p) = 0;
+   virtual void uninitialized_copy_some_and_update(Iterator pos, difference_type division_count, bool first) = 0;
+   virtual void copy_some_and_update(Iterator pos, difference_type division_count, bool first) = 0;
+   virtual ~advanced_insert_aux_int() {}
+};
+
+//This class template will adapt each FwIt types to advanced_insert_aux_int
+template<class T, class FwdIt, class Iterator>
+struct advanced_insert_aux_proxy
+   :  public advanced_insert_aux_int<T, Iterator>
+{
+   typedef typename advanced_insert_aux_int<T, Iterator>::difference_type difference_type;
+   advanced_insert_aux_proxy(FwdIt first, FwdIt last)
+      :  first_(first), last_(last)
+   {}
+
+   virtual ~advanced_insert_aux_proxy()
+   {}
+
+   virtual void copy_all_to(Iterator p)
+   {  std::copy(first_, last_, p);  }
+
+   virtual void uninitialized_copy_all_to(Iterator p)
+   {  boost::uninitialized_copy_or_move(first_, last_, p);  }
+
+   virtual void uninitialized_copy_some_and_update(Iterator pos, difference_type division_count, bool first_n)
+   {
+      FwdIt mid = first_;
+      std::advance(mid, division_count);
+      if(first_n){
+         boost::uninitialized_copy_or_move(first_, mid, pos);
+         first_ = mid;
+      }
+      else{
+         boost::uninitialized_copy_or_move(mid, last_, pos);
+         last_ = mid;
+      }
+   }
+
+   virtual void copy_some_and_update(Iterator pos, difference_type division_count, bool first_n)
+   {
+      FwdIt mid = first_;
+      std::advance(mid, division_count);
+      if(first_n){
+         std::copy(first_, mid, pos);
+         first_ = mid;
+      }
+      else{
+         std::copy(mid, last_, pos);
+         last_ = mid;
+      }
+   }
+
+   FwdIt first_, last_;
+};
+
+//This class template will adapt each FwIt types to advanced_insert_aux_int
+template<class T, class Iterator, class SizeType>
+struct default_construct_aux_proxy
+   :  public advanced_insert_aux_int<T, Iterator>
+{
+   typedef typename advanced_insert_aux_int<T, Iterator>::difference_type difference_type;
+   default_construct_aux_proxy(SizeType count)
+      :  count_(count)
+   {}
+
+   void uninitialized_copy_impl(Iterator p, const SizeType n)
+   {
+      assert(n <= count_);
+      Iterator orig_p = p;
+      SizeType i = 0;
+      try{
+         for(; i < n; ++i, ++p){
+            new(containers_detail::get_pointer(&*p))T();
+         }
+      }
+      catch(...){
+         while(i--){
+            containers_detail::get_pointer(&*orig_p++)->~T();
+         }
+         throw;
+      }
+      count_ -= n;
+   }
+
+   virtual ~default_construct_aux_proxy()
+   {}
+
+   virtual void copy_all_to(Iterator)
+   {  //This should never be called with any count
+      assert(count_ == 0);
+   }
+
+   virtual void uninitialized_copy_all_to(Iterator p)
+   {  this->uninitialized_copy_impl(p, count_); }
+
+   virtual void uninitialized_copy_some_and_update(Iterator pos, difference_type division_count, bool first_n)
+   {
+      SizeType new_count;
+      if(first_n){
+         new_count = division_count;
+      }
+      else{
+         assert(difference_type(count_)>= division_count);
+         new_count = count_ - division_count;
+      }
+      this->uninitialized_copy_impl(pos, new_count);
+   }
+
+   virtual void copy_some_and_update(Iterator , difference_type division_count, bool first_n)
+   {
+      assert(count_ == 0);
+      SizeType new_count;
+      if(first_n){
+         new_count = division_count;
+      }
+      else{
+         assert(difference_type(count_)>= division_count);
+         new_count = count_ - division_count;
+      }
+      //This function should never called with a count different to zero
+      assert(new_count == 0);
+      (void)new_count;
+   }
+
+   SizeType count_;
+};
+
+}}}   //namespace boost { namespace container { namespace containers_detail {
+
+#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+#include <boost/container/detail/variadic_templates_tools.hpp>
+#include <boost/move/move.hpp>
+#include <typeinfo>
+//#include <iostream> //For debugging purposes
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+//This class template will adapt each FwIt types to advanced_insert_aux_int
+template<class T, class Iterator, class ...Args>
+struct advanced_insert_aux_emplace
+   :  public advanced_insert_aux_int<T, Iterator>
+{
+   typedef typename advanced_insert_aux_int<T, Iterator>::difference_type difference_type;
+   typedef typename build_number_seq<sizeof...(Args)>::type             index_tuple_t;
+
+   advanced_insert_aux_emplace(Args&&... args)
+      : args_(args...), used_(false)
+   {}
+
+   ~advanced_insert_aux_emplace()
+   {}
+
+   virtual void copy_all_to(Iterator p)
+   {  this->priv_copy_all_to(index_tuple_t(), p);   }
+
+   virtual void uninitialized_copy_all_to(Iterator p)
+   {  this->priv_uninitialized_copy_all_to(index_tuple_t(), p);   }
+
+   virtual void uninitialized_copy_some_and_update(Iterator p, difference_type division_count, bool first_n)
+   {  this->priv_uninitialized_copy_some_and_update(index_tuple_t(), p, division_count, first_n);  }
+
+   virtual void copy_some_and_update(Iterator p, difference_type division_count, bool first_n)
+   {  this->priv_copy_some_and_update(index_tuple_t(), p, division_count, first_n);  }
+
+   private:
+   template<int ...IdxPack>
+   void priv_copy_all_to(const index_tuple<IdxPack...>&, Iterator p)
+   {
+      if(!used_){
+         T object(boost::forward<Args>(get<IdxPack>(args_))...);
+         *p = boost::move(object);
+         used_ = true;
+      }
+   }
+
+   template<int ...IdxPack>
+   void priv_uninitialized_copy_all_to(const index_tuple<IdxPack...>&, Iterator p)
+   {
+      if(!used_){
+         new(containers_detail::get_pointer(&*p))T(boost::forward<Args>(get<IdxPack>(args_))...);
+         used_ = true;
+      }
+   }
+
+   template<int ...IdxPack>
+   void priv_uninitialized_copy_some_and_update(const index_tuple<IdxPack...>&, Iterator p, difference_type division_count, bool first_n)
+   {
+      assert(division_count <=1);
+      if((first_n && division_count == 1) || (!first_n && division_count == 0)){
+         if(!used_){
+            new(containers_detail::get_pointer(&*p))T(boost::forward<Args>(get<IdxPack>(args_))...);
+            used_ = true;
+         }
+      }
+   }
+
+   template<int ...IdxPack>
+   void priv_copy_some_and_update(const index_tuple<IdxPack...>&, Iterator p, difference_type division_count, bool first_n)
+   {
+      assert(division_count <=1);
+      if((first_n && division_count == 1) || (!first_n && division_count == 0)){
+         if(!used_){
+            T object(boost::forward<Args>(get<IdxPack>(args_))...);
+            *p = boost::move(object);
+            used_ = true;
+         }
+      }
+   }
+   tuple<Args&&...> args_;
+   bool used_;
+};
+
+}}}   //namespace boost { namespace container { namespace containers_detail {
+
+#else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+#include <boost/container/detail/preprocessor.hpp> 
+#include <boost/container/detail/value_init.hpp>
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+//This class template will adapt each FwIt types to advanced_insert_aux_int
+template<class T, class Iterator>
+struct advanced_insert_aux_emplace
+   :  public advanced_insert_aux_int<T, Iterator>
+{
+   typedef typename advanced_insert_aux_int<T, Iterator>::difference_type difference_type;
+   advanced_insert_aux_emplace()
+      :  used_(false)
+   {}
+
+   ~advanced_insert_aux_emplace()
+   {}
+
+   virtual void copy_all_to(Iterator p)
+   {
+      if(!used_){
+         value_init<T>v;
+         *p = boost::move(v.m_t);
+         used_ = true;
+      }
+   }
+
+   virtual void uninitialized_copy_all_to(Iterator p)
+   {
+      if(!used_){
+         new(containers_detail::get_pointer(&*p))T();
+         used_ = true;
+      }
+   }
+
+   virtual void uninitialized_copy_some_and_update(Iterator p, difference_type division_count, bool first_n)
+   {
+      assert(division_count <=1);
+      if((first_n && division_count == 1) || (!first_n && division_count == 0)){
+         if(!used_){
+            new(containers_detail::get_pointer(&*p))T();
+            used_ = true;
+         }
+      }
+   }
+
+   virtual void copy_some_and_update(Iterator p, difference_type division_count, bool first_n)
+   {
+      assert(division_count <=1);
+      if((first_n && division_count == 1) || (!first_n && division_count == 0)){
+         if(!used_){
+            value_init<T>v;
+            *p = boost::move(v.m_t);
+            used_ = true;
+         }
+      }
+   }
+   private:
+   bool used_;
+};
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                     \
+   template<class T, class Iterator, BOOST_PP_ENUM_PARAMS(n, class P) >                \
+   struct BOOST_PP_CAT(BOOST_PP_CAT(advanced_insert_aux_emplace, n), arg)                \
+      :  public advanced_insert_aux_int<T, Iterator>                                     \
+   {                                                                                   \
+      typedef typename advanced_insert_aux_int<T, Iterator>::difference_type difference_type;  \
+                                                                                       \
+      BOOST_PP_CAT(BOOST_PP_CAT(advanced_insert_aux_emplace, n), arg)                    \
+         ( BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _) )          \
+         : used_(false), BOOST_PP_ENUM(n, BOOST_CONTAINERS_AUX_PARAM_INIT, _) {}     \
+                                                                                       \
+      virtual void copy_all_to(Iterator p)                                             \
+      {                                                                                \
+         if(!used_){                                                                   \
+            T v(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_MEMBER_FORWARD, _));            \
+            *p = boost::move(v);                                                 \
+            used_ = true;                                                              \
+         }                                                                             \
+      }                                                                                \
+                                                                                       \
+      virtual void uninitialized_copy_all_to(Iterator p)                               \
+      {                                                                                \
+         if(!used_){                                                                   \
+            new(containers_detail::get_pointer(&*p))T                                             \
+               (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_MEMBER_FORWARD, _));            \
+            used_ = true;                                                              \
+         }                                                                             \
+      }                                                                                \
+                                                                                       \
+      virtual void uninitialized_copy_some_and_update                                  \
+         (Iterator p, difference_type division_count, bool first_n)                    \
+      {                                                                                \
+         assert(division_count <=1);                                                   \
+         if((first_n && division_count == 1) || (!first_n && division_count == 0)){    \
+            if(!used_){                                                                \
+               new(containers_detail::get_pointer(&*p))T                                          \
+                  (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_MEMBER_FORWARD, _));         \
+               used_ = true;                                                           \
+            }                                                                          \
+         }                                                                             \
+      }                                                                                \
+                                                                                       \
+      virtual void copy_some_and_update                                                \
+         (Iterator p, difference_type division_count, bool first_n)                    \
+      {                                                                                \
+         assert(division_count <=1);                                                   \
+         if((first_n && division_count == 1) || (!first_n && division_count == 0)){    \
+            if(!used_){                                                                \
+               T v(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_MEMBER_FORWARD, _));         \
+               *p = boost::move(v);                                              \
+               used_ = true;                                                           \
+            }                                                                          \
+         }                                                                             \
+      }                                                                                \
+                                                                                       \
+      bool used_;                                                                      \
+      BOOST_PP_REPEAT(n, BOOST_CONTAINERS_AUX_PARAM_DEFINE, _)                       \
+   };                                                                                  \
+//!
+
+#define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+#include BOOST_PP_LOCAL_ITERATE()
+
+}}}   //namespace boost { namespace container { namespace containers_detail {
+
+#endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //#ifndef BOOST_CONTAINERS_ADVANCED_INSERT_INT_HPP
Added: sandbox/move/boost/container/detail/algorithms.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/algorithms.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,215 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008.
+//
+// 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_ALGORITHMS_HPP
+#define BOOST_CONTAINERS_DETAIL_ALGORITHMS_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/has_trivial_assign.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/get_pointer.hpp>
+
+#include <boost/container/detail/type_traits.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/iterators.hpp>
+
+
+#include <cstring>
+
+namespace boost {
+namespace container { 
+
+#if !defined(BOOST_HAS_RVALUE_REFS)
+template<class T>
+struct has_own_construct_from_it
+{
+   static const bool value = false;
+};
+
+namespace containers_detail  {
+
+template<class T, class InpIt>
+inline void construct_in_place_impl(T* dest, const InpIt &source, containers_detail::true_)
+{
+   T::construct(dest, *source);
+}
+
+template<class T, class InpIt>
+inline void construct_in_place_impl(T* dest, const InpIt &source, containers_detail::false_)
+{
+   new((void*)dest)T(*source);
+}
+
+}  //namespace containers_detail   {
+
+template<class T, class InpIt>
+inline void construct_in_place(T* dest, InpIt source)
+{
+   typedef containers_detail::bool_<has_own_construct_from_it<T>::value> boolean_t;
+   containers_detail::construct_in_place_impl(dest, source, boolean_t());
+}
+
+#else
+template<class T, class InpIt>
+inline void construct_in_place(T* dest, InpIt source)
+{     ::new((void*)dest)T(*source);   }
+#endif
+
+template<class T, class U, class D>
+inline void construct_in_place(T *dest, default_construct_iterator<U, D>)
+{
+   ::new((void*)dest)T();
+}
+
+template<class T, class U, class E>
+inline void construct_in_place(T *dest, emplace_iterator<U, E> ei)
+{
+   ei.construct_in_place(dest);
+}
+
+template<class InIt, class OutIt>
+struct optimize_assign
+{
+   static const bool value = false;
+};
+
+template<class T>
+struct optimize_assign<const T*, T*>
+{
+   static const bool value = boost::has_trivial_assign<T>::value;
+};
+
+template<class T>
+struct optimize_assign<T*, T*>
+   :  public optimize_assign<const T*, T*>
+{};
+
+template<class InIt, class OutIt>
+struct optimize_copy
+{
+   static const bool value = false;
+};
+
+template<class T>
+struct optimize_copy<const T*, T*>
+{
+   static const bool value = boost::has_trivial_copy<T>::value;
+};
+
+template<class T>
+struct optimize_copy<T*, T*>
+   :  public optimize_copy<const T*, T*>
+{};
+
+template<class InIt, class OutIt> inline
+OutIt copy_n_dispatch(InIt first, typename std::iterator_traits<InIt>::difference_type length, OutIt dest, containers_detail::bool_<false>)
+{
+   for (; length--; ++dest, ++first)
+      *dest = *first;
+   return dest;
+}
+
+template<class T> inline
+T *copy_n_dispatch(const T *first, typename std::iterator_traits<const T*>::difference_type length, T *dest, containers_detail::bool_<true>)
+{
+   std::size_t size = length*sizeof(T);
+   return (static_cast<T*>(std::memmove(dest, first, size))) + size;
+}
+
+template<class InIt, class OutIt> inline
+OutIt copy_n(InIt first, typename std::iterator_traits<InIt>::difference_type length, OutIt dest)
+{
+   const bool do_optimized_assign = optimize_assign<InIt, OutIt>::value;
+   return copy_n_dispatch(first, length, dest, containers_detail::bool_<do_optimized_assign>());
+}
+
+template<class InIt, class FwdIt> inline
+FwdIt uninitialized_copy_n_dispatch
+   (InIt first, 
+    typename std::iterator_traits<InIt>::difference_type count,
+    FwdIt dest, containers_detail::bool_<false>)
+{
+   typedef typename std::iterator_traits<FwdIt>::value_type value_type;
+   //Save initial destination position
+   FwdIt dest_init = dest;
+   typename std::iterator_traits<InIt>::difference_type new_count = count+1;
+
+   BOOST_TRY{
+      //Try to build objects
+      for (; --new_count; ++dest, ++first){
+         construct_in_place(containers_detail::get_pointer(&*dest), first);
+      }
+   }
+   BOOST_CATCH(...){
+      //Call destructors
+      new_count = count - new_count;
+      for (; new_count--; ++dest_init){
+         containers_detail::get_pointer(&*dest_init)->~value_type();
+      }
+      BOOST_RETHROW
+   }
+   BOOST_CATCH_END
+   return dest;
+}
+template<class T> inline
+T *uninitialized_copy_n_dispatch(const T *first, typename std::iterator_traits<const T*>::difference_type length, T *dest, containers_detail::bool_<true>)
+{
+   std::size_t size = length*sizeof(T);
+   return (static_cast<T*>(std::memmove(dest, first, size))) + size;
+}
+
+template<class InIt, class FwdIt> inline
+FwdIt uninitialized_copy_n
+   (InIt first, 
+    typename std::iterator_traits<InIt>::difference_type count,
+    FwdIt dest)
+{
+   const bool do_optimized_copy = optimize_copy<InIt, FwdIt>::value;
+   return uninitialized_copy_n_dispatch(first, count, dest, containers_detail::bool_<do_optimized_copy>());
+}
+
+// uninitialized_copy_copy
+// Copies [first1, last1) into [result, result + (last1 - first1)), and
+// copies [first2, last2) into
+// [result + (last1 - first1), result + (last1 - first1) + (last2 - first2)).
+template <class InpIt1, class InpIt2, class FwdIt>
+FwdIt uninitialized_copy_copy
+   (InpIt1 first1, InpIt1 last1, InpIt2 first2, InpIt2 last2, FwdIt result)
+{
+   typedef typename std::iterator_traits<FwdIt>::value_type value_type;
+   FwdIt mid = std::uninitialized_copy(first1, last1, result);
+   BOOST_TRY {
+      return std::uninitialized_copy(first2, last2, mid);
+   }
+   BOOST_CATCH(...){
+      for(;result != mid; ++result){
+         containers_detail::get_pointer(&*result)->~value_type();
+      }
+      BOOST_RETHROW
+   }
+   BOOST_CATCH_END
+}
+
+}  //namespace container { 
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_ALGORITHMS_HPP
+
Added: sandbox/move/boost/container/detail/allocation_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/allocation_type.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,54 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_ALLOCATION_TYPE_HPP
+#define BOOST_CONTAINERS_ALLOCATION_TYPE_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+namespace boost {
+namespace container {
+
+/// @cond
+enum allocation_type_v
+{   
+   // constants for allocation commands
+   allocate_new_v   = 0x01,
+   expand_fwd_v     = 0x02,
+   expand_bwd_v     = 0x04,
+//   expand_both    = expand_fwd | expand_bwd,
+//   expand_or_new  = allocate_new | expand_both,
+   shrink_in_place_v = 0x08,
+   nothrow_allocation_v = 0x10,
+   zero_memory_v = 0x20,
+   try_shrink_in_place_v = 0x40
+};
+
+typedef int allocation_type;
+/// @endcond
+static const allocation_type allocate_new       = (allocation_type)allocate_new_v;
+static const allocation_type expand_fwd         = (allocation_type)expand_fwd_v;
+static const allocation_type expand_bwd         = (allocation_type)expand_bwd_v;
+static const allocation_type shrink_in_place    = (allocation_type)shrink_in_place_v;
+static const allocation_type try_shrink_in_place= (allocation_type)try_shrink_in_place_v;
+static const allocation_type nothrow_allocation = (allocation_type)nothrow_allocation_v;
+static const allocation_type zero_memory        = (allocation_type)zero_memory_v;
+
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //BOOST_CONTAINERS_ALLOCATION_TYPE_HPP
Added: sandbox/move/boost/container/detail/config_begin.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/config_begin.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,47 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINERS_CONTAINER_DETAIL_CONFIG_INCLUDED
+#define BOOST_CONTAINERS_CONTAINER_DETAIL_CONFIG_INCLUDED
+#include <boost/config.hpp>
+#endif
+
+#ifdef BOOST_MSVC
+   #ifndef _CRT_SECURE_NO_DEPRECATE
+   #define  BOOST_CONTAINERS_DETAIL_CRT_SECURE_NO_DEPRECATE
+   #define _CRT_SECURE_NO_DEPRECATE
+   #endif
+   #pragma warning (push)
+   #pragma warning (disable : 4702) // unreachable code
+   #pragma warning (disable : 4706) // assignment within conditional expression
+   #pragma warning (disable : 4127) // conditional expression is constant
+   #pragma warning (disable : 4146) // unary minus operator applied to unsigned type, result still unsigned
+   #pragma warning (disable : 4284) // odd return type for operator->
+   #pragma warning (disable : 4244) // possible loss of data
+   #pragma warning (disable : 4251) // "identifier" : class "type" needs to have dll-interface to be used by clients of class "type2"
+   #pragma warning (disable : 4267) // conversion from "X" to "Y", possible loss of data
+   #pragma warning (disable : 4275) // non DLL-interface classkey "identifier" used as base for DLL-interface classkey "identifier"
+   #pragma warning (disable : 4355) // "this" : used in base member initializer list
+   #pragma warning (disable : 4503) // "identifier" : decorated name length exceeded, name was truncated
+   #pragma warning (disable : 4511) // copy constructor could not be generated
+   #pragma warning (disable : 4512) // assignment operator could not be generated
+   #pragma warning (disable : 4514) // unreferenced inline removed
+   #pragma warning (disable : 4521) // Disable "multiple copy constructors specified"
+   #pragma warning (disable : 4522) // "class" : multiple assignment operators specified
+   #pragma warning (disable : 4675) // "method" should be declared "static" and have exactly one parameter
+   #pragma warning (disable : 4710) // function not inlined
+   #pragma warning (disable : 4711) // function selected for automatic inline expansion
+   #pragma warning (disable : 4786) // identifier truncated in debug info
+   #pragma warning (disable : 4996) // "function": was declared deprecated
+   #pragma warning (disable : 4197) // top-level volatile in cast is ignored
+   #pragma warning (disable : 4541) // 'typeid' used on polymorphic type 'boost::exception'
+                                    //    with /GR-; unpredictable behavior may result
+   #pragma warning (disable : 4673) //  throwing '' the following types will not be considered at the catch site
+   #pragma warning (disable : 4671) //  the copy constructor is inaccessible
+#endif
Added: sandbox/move/boost/container/detail/config_end.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/config_end.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,17 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#if defined BOOST_MSVC
+   #pragma warning (pop)
+   #ifdef BOOST_CONTAINERS_DETAIL_CRT_SECURE_NO_DEPRECATE
+   #undef BOOST_CONTAINERS_DETAIL_CRT_SECURE_NO_DEPRECATE
+   #undef _CRT_SECURE_NO_DEPRECATE
+   #endif
+#endif
+
Added: sandbox/move/boost/container/detail/destroyers.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/destroyers.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,154 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2009.
+//
+// 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DESTROYERS_HPP
+#define BOOST_CONTAINERS_DESTROYERS_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/version_type.hpp>
+#include <boost/container/detail/utilities.hpp>
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+//!A deleter for scoped_ptr that deallocates the memory
+//!allocated for an array of objects using a STL allocator.
+template <class Allocator>
+struct scoped_array_deallocator
+{
+   typedef typename Allocator::pointer    pointer;
+   typedef typename Allocator::size_type  size_type;
+
+   scoped_array_deallocator(pointer p, Allocator& a, size_type length)
+      : m_ptr(p), m_alloc(a), m_length(length) {}
+
+   ~scoped_array_deallocator()
+   {  if (m_ptr) m_alloc.deallocate(m_ptr, m_length);  }
+
+   void release()
+   {  m_ptr = 0; }
+
+   private:
+   pointer     m_ptr;
+   Allocator&  m_alloc;
+   size_type   m_length;
+};
+
+template <class Allocator>
+struct null_scoped_array_deallocator
+{
+   typedef typename Allocator::pointer    pointer;
+   typedef typename Allocator::size_type  size_type;
+
+   null_scoped_array_deallocator(pointer, Allocator&, size_type)
+   {}
+
+   void release()
+   {}
+};
+
+
+//!A deleter for scoped_ptr that destroys
+//!an object using a STL allocator.
+template <class Allocator>
+struct scoped_destructor_n
+{
+   typedef typename Allocator::pointer    pointer;
+   typedef typename Allocator::value_type value_type;
+   typedef typename Allocator::size_type  size_type;
+
+   pointer     m_p;
+   size_type   m_n;
+
+   scoped_destructor_n(pointer p, size_type n)
+      : m_p(p), m_n(n)
+   {}
+
+   void release()
+   {  m_p = 0; }
+
+   void increment_size(size_type inc)
+   {  m_n += inc;   }
+   
+   ~scoped_destructor_n()
+   {
+      if(!m_p) return;
+      value_type *raw_ptr = containers_detail::get_pointer(m_p);
+      for(std::size_t i = 0; i < m_n; ++i, ++raw_ptr)
+         raw_ptr->~value_type();
+   }
+};
+
+//!A deleter for scoped_ptr that destroys
+//!an object using a STL allocator.
+template <class Allocator>
+struct null_scoped_destructor_n
+{
+   typedef typename Allocator::pointer pointer;
+   typedef typename Allocator::size_type size_type;
+
+   null_scoped_destructor_n(pointer, size_type)
+   {}
+
+   void increment_size(size_type)
+   {}
+
+   void release()
+   {}
+};
+
+template <class A>
+class allocator_destroyer
+{
+   typedef typename A::value_type value_type;
+   typedef containers_detail::integral_constant<unsigned,
+      boost::container::containers_detail::
+         version<A>::value>                           alloc_version;
+   typedef containers_detail::integral_constant<unsigned, 1>     allocator_v1;
+   typedef containers_detail::integral_constant<unsigned, 2>     allocator_v2;
+
+   private:
+   A & a_;
+
+   private:
+   void priv_deallocate(const typename A::pointer &p, allocator_v1)
+   {  a_.deallocate(p, 1); }
+
+   void priv_deallocate(const typename A::pointer &p, allocator_v2)
+   {  a_.deallocate_one(p); }
+
+   public:
+   allocator_destroyer(A &a)
+      :  a_(a)
+   {}
+
+   void operator()(const typename A::pointer &p)
+   {  
+      containers_detail::get_pointer(p)->~value_type();
+      priv_deallocate(p, alloc_version());
+   }
+};
+
+
+}  //namespace containers_detail { 
+}  //namespace container { 
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DESTROYERS_HPP
Added: sandbox/move/boost/container/detail/flat_tree.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/flat_tree.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,833 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+////////////////////////////////////////////////////////////////////////////////
+// The Loki Library
+// Copyright (c) 2001 by Andrei Alexandrescu
+// This code accompanies the book:
+// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design 
+//     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
+// Permission to use, copy, modify, distribute and sell this software 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.
+// The author or Addison-Welsey Longman make no representations about the 
+//     suitability of this software for any purpose. It is provided "as is" 
+//     without express or implied warranty.
+///////////////////////////////////////////////////////////////////////////////
+//
+// Parts of this file come from AssocVector.h file from Loki library
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_FLAT_TREE_HPP
+#define BOOST_CONTAINERS_FLAT_TREE_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <algorithm>
+#include <functional>
+#include <utility>
+
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/move/move.hpp>
+
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/pair.hpp>
+#include <boost/container/vector.hpp>
+#include <boost/container/detail/value_init.hpp>
+#include <boost/container/detail/destroyers.hpp>
+
+namespace boost {
+
+namespace container {
+
+namespace containers_detail {
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+class flat_tree
+{
+   typedef boost::container::vector<Value, Alloc>  vector_t;
+   typedef Alloc                                      allocator_t;
+
+   public:
+   class value_compare
+      : private Compare
+   {
+      typedef Value              first_argument_type;
+      typedef Value              second_argument_type;
+      typedef bool               return_type;
+    public:     
+      value_compare(const Compare &pred) 
+         : Compare(pred)
+      {}
+
+      bool operator()(const Value& lhs, const Value& rhs) const
+      { 
+         KeyOfValue key_extract;
+         return Compare::operator()(key_extract(lhs), key_extract(rhs)); 
+      }
+
+      const Compare &get_comp() const
+         {  return *this;  }
+      
+      Compare &get_comp()
+         {  return *this;  }
+   };
+
+ private:
+   struct Data 
+      //Inherit from value_compare to do EBO
+      : public value_compare
+   {
+     public:
+      Data(const Compare &comp,
+           const vector_t &vect) 
+         : value_compare(comp), m_vect(vect){}
+
+      Data(const value_compare &comp,
+           const vector_t &vect) 
+         : value_compare(comp), m_vect(vect){}
+
+      Data(const Compare &comp,
+           const allocator_t &alloc) 
+         : value_compare(comp), m_vect(alloc){}
+     public:
+      vector_t m_vect;
+   };
+
+   Data m_data;
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(flat_tree)
+
+   typedef typename vector_t::value_type              value_type;
+   typedef typename vector_t::pointer                 pointer;
+   typedef typename vector_t::const_pointer           const_pointer;
+   typedef typename vector_t::reference               reference;
+   typedef typename vector_t::const_reference         const_reference;
+   typedef Key                                        key_type;
+   typedef Compare                                    key_compare;
+   typedef typename vector_t::allocator_type          allocator_type;
+   typedef allocator_type                             stored_allocator_type;
+   typedef typename allocator_type::size_type         size_type;
+   typedef typename allocator_type::difference_type   difference_type;
+   typedef typename vector_t::iterator                iterator;
+   typedef typename vector_t::const_iterator          const_iterator;
+   typedef std::reverse_iterator<iterator>            reverse_iterator;
+   typedef std::reverse_iterator<const_iterator>      const_reverse_iterator;
+   
+
+   // allocation/deallocation
+   flat_tree(const Compare& comp     = Compare(), 
+             const allocator_type& a = allocator_type())
+      : m_data(comp, a)
+   { }
+
+   flat_tree(const flat_tree& x) 
+      :  m_data(x.m_data, x.m_data.m_vect)
+   { }
+
+   flat_tree(BOOST_RV_REF(flat_tree) x)
+      :  m_data(boost::move(x.m_data))
+   { }
+
+   ~flat_tree()
+   { }
+
+   flat_tree&  operator=(const flat_tree& x)
+   {  m_data = x.m_data;   return *this;  }
+
+   flat_tree&  operator=(BOOST_RV_REF(flat_tree) mx)
+   {  m_data = boost::move(mx.m_data); return *this;  }
+
+   public:    
+   // accessors:
+   Compare key_comp() const 
+   { return this->m_data.get_comp(); }
+
+   allocator_type get_allocator() const 
+   { return this->m_data.m_vect.get_allocator(); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   {  return this->m_data.m_vect.get_stored_allocator(); }
+
+   stored_allocator_type &get_stored_allocator()
+   {  return this->m_data.m_vect.get_stored_allocator(); }
+
+   iterator begin() 
+   { return this->m_data.m_vect.begin(); }
+
+   const_iterator begin() const 
+   { return this->cbegin(); }
+
+   const_iterator cbegin() const 
+   { return this->m_data.m_vect.begin(); }
+
+   iterator end() 
+   { return this->m_data.m_vect.end(); }
+
+   const_iterator end() const 
+   { return this->cend(); }
+
+   const_iterator cend() const 
+   { return this->m_data.m_vect.end(); }
+
+   reverse_iterator rbegin() 
+   { return reverse_iterator(this->end()); }
+
+   const_reverse_iterator rbegin() const 
+   {  return this->crbegin();  }
+
+   const_reverse_iterator crbegin() const 
+   {  return const_reverse_iterator(this->cend());  }
+
+   reverse_iterator rend() 
+   { return reverse_iterator(this->begin()); }
+
+   const_reverse_iterator rend() const 
+   { return this->crend(); } 
+
+   const_reverse_iterator crend() const 
+   { return const_reverse_iterator(this->cbegin()); } 
+
+   bool empty() const 
+   { return this->m_data.m_vect.empty(); }
+
+   size_type size() const 
+   { return this->m_data.m_vect.size(); }
+
+   size_type max_size() const 
+   { return this->m_data.m_vect.max_size(); }
+
+   void swap(flat_tree& other) 
+   {
+      value_compare& mycomp    = this->m_data;
+      value_compare& othercomp = other.m_data;
+      containers_detail::do_swap(mycomp, othercomp);
+      vector_t & myvect    = this->m_data.m_vect;
+      vector_t & othervect = other.m_data.m_vect;
+      myvect.swap(othervect);
+   }
+
+   public:
+   // insert/erase
+   std::pair<iterator,bool> insert_unique(const value_type& val)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(val, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, val);
+      }
+      return ret;
+   }
+
+   std::pair<iterator,bool> insert_unique(BOOST_RV_REF(value_type) val)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(val, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, boost::move(val));
+      }
+      return ret;
+   }
+
+
+   iterator insert_equal(const value_type& val)
+   {
+      iterator i = this->upper_bound(KeyOfValue()(val));
+      i = this->m_data.m_vect.insert(i, val);
+      return i;
+   }
+
+   iterator insert_equal(BOOST_RV_REF(value_type) mval)
+   {
+      iterator i = this->upper_bound(KeyOfValue()(mval));
+      i = this->m_data.m_vect.insert(i, boost::move(mval));
+      return i;
+   }
+
+   iterator insert_unique(const_iterator pos, const value_type& val)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(pos, val, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, val);
+      }
+      return ret.first;
+   }
+
+   iterator insert_unique(const_iterator pos, BOOST_RV_REF(value_type) mval)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(pos, mval, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, boost::move(mval));
+      }
+      return ret.first;
+   }
+
+   iterator insert_equal(const_iterator pos, const value_type& val)
+   {
+      insert_commit_data data;
+      priv_insert_equal_prepare(pos, val, data);
+      return priv_insert_commit(data, val);
+   }
+
+   iterator insert_equal(const_iterator pos, BOOST_RV_REF(value_type) mval)
+   {
+      insert_commit_data data;
+      priv_insert_equal_prepare(pos, mval, data);
+      return priv_insert_commit(data, boost::move(mval));
+   }
+
+   template <class InIt>
+   void insert_unique(InIt first, InIt last)
+   {
+      for ( ; first != last; ++first)
+         this->insert_unique(*first);
+   }
+
+   template <class InIt>
+   void insert_equal(InIt first, InIt last)
+   {
+      typedef typename 
+         std::iterator_traits<InIt>::iterator_category ItCat;
+      priv_insert_equal(first, last, ItCat());
+   }
+
+   #ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template <class... Args>
+   iterator emplace_unique(Args&&... args)
+   {
+      value_type val(boost::forward<Args>(args)...);
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         priv_insert_unique_prepare(val, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, boost::move<value_type>(val));
+      }
+      return ret.first;
+   }
+
+   template <class... Args>
+   iterator emplace_hint_unique(const_iterator hint, Args&&... args)
+   {
+      value_type val(boost::forward<Args>(args)...);
+      insert_commit_data data;
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(hint, val, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, boost::move<value_type>(val));
+      }
+      return ret.first;
+   }
+
+   template <class... Args>
+   iterator emplace_equal(Args&&... args)
+   {
+      value_type val(boost::forward<Args>(args)...);
+      iterator i = this->upper_bound(KeyOfValue()(val));
+      i = this->m_data.m_vect.insert(i, boost::move<value_type>(val));
+      return i;
+   }
+
+   template <class... Args>
+   iterator emplace_hint_equal(const_iterator hint, Args&&... args)
+   {
+      value_type val(boost::forward<Args>(args)...);
+      insert_commit_data data;
+      priv_insert_equal_prepare(hint, val, data);
+      return priv_insert_commit(data, boost::move<value_type>(val));
+   }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace_unique()
+   {
+      containers_detail::value_init<value_type> vval;
+      value_type &val = vval.m_t;
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         priv_insert_unique_prepare(val, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, boost::move<value_type>(val));
+      }
+      return ret.first;
+   }
+
+   iterator emplace_hint_unique(const_iterator hint)
+   {
+      containers_detail::value_init<value_type> vval;
+      value_type &val = vval.m_t;
+      insert_commit_data data;
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(hint, val, data);
+      if(ret.second){
+         ret.first = priv_insert_commit(data, boost::move<value_type>(val));
+      }
+      return ret.first;
+   }
+
+   iterator emplace_equal()
+   {
+      containers_detail::value_init<value_type> vval;
+      value_type &val = vval.m_t;
+      iterator i = this->upper_bound(KeyOfValue()(val));
+      i = this->m_data.m_vect.insert(i, boost::move<value_type>(val));
+      return i;
+   }
+
+   iterator emplace_hint_equal(const_iterator hint)
+   {
+      containers_detail::value_init<value_type> vval;
+      value_type &val = vval.m_t;
+      insert_commit_data data;
+      priv_insert_equal_prepare(hint, val, data);
+      return priv_insert_commit(data, boost::move<value_type>(val));
+   }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                        \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                             \
+   iterator emplace_unique(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))         \
+   {                                                                                      \
+      value_type val(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));           \
+      insert_commit_data data;                                                            \
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(val, data);               \
+      if(ret.second){                                                                     \
+         ret.first = priv_insert_commit(data, boost::move<value_type>(val));        \
+      }                                                                                   \
+      return ret.first;                                                                   \
+   }                                                                                      \
+                                                                                          \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                             \
+   iterator emplace_hint_unique(const_iterator hint,                                      \
+      BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                              \
+   {                                                                                      \
+      value_type val(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));           \
+      insert_commit_data data;                                                            \
+      std::pair<iterator,bool> ret = priv_insert_unique_prepare(hint, val, data);         \
+      if(ret.second){                                                                     \
+         ret.first = priv_insert_commit(data, boost::move<value_type>(val));        \
+      }                                                                                   \
+      return ret.first;                                                                   \
+   }                                                                                      \
+                                                                                          \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                             \
+   iterator emplace_equal(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))          \
+   {                                                                                      \
+      value_type val(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));           \
+      iterator i = this->upper_bound(KeyOfValue()(val));                                  \
+      i = this->m_data.m_vect.insert(i, boost::move<value_type>(val));              \
+      return i;                                                                           \
+   }                                                                                      \
+                                                                                          \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                             \
+   iterator emplace_hint_equal(const_iterator hint,                                       \
+      BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                              \
+   {                                                                                      \
+      value_type val(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));           \
+      insert_commit_data data;                                                            \
+      priv_insert_equal_prepare(hint, val, data);                                         \
+      return priv_insert_commit(data, boost::move<value_type>(val));                \
+   }                                                                                      \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator erase(const_iterator position)
+   {  return this->m_data.m_vect.erase(position);  }
+
+   size_type erase(const key_type& k)
+   {
+      std::pair<iterator,iterator > itp = this->equal_range(k);
+      size_type ret = static_cast<size_type>(itp.second-itp.first);
+      if (ret){
+         this->m_data.m_vect.erase(itp.first, itp.second);
+      }
+      return ret;
+   }
+
+   iterator erase(const_iterator first, const_iterator last)
+   {  return this->m_data.m_vect.erase(first, last);  }
+
+   void clear()
+   {  this->m_data.m_vect.clear();  }
+
+   //! <b>Effects</b>: Tries to deallocate the excess of memory created
+   //    with previous allocations. The size of the vector is unchanged
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to size().
+   void shrink_to_fit()
+   {  this->m_data.m_vect.shrink_to_fit();  }
+
+   // set operations:
+   iterator find(const key_type& k)
+   {
+      const Compare &key_comp = this->m_data.get_comp();
+      iterator i = this->lower_bound(k);
+
+      if (i != this->end() && key_comp(k, KeyOfValue()(*i))){  
+         i = this->end();  
+      }
+      return i;
+   }
+
+   const_iterator find(const key_type& k) const
+   {
+      const Compare &key_comp = this->m_data.get_comp();
+      const_iterator i = this->lower_bound(k);
+
+      if (i != this->end() && key_comp(k, KeyOfValue()(*i))){  
+         i = this->end();  
+      }
+      return i;
+   }
+
+   size_type count(const key_type& k) const
+   {
+      std::pair<const_iterator, const_iterator> p = this->equal_range(k);
+      size_type n = p.second - p.first;
+      return n;
+   }
+
+   iterator lower_bound(const key_type& k)
+   {  return this->priv_lower_bound(this->begin(), this->end(), k);  }
+
+   const_iterator lower_bound(const key_type& k) const
+   {  return this->priv_lower_bound(this->begin(), this->end(), k);  }
+
+   iterator upper_bound(const key_type& k)
+   {  return this->priv_upper_bound(this->begin(), this->end(), k);  }
+
+   const_iterator upper_bound(const key_type& k) const
+   {  return this->priv_upper_bound(this->begin(), this->end(), k);  }
+
+   std::pair<iterator,iterator> equal_range(const key_type& k)
+   {  return this->priv_equal_range(this->begin(), this->end(), k);  }
+
+   std::pair<const_iterator, const_iterator> equal_range(const key_type& k) const
+   {  return this->priv_equal_range(this->begin(), this->end(), k);  }
+
+   size_type capacity() const           
+   { return this->m_data.m_vect.capacity(); }
+
+   void reserve(size_type count)       
+   { this->m_data.m_vect.reserve(count);   }
+
+   private:
+   struct insert_commit_data
+   {
+      const_iterator position;
+   };
+
+   // insert/erase
+   void priv_insert_equal_prepare
+      (const_iterator pos, const value_type& val, insert_commit_data &data)
+   {
+      // N1780
+      //   To insert val at pos:
+      //   if pos == end || val <= *pos
+      //      if pos == begin || val >= *(pos-1)
+      //         insert val before pos
+      //      else
+      //         insert val before upper_bound(val)
+      //   else if pos+1 == end || val <= *(pos+1)
+      //      insert val after pos
+      //   else
+      //      insert val before lower_bound(val)
+      const value_compare &value_comp = this->m_data;
+
+      if(pos == this->cend() || !value_comp(*pos, val)){
+         if (pos == this->cbegin() || !value_comp(val, pos[-1])){
+            data.position = pos;
+         }
+         else{
+            data.position = 
+               this->priv_upper_bound(this->cbegin(), pos, KeyOfValue()(val));
+         }
+      }
+      //Works, but increases code complexity
+      //else if (++pos == this->end() || !value_comp(*pos, val)){
+      //   return this->m_data.m_vect.insert(pos, val);
+      //}
+      else{
+         data.position = 
+            this->priv_lower_bound(pos, this->cend(), KeyOfValue()(val));
+      }
+   }
+
+   std::pair<iterator,bool> priv_insert_unique_prepare
+      (const_iterator beg, const_iterator end, const value_type& val, insert_commit_data &commit_data)
+   {
+      const value_compare &value_comp  = this->m_data;
+      commit_data.position = this->priv_lower_bound(beg, end, KeyOfValue()(val));
+      return std::pair<iterator,bool>
+         ( *reinterpret_cast<iterator*>(&commit_data.position)
+         , commit_data.position == end || value_comp(val, *commit_data.position));
+   }
+
+   std::pair<iterator,bool> priv_insert_unique_prepare
+      (const value_type& val, insert_commit_data &commit_data)
+   {  return priv_insert_unique_prepare(this->begin(), this->end(), val, commit_data);   }
+
+   std::pair<iterator,bool> priv_insert_unique_prepare
+      (const_iterator pos, const value_type& val, insert_commit_data &commit_data)
+   {
+      //N1780. Props to Howard Hinnant!
+      //To insert val at pos:
+      //if pos == end || val <= *pos
+      //   if pos == begin || val >= *(pos-1)
+      //      insert val before pos
+      //   else
+      //      insert val before upper_bound(val)
+      //else if pos+1 == end || val <= *(pos+1)
+      //   insert val after pos
+      //else
+      //   insert val before lower_bound(val)
+      const value_compare &value_comp = this->m_data;
+
+      if(pos == this->cend() || value_comp(val, *pos)){
+         if(pos != this->cbegin() && !value_comp(val, pos[-1])){
+            if(value_comp(pos[-1], val)){
+               commit_data.position = pos;
+               return std::pair<iterator,bool>(*reinterpret_cast<iterator*>(&pos), true);
+            }
+            else{
+               return std::pair<iterator,bool>(*reinterpret_cast<iterator*>(&pos), false);
+            }
+         }
+         return this->priv_insert_unique_prepare(this->cbegin(), pos, val, commit_data);
+      }
+
+      // Works, but increases code complexity
+      //Next check
+      //else if (value_comp(*pos, val) && !value_comp(pos[1], val)){
+      //   if(value_comp(val, pos[1])){
+      //      commit_data.position = pos+1;
+      //      return std::pair<iterator,bool>(pos+1, true);
+      //   }
+      //   else{
+      //      return std::pair<iterator,bool>(pos+1, false);
+      //   }
+      //}
+      else{
+         //[... pos ... val ... ]
+         //The hint is before the insertion position, so insert it
+         //in the remaining range
+         return this->priv_insert_unique_prepare(pos, this->end(), val, commit_data);
+      }
+   }
+
+   template<class Convertible>
+   iterator priv_insert_commit
+      (insert_commit_data &commit_data, BOOST_FWD_REF(Convertible) convertible)
+   {
+      return this->m_data.m_vect.insert
+         ( commit_data.position
+         , boost::forward<Convertible>(convertible));
+   }
+
+   template <class RanIt>
+   RanIt priv_lower_bound(RanIt first, RanIt last,
+                          const key_type & key) const
+   {
+      const Compare &key_comp = this->m_data.get_comp();
+      KeyOfValue key_extract;
+      difference_type len = last - first, half;
+      RanIt middle;
+
+      while (len > 0) {
+         half = len >> 1;
+         middle = first;
+         middle += half;
+
+         if (key_comp(key_extract(*middle), key)) {
+            ++middle;
+            first = middle;
+            len = len - half - 1;
+         }
+         else
+            len = half;
+      }
+      return first;
+   }
+
+   template <class RanIt>
+   RanIt priv_upper_bound(RanIt first, RanIt last,
+                          const key_type & key) const
+   {
+      const Compare &key_comp = this->m_data.get_comp();
+      KeyOfValue key_extract;
+      difference_type len = last - first, half;
+      RanIt middle;
+
+      while (len > 0) {
+         half = len >> 1;
+         middle = first;
+         middle += half;
+
+         if (key_comp(key, key_extract(*middle))) {
+            len = half;
+         }
+         else{
+            first = ++middle;
+            len = len - half - 1;  
+         }
+      }
+      return first;
+   }
+
+   template <class RanIt>
+   std::pair<RanIt, RanIt>
+      priv_equal_range(RanIt first, RanIt last, const key_type& key) const
+   {
+      const Compare &key_comp = this->m_data.get_comp();
+      KeyOfValue key_extract;
+      difference_type len = last - first, half;
+      RanIt middle, left, right;
+
+      while (len > 0) {
+         half = len >> 1;
+         middle = first;
+         middle += half;
+
+         if (key_comp(key_extract(*middle), key)){
+            first = middle;
+            ++first;
+            len = len - half - 1;
+         }
+         else if (key_comp(key, key_extract(*middle))){
+            len = half;
+         }
+         else {
+            left = this->priv_lower_bound(first, middle, key);
+            first += len;
+            right = this->priv_upper_bound(++middle, first, key);
+            return std::pair<RanIt, RanIt>(left, right);
+         }
+      }
+      return std::pair<RanIt, RanIt>(first, first);
+   }
+
+   template <class FwdIt>
+   void priv_insert_equal(FwdIt first, FwdIt last, std::forward_iterator_tag)
+   {
+      size_type len = static_cast<size_type>(std::distance(first, last));
+      this->reserve(this->size()+len);
+      this->priv_insert_equal(first, last, std::input_iterator_tag());
+   }
+
+   template <class InIt>
+   void priv_insert_equal(InIt first, InIt last, std::input_iterator_tag)
+   {
+      for ( ; first != last; ++first)
+         this->insert_equal(*first);
+   }
+
+/*
+   template <class FwdIt>
+   void priv_insert_unique(FwdIt first, FwdIt last, std::forward_iterator_tag)
+   {
+      size_type len = static_cast<size_type>(std::distance(first, last));
+      this->reserve(this->size()+len);
+      priv_insert_unique(first, last, std::input_iterator_tag());
+   }
+
+   template <class InIt>
+   void priv_insert_unique(InIt first, InIt last, std::input_iterator_tag)
+   {
+      for ( ; first != last; ++first)
+         this->insert_unique(*first);
+   }
+*/
+};
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+inline bool 
+operator==(const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& x, 
+           const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& y)
+{
+  return x.size() == y.size() &&
+         std::equal(x.begin(), x.end(), y.begin());
+}
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+inline bool 
+operator<(const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& x, 
+          const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& y)
+{
+  return std::lexicographical_compare(x.begin(), x.end(), 
+                                      y.begin(), y.end());
+}
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+inline bool 
+operator!=(const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& x, 
+           const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& y) 
+   {  return !(x == y); }
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+inline bool 
+operator>(const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& x, 
+          const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& y) 
+   {  return y < x;  }
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+inline bool 
+operator<=(const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& x, 
+           const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& y) 
+   {  return !(y < x);  }
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+inline bool 
+operator>=(const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& x, 
+           const flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& y) 
+   {  return !(x < y);  }
+
+
+template <class Key, class Value, class KeyOfValue, 
+          class Compare, class Alloc>
+inline void 
+swap(flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& x, 
+     flat_tree<Key,Value,KeyOfValue,Compare,Alloc>& y)
+   {  x.swap(y);  }
+
+}  //namespace containers_detail {
+
+}  //namespace container {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class K, class V, class KOV, 
+class C, class A>
+struct has_trivial_destructor_after_move<boost::container::containers_detail::flat_tree<K, V, KOV, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif // BOOST_CONTAINERS_FLAT_TREE_HPP
Added: sandbox/move/boost/container/detail/iterators.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/iterators.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,492 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008.
+// (C) Copyright Gennaro Prota 2003 - 2004.
+//
+// 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_ITERATORS_HPP
+#define BOOST_CONTAINERS_DETAIL_ITERATORS_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/move/move.hpp>
+
+#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+#include <boost/container/detail/variadic_templates_tools.hpp>
+#else
+#include <boost/container/detail/preprocessor.hpp>
+#endif
+
+#include <iterator>
+
+namespace boost {
+namespace container { 
+
+template <class T, class Difference = std::ptrdiff_t>
+class constant_iterator
+  : public std::iterator
+      <std::random_access_iterator_tag, T, Difference, const T*, const T &>
+{
+   typedef  constant_iterator<T, Difference> this_type;
+
+   public:
+   explicit constant_iterator(const T &ref, Difference range_size)
+      :  m_ptr(&ref), m_num(range_size){}
+
+   //Constructors
+   constant_iterator()
+      :  m_ptr(0), m_num(0){}
+
+   constant_iterator& operator++() 
+   { increment();   return *this;   }
+   
+   constant_iterator operator++(int)
+   {
+      constant_iterator result (*this);
+      increment();
+      return result;
+   }
+
+   friend bool operator== (const constant_iterator& i, const constant_iterator& i2)
+   { return i.equal(i2); }
+
+   friend bool operator!= (const constant_iterator& i, const constant_iterator& i2)
+   { return !(i == i2); }
+
+   friend bool operator< (const constant_iterator& i, const constant_iterator& i2)
+   { return i.less(i2); }
+
+   friend bool operator> (const constant_iterator& i, const constant_iterator& i2)
+   { return i2 < i; }
+
+   friend bool operator<= (const constant_iterator& i, const constant_iterator& i2)
+   { return !(i > i2); }
+
+   friend bool operator>= (const constant_iterator& i, const constant_iterator& i2)
+   { return !(i < i2); }
+
+   friend Difference operator- (const constant_iterator& i, const constant_iterator& i2)
+   { return i2.distance_to(i); }
+
+   //Arithmetic
+   constant_iterator& operator+=(Difference off)
+   {  this->advance(off); return *this;   }
+
+   constant_iterator operator+(Difference off) const
+   {
+      constant_iterator other(*this);
+      other.advance(off);
+      return other;
+   }
+
+   friend constant_iterator operator+(Difference off, const constant_iterator& right)
+   {  return right + off; }
+
+   constant_iterator& operator-=(Difference off)
+   {  this->advance(-off); return *this;   }
+
+   constant_iterator operator-(Difference off) const
+   {  return *this + (-off);  }
+
+   const T& operator*() const
+   { return dereference(); }
+
+   const T* operator->() const
+   { return &(dereference()); }
+
+   private:
+   const T *   m_ptr;
+   Difference  m_num;
+
+   void increment()
+   { --m_num; }
+
+   void decrement()
+   { ++m_num; }
+
+   bool equal(const this_type &other) const
+   {  return m_num == other.m_num;   }
+
+   bool less(const this_type &other) const
+   {  return other.m_num < m_num;   }
+
+   const T & dereference() const
+   { return *m_ptr; }
+
+   void advance(Difference n)
+   {  m_num -= n; }
+
+   Difference distance_to(const this_type &other)const
+   {  return m_num - other.m_num;   }
+};
+
+template <class T, class Difference = std::ptrdiff_t>
+class default_construct_iterator
+  : public std::iterator
+      <std::random_access_iterator_tag, T, Difference, const T*, const T &>
+{
+   typedef  default_construct_iterator<T, Difference> this_type;
+
+   public:
+   explicit default_construct_iterator(Difference range_size)
+      :  m_num(range_size){}
+
+   //Constructors
+   default_construct_iterator()
+      :  m_num(0){}
+
+   default_construct_iterator& operator++() 
+   { increment();   return *this;   }
+   
+   default_construct_iterator operator++(int)
+   {
+      default_construct_iterator result (*this);
+      increment();
+      return result;
+   }
+
+   friend bool operator== (const default_construct_iterator& i, const default_construct_iterator& i2)
+   { return i.equal(i2); }
+
+   friend bool operator!= (const default_construct_iterator& i, const default_construct_iterator& i2)
+   { return !(i == i2); }
+
+   friend bool operator< (const default_construct_iterator& i, const default_construct_iterator& i2)
+   { return i.less(i2); }
+
+   friend bool operator> (const default_construct_iterator& i, const default_construct_iterator& i2)
+   { return i2 < i; }
+
+   friend bool operator<= (const default_construct_iterator& i, const default_construct_iterator& i2)
+   { return !(i > i2); }
+
+   friend bool operator>= (const default_construct_iterator& i, const default_construct_iterator& i2)
+   { return !(i < i2); }
+
+   friend Difference operator- (const default_construct_iterator& i, const default_construct_iterator& i2)
+   { return i2.distance_to(i); }
+
+   //Arithmetic
+   default_construct_iterator& operator+=(Difference off)
+   {  this->advance(off); return *this;   }
+
+   default_construct_iterator operator+(Difference off) const
+   {
+      default_construct_iterator other(*this);
+      other.advance(off);
+      return other;
+   }
+
+   friend default_construct_iterator operator+(Difference off, const default_construct_iterator& right)
+   {  return right + off; }
+
+   default_construct_iterator& operator-=(Difference off)
+   {  this->advance(-off); return *this;   }
+
+   default_construct_iterator operator-(Difference off) const
+   {  return *this + (-off);  }
+
+   const T& operator*() const
+   { return dereference(); }
+
+   const T* operator->() const
+   { return &(dereference()); }
+
+   private:
+   Difference  m_num;
+
+   void increment()
+   { --m_num; }
+
+   void decrement()
+   { ++m_num; }
+
+   bool equal(const this_type &other) const
+   {  return m_num == other.m_num;   }
+
+   bool less(const this_type &other) const
+   {  return other.m_num < m_num;   }
+
+   const T & dereference() const
+   { 
+      static T dummy;
+      return dummy;
+   }
+
+   void advance(Difference n)
+   {  m_num -= n; }
+
+   Difference distance_to(const this_type &other)const
+   {  return m_num - other.m_num;   }
+};
+
+template <class T, class Difference = std::ptrdiff_t>
+class repeat_iterator
+  : public std::iterator
+      <std::random_access_iterator_tag, T, Difference>
+{
+   typedef repeat_iterator<T, Difference> this_type;
+   public:
+   explicit repeat_iterator(T &ref, Difference range_size)
+      :  m_ptr(&ref), m_num(range_size){}
+
+   //Constructors
+   repeat_iterator()
+      :  m_ptr(0), m_num(0){}
+
+   this_type& operator++() 
+   { increment();   return *this;   }
+   
+   this_type operator++(int)
+   {
+      this_type result (*this);
+      increment();
+      return result;
+   }
+
+   friend bool operator== (const this_type& i, const this_type& i2)
+   { return i.equal(i2); }
+
+   friend bool operator!= (const this_type& i, const this_type& i2)
+   { return !(i == i2); }
+
+   friend bool operator< (const this_type& i, const this_type& i2)
+   { return i.less(i2); }
+
+   friend bool operator> (const this_type& i, const this_type& i2)
+   { return i2 < i; }
+
+   friend bool operator<= (const this_type& i, const this_type& i2)
+   { return !(i > i2); }
+
+   friend bool operator>= (const this_type& i, const this_type& i2)
+   { return !(i < i2); }
+
+   friend Difference operator- (const this_type& i, const this_type& i2)
+   { return i2.distance_to(i); }
+
+   //Arithmetic
+   this_type& operator+=(Difference off)
+   {  this->advance(off); return *this;   }
+
+   this_type operator+(Difference off) const
+   {
+      this_type other(*this);
+      other.advance(off);
+      return other;
+   }
+
+   friend this_type operator+(Difference off, const this_type& right)
+   {  return right + off; }
+
+   this_type& operator-=(Difference off)
+   {  this->advance(-off); return *this;   }
+
+   this_type operator-(Difference off) const
+   {  return *this + (-off);  }
+
+   T& operator*() const
+   { return dereference(); }
+
+   T *operator->() const
+   { return &(dereference()); }
+
+   private:
+   T *         m_ptr;
+   Difference  m_num;
+
+   void increment()
+   { --m_num; }
+
+   void decrement()
+   { ++m_num; }
+
+   bool equal(const this_type &other) const
+   {  return m_num == other.m_num;   }
+
+   bool less(const this_type &other) const
+   {  return other.m_num < m_num;   }
+
+   T & dereference() const
+   { return *m_ptr; }
+
+   void advance(Difference n)
+   {  m_num -= n; }
+
+   Difference distance_to(const this_type &other)const
+   {  return m_num - other.m_num;   }
+};
+
+template <class T, class E>
+class emplace_iterator
+  : public std::iterator
+      <std::random_access_iterator_tag, T, std::ptrdiff_t, const T*, const T &>
+{
+   typedef emplace_iterator this_type;
+
+   public:
+   explicit emplace_iterator(E&e)
+      :  m_num(1), m_pe(&e){}
+
+   emplace_iterator()
+      :  m_num(0), m_pe(0){}
+
+   this_type& operator++() 
+   { increment();   return *this;   }
+   
+   this_type operator++(int)
+   {
+      this_type result (*this);
+      increment();
+      return result;
+   }
+
+   friend bool operator== (const this_type& i, const this_type& i2)
+   { return i.equal(i2); }
+
+   friend bool operator!= (const this_type& i, const this_type& i2)
+   { return !(i == i2); }
+
+   friend bool operator< (const this_type& i, const this_type& i2)
+   { return i.less(i2); }
+
+   friend bool operator> (const this_type& i, const this_type& i2)
+   { return i2 < i; }
+
+   friend bool operator<= (const this_type& i, const this_type& i2)
+   { return !(i > i2); }
+
+   friend bool operator>= (const this_type& i, const this_type& i2)
+   { return !(i < i2); }
+
+   friend std::ptrdiff_t operator- (const this_type& i, const this_type& i2)
+   { return i2.distance_to(i); }
+
+   //Arithmetic
+   this_type& operator+=(std::ptrdiff_t off)
+   {  this->advance(off); return *this;   }
+
+   this_type operator+(std::ptrdiff_t off) const
+   {
+      this_type other(*this);
+      other.advance(off);
+      return other;
+   }
+
+   friend this_type operator+(std::ptrdiff_t off, const this_type& right)
+   {  return right + off; }
+
+   this_type& operator-=(std::ptrdiff_t off)
+   {  this->advance(-off); return *this;   }
+
+   this_type operator-(std::ptrdiff_t off) const
+   {  return *this + (-off);  }
+
+   const T& operator*() const
+   { return dereference(); }
+
+   const T* operator->() const
+   { return &(dereference()); }
+
+   void construct_in_place(T* ptr)
+   {  (*m_pe)(ptr);  }
+
+   private:
+   std::ptrdiff_t m_num;
+   E *            m_pe;
+
+   void increment()
+   { --m_num; }
+
+   void decrement()
+   { ++m_num; }
+
+   bool equal(const this_type &other) const
+   {  return m_num == other.m_num;   }
+
+   bool less(const this_type &other) const
+   {  return other.m_num < m_num;   }
+
+   const T & dereference() const
+   { 
+      static T dummy;
+      return dummy;
+   }
+
+   void advance(std::ptrdiff_t n)
+   {  m_num -= n; }
+
+   std::ptrdiff_t distance_to(const this_type &other)const
+   {  return m_num - other.m_num;   }
+};
+
+#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+template<class T, class ...Args>
+struct emplace_functor
+{
+   typedef typename containers_detail::build_number_seq<sizeof...(Args)>::type index_tuple_t;
+
+   emplace_functor(Args&&... args)
+      : args_(args...)
+   {}
+
+   void operator()(T *ptr)
+   {  emplace_functor::inplace_impl(ptr, index_tuple_t());  }
+
+   template<int ...IdxPack>
+   void inplace_impl(T* ptr, const containers_detail::index_tuple<IdxPack...>&)
+   {  ::new(ptr) T(boost::forward<Args>(containers_detail::get<IdxPack>(args_))...); }
+
+   containers_detail::tuple<Args&&...> args_;
+};
+
+#else
+
+template<class T>
+struct emplace_functor
+{
+   emplace_functor()
+   {}
+   void operator()(T *ptr)
+   {  new(ptr) T();  }
+};
+
+#define BOOST_PP_LOCAL_MACRO(n)                                                        \
+   template <class T, BOOST_PP_ENUM_PARAMS(n, class P) >                               \
+   struct BOOST_PP_CAT(BOOST_PP_CAT(emplace_functor, n), arg)                          \
+   {                                                                                   \
+      BOOST_PP_CAT(BOOST_PP_CAT(emplace_functor, n), arg)                              \
+         ( BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _) )                       \
+      :  BOOST_PP_ENUM(n, BOOST_CONTAINERS_AUX_PARAM_INIT, _) {}                       \
+                                                                                       \
+      void operator()(T *ptr)                                                          \
+      {                                                                                \
+         new(ptr)T (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_MEMBER_FORWARD, _));          \
+      }                                                                                \
+      BOOST_PP_REPEAT(n, BOOST_CONTAINERS_AUX_PARAM_DEFINE, _)                         \
+   };                                                                                  \
+   //!
+#define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+#include BOOST_PP_LOCAL_ITERATE()
+
+#endif
+
+}  //namespace container { 
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_ITERATORS_HPP
+
Added: sandbox/move/boost/container/detail/mpl.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/mpl.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,152 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008.
+//
+// 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_CONTAINER_DETAIL_MPL_HPP
+#define BOOST_CONTAINERS_CONTAINER_DETAIL_MPL_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <cstddef>
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+template <class T, T val>
+struct integral_constant
+{
+   static const T value = val;
+   typedef integral_constant<T,val> type;
+};
+
+template< bool C_ >
+struct bool_ : integral_constant<bool, C_>
+{
+   static const bool value = C_;
+};
+
+typedef bool_<true>        true_;
+typedef bool_<false>       false_;
+
+typedef true_  true_type;
+typedef false_ false_type;
+
+typedef char yes_type;
+struct no_type
+{
+   char padding[8];
+};
+
+template <bool B, class T = void>
+struct enable_if_c {
+  typedef T type;
+};
+
+template <class T>
+struct enable_if_c<false, T> {};
+
+template <class Cond, class T = void>
+struct enable_if : public enable_if_c<Cond::value, T> {};
+
+template <class Cond, class T = void>
+struct disable_if : public enable_if_c<!Cond::value, T> {};
+
+template <class T, class U>
+class is_convertible
+{
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   static true_t dispatch(U);
+   static false_t dispatch(...);
+   static T trigger();
+   public:
+   enum { value = sizeof(dispatch(trigger())) == sizeof(true_t) };
+};
+
+template<
+      bool C
+    , typename T1
+    , typename T2
+    >
+struct if_c
+{
+    typedef T1 type;
+};
+
+template<
+      typename T1
+    , typename T2
+    >
+struct if_c<false,T1,T2>
+{
+    typedef T2 type;
+};
+
+template<
+      typename T1
+    , typename T2
+    , typename T3
+    >
+struct if_
+{
+   typedef typename if_c<0 != T1::value, T2, T3>::type type;
+};
+
+
+template <class Pair>
+struct select1st 
+//   : public std::unary_function<Pair, typename Pair::first_type> 
+{
+   template<class OtherPair>
+   const typename Pair::first_type& operator()(const OtherPair& x) const 
+   {  return x.first;   }
+
+   const typename Pair::first_type& operator()(const typename Pair::first_type& x) const 
+   {  return x;   }
+};
+
+// identity is an extension: it is not part of the standard.
+template <class T>
+struct identity 
+//   : public std::unary_function<T,T> 
+{
+   typedef T type;
+   const T& operator()(const T& x) const 
+   { return x; }
+};
+
+template<std::size_t S>
+struct ls_zeros
+{
+   static const std::size_t value = (S & std::size_t(1)) ? 0 : (1u + ls_zeros<(S >> 1u)>::value);
+};
+
+template<>
+struct ls_zeros<0>
+{
+   static const std::size_t value = 0;
+};
+
+template<>
+struct ls_zeros<1>
+{
+   static const std::size_t value = 0;
+};
+
+}  //namespace containers_detail { 
+}  //namespace container { 
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINERS_CONTAINER_DETAIL_MPL_HPP
+
Added: sandbox/move/boost/container/detail/multiallocation_chain.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/multiallocation_chain.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,554 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_MULTIALLOCATION_CHAIN_HPP
+#define BOOST_CONTAINERS_DETAIL_MULTIALLOCATION_CHAIN_HPP
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/type_traits.hpp>
+#include <boost/container/detail/transform_iterator.hpp>
+
+namespace boost {
+namespace container {
+namespace containers_detail {
+
+template<class VoidPointer>
+class basic_multiallocation_slist
+{
+public:
+   typedef VoidPointer                                   void_pointer;
+
+private:
+   static VoidPointer &priv_get_ref(const VoidPointer &p)
+   {  return *static_cast<void_pointer*>(containers_detail::get_pointer(p));  }
+
+   basic_multiallocation_slist(basic_multiallocation_slist &);
+   basic_multiallocation_slist &operator=(basic_multiallocation_slist &);
+
+public:
+   BOOST_ENABLE_MOVE_EMULATION(basic_multiallocation_slist)
+
+      //!This iterator is returned by "allocate_many" functions so that
+      //!the user can access the multiple buffers allocated in a single call
+   class iterator
+      :  public std::iterator<std::input_iterator_tag, char>
+   {
+      friend class basic_multiallocation_slist<void_pointer>;
+      void unspecified_bool_type_func() const {}
+      typedef void (iterator::*unspecified_bool_type)() const;
+
+      iterator(void_pointer node_range)
+         : next_node_(node_range)
+      {}
+
+   public:
+      typedef char         value_type;
+      typedef value_type & reference;
+      typedef value_type * pointer;
+
+      iterator()
+         : next_node_(0)
+      {}
+
+      iterator &operator=(const iterator &other)
+      {  next_node_ = other.next_node_;  return *this;  }
+
+   public:
+      iterator& operator++() 
+      {
+         next_node_ = *static_cast<void_pointer*>(containers_detail::get_pointer(next_node_));
+         return *this;
+      }
+
+      iterator operator++(int)
+      {
+         iterator result(*this);
+         ++*this;
+         return result;
+      }
+
+      bool operator== (const iterator& other) const
+      { return next_node_ == other.next_node_; }
+
+      bool operator!= (const iterator& other) const
+      { return !operator== (other); }
+
+      reference operator*() const
+      {  return *static_cast<char*>(containers_detail::get_pointer(next_node_)); }
+
+      operator unspecified_bool_type() const  
+      {  return next_node_? &iterator::unspecified_bool_type_func : 0;   }
+
+      pointer operator->() const
+      { return &(*(*this)); }
+
+   private:
+      void_pointer next_node_;
+   };
+
+private:
+   iterator it_;
+
+public:
+   basic_multiallocation_slist()
+      :  it_(iterator())
+   {}
+
+   basic_multiallocation_slist(void_pointer p)
+      :  it_(p ? iterator_to(p) : iterator())
+   {}
+
+   basic_multiallocation_slist(BOOST_RV_REF(basic_multiallocation_slist) other)
+      :  it_(iterator())
+   {  this->swap(other); }
+
+   basic_multiallocation_slist& operator=(BOOST_RV_REF(basic_multiallocation_slist) other)
+   {
+      basic_multiallocation_slist tmp(boost::move(other));
+      this->swap(tmp);
+      return *this;
+   }
+
+   bool empty() const
+   {  return !it_; }
+
+   iterator before_begin() const
+   {  return iterator(void_pointer(const_cast<void*>(static_cast<const void*>(&it_.next_node_)))); }
+
+   iterator begin() const
+   {  return it_; }
+
+   iterator end() const
+   {  return iterator();  }
+
+   void clear()
+   {  this->it_.next_node_ = void_pointer(0); }
+
+   iterator insert_after(iterator it, void_pointer m)
+   {
+      priv_get_ref(m) = priv_get_ref(it.next_node_);
+      priv_get_ref(it.next_node_) = m;
+      return iterator(m);
+   }
+
+   void push_front(void_pointer m)
+   {
+      priv_get_ref(m) = this->it_.next_node_;
+      this->it_.next_node_ = m;
+   }
+
+   void pop_front()
+   {  ++it_; }
+
+   void *front() const
+   {  return containers_detail::get_pointer(it_.next_node_); }
+
+   void splice_after(iterator after_this, iterator before_begin, iterator before_end)
+   {
+      if (after_this != before_begin && after_this != before_end && before_begin != before_end) {
+         void_pointer next_b = priv_get_ref(before_begin.next_node_);
+         void_pointer next_e = priv_get_ref(before_end.next_node_);
+         void_pointer next_p = priv_get_ref(after_this.next_node_);
+         priv_get_ref(before_begin.next_node_) = next_e;
+         priv_get_ref(before_end.next_node_)   = next_p;
+         priv_get_ref(after_this.next_node_)   = next_b;
+      }
+   }
+
+   void swap(basic_multiallocation_slist &other_chain)
+   {
+      std::swap(this->it_, other_chain.it_);
+   }
+
+   static iterator iterator_to(void_pointer p)
+   {  return iterator(p);  }
+
+   void_pointer extract_data()
+   {
+      void_pointer ret = empty() ? void_pointer(0) : void_pointer(&*it_);
+      it_ = iterator();
+      return ret;
+   }
+};
+
+template<class VoidPointer>
+class basic_multiallocation_cached_slist
+{
+private:
+   basic_multiallocation_slist<VoidPointer>  slist_;
+   typename basic_multiallocation_slist<VoidPointer>::iterator last_;
+
+   basic_multiallocation_cached_slist(basic_multiallocation_cached_slist &);
+   basic_multiallocation_cached_slist &operator=(basic_multiallocation_cached_slist &);
+
+public:
+   BOOST_ENABLE_MOVE_EMULATION(basic_multiallocation_cached_slist)
+
+      typedef typename basic_multiallocation_slist<VoidPointer>::void_pointer  void_pointer;
+   typedef typename basic_multiallocation_slist<VoidPointer>::iterator      iterator;
+
+   basic_multiallocation_cached_slist()
+      :  slist_(), last_(slist_.before_begin())
+   {}
+   /*
+   basic_multiallocation_cached_slist(iterator first_node)
+   :  slist_(first_node), last_(slist_.before_begin())
+   {
+   iterator end;
+   while(first_node != end){
+   ++last_;
+   }
+   }*/
+
+   basic_multiallocation_cached_slist(void_pointer p1, void_pointer p2)
+      :  slist_(p1), last_(p2 ? iterator_to(p2) : slist_.before_begin())
+   {}
+
+   basic_multiallocation_cached_slist(BOOST_RV_REF(basic_multiallocation_cached_slist) other)
+      :  slist_(), last_(slist_.before_begin())
+   {  this->swap(other); }
+
+   basic_multiallocation_cached_slist& operator=(BOOST_RV_REF(basic_multiallocation_cached_slist) other)
+   {
+      basic_multiallocation_cached_slist tmp(boost::move(other));
+      this->swap(tmp);
+      return *this;
+   }
+
+   bool empty() const
+   {  return slist_.empty(); }
+
+   iterator before_begin() const
+   {  return slist_.before_begin(); }
+
+   iterator begin() const
+   {  return slist_.begin(); }
+
+   iterator end() const
+   {  return slist_.end(); }
+
+   iterator last() const
+   {  return last_; }
+
+   void clear()
+   {
+      slist_.clear();
+      last_ = slist_.before_begin();
+   }
+
+   iterator insert_after(iterator it, void_pointer m)
+   {
+      slist_.insert_after(it, m);
+      if(it == last_){
+         last_ = slist_.iterator_to(m);
+      }
+      return iterator_to(m);
+   }
+
+   void push_front(void_pointer m)
+   {  this->insert_after(this->before_begin(), m);   }
+
+   void push_back(void_pointer m)
+   {  this->insert_after(last_, m);   }
+
+   void pop_front()
+   {
+      if(last_ == slist_.begin()){
+         last_ = slist_.before_begin();
+      }
+      slist_.pop_front();
+   }
+
+   void *front() const
+   {  return slist_.front(); }
+
+   void splice_after(iterator after_this, iterator before_begin, iterator before_end)
+   {
+      if(before_begin == before_end)
+         return;
+      if(after_this == last_){
+         last_ = before_end;
+      }
+      slist_.splice_after(after_this, before_begin, before_end);
+   }
+
+   void swap(basic_multiallocation_cached_slist &x)
+   {
+      slist_.swap(x.slist_);
+      using std::swap;
+      swap(last_, x.last_);
+      if(last_ == x.before_begin()){
+         last_ = this->before_begin();
+      }
+      if(x.last_ == this->before_begin()){
+         x.last_ = x.before_begin();
+      }
+   }
+
+   static iterator iterator_to(void_pointer p)
+   {  return basic_multiallocation_slist<VoidPointer>::iterator_to(p);  }
+
+   std::pair<void_pointer, void_pointer> extract_data()
+   {
+      if(this->empty()){
+         return std::pair<void_pointer, void_pointer>(void_pointer(0), void_pointer(0));
+      }
+      else{
+         void_pointer p1 = slist_.extract_data();
+         void_pointer p2 = void_pointer(&*last_);
+         last_ = iterator();
+         return std::pair<void_pointer, void_pointer>(p1, p2);
+      }
+   }
+};
+
+template<class MultiallocatorCachedSlist>
+class basic_multiallocation_cached_counted_slist
+{
+private:
+   MultiallocatorCachedSlist  cached_slist_;
+   std::size_t size_;
+
+   basic_multiallocation_cached_counted_slist(basic_multiallocation_cached_counted_slist &);
+   basic_multiallocation_cached_counted_slist &operator=(basic_multiallocation_cached_counted_slist &);
+
+public:
+   BOOST_ENABLE_MOVE_EMULATION(basic_multiallocation_cached_counted_slist)
+
+      typedef typename MultiallocatorCachedSlist::void_pointer  void_pointer;
+   typedef typename MultiallocatorCachedSlist::iterator      iterator;
+
+   basic_multiallocation_cached_counted_slist()
+      :  cached_slist_(), size_(0)
+   {}
+
+   basic_multiallocation_cached_counted_slist(void_pointer p1, void_pointer p2, std::size_t n)
+      :  cached_slist_(p1, p2), size_(n)
+   {}
+
+   basic_multiallocation_cached_counted_slist(BOOST_RV_REF(basic_multiallocation_cached_counted_slist) other)
+      :  cached_slist_(), size_(0)
+   {  this->swap(other); }
+
+   basic_multiallocation_cached_counted_slist& operator=(BOOST_RV_REF(basic_multiallocation_cached_counted_slist) other)
+   {
+      basic_multiallocation_cached_counted_slist tmp(boost::move(other));
+      this->swap(tmp);
+      return *this;
+   }
+
+   basic_multiallocation_cached_counted_slist (MultiallocatorCachedSlist mem, std::size_t n)
+      :  cached_slist_(boost::move(mem)), size_(n)
+   {}
+
+   bool empty() const
+   {  return cached_slist_.empty(); }
+
+   std::size_t size() const
+   {  return size_;  }
+
+   iterator before_begin() const
+   {  return cached_slist_.before_begin(); }
+
+   iterator begin() const
+   {  return cached_slist_.begin(); }
+
+   iterator end() const
+   {  return cached_slist_.end(); }
+
+   iterator last() const
+   {  return cached_slist_.last(); }
+
+   void clear()
+   {
+      cached_slist_.clear();
+      size_ = 0;
+   }
+
+   iterator insert_after(iterator it, void_pointer m)
+   {
+      iterator ret = cached_slist_.insert_after(it, m);
+      ++size_;
+      return ret;
+   }
+
+   void push_front(void_pointer m)
+   {  this->insert_after(this->before_begin(), m);   }
+
+   void push_back(void_pointer m)
+   {  this->insert_after(this->before_begin(), m);   }
+
+   void pop_front()
+   {
+      cached_slist_.pop_front();
+      --size_;
+   }
+
+   void *front() const
+   {  return cached_slist_.front(); }
+
+   void splice_after(iterator after_this, basic_multiallocation_cached_counted_slist &x, iterator before_begin, iterator before_end)
+   {
+      std::size_t n = static_cast<std::size_t>(std::distance(before_begin, before_end));
+      this->splice_after(after_this, x, before_begin, before_end, n);
+   }
+
+   void splice_after(iterator after_this, basic_multiallocation_cached_counted_slist &x, iterator before_begin, iterator before_end, std::size_t n)
+   {
+      cached_slist_.splice_after(after_this, before_begin, before_end);
+      size_ += n;
+      x.size_ -= n;
+   }
+
+   void splice_after(iterator after_this, basic_multiallocation_cached_counted_slist &x)
+   {
+      cached_slist_.splice_after(after_this, x.before_begin(), x.last());
+      size_ += x.size_;
+      x.size_ = 0;
+   }
+
+   void swap(basic_multiallocation_cached_counted_slist &x)
+   {
+      cached_slist_.swap(x.cached_slist_);
+      using std::swap;
+      swap(size_, x.size_);
+   }
+
+   static iterator iterator_to(void_pointer p)
+   {  return MultiallocatorCachedSlist::iterator_to(p);  }
+
+   std::pair<void_pointer, void_pointer> extract_data()
+   {
+      size_ = 0;
+      return cached_slist_.extract_data();
+   }
+};
+
+template<class T>
+struct cast_functor
+{
+   typedef typename containers_detail::add_reference<T>::type result_type;
+   result_type operator()(char &ptr) const
+   {  return *static_cast<T*>(static_cast<void*>(&ptr));  }
+};
+
+
+template<class MultiallocationChain, class T>
+class transform_multiallocation_chain
+{
+private:
+
+   MultiallocationChain   holder_;
+   typedef typename MultiallocationChain::void_pointer   void_pointer;
+   typedef typename boost::pointer_to_other
+      <void_pointer, T>::type                            pointer;
+
+   transform_multiallocation_chain(transform_multiallocation_chain &);
+   transform_multiallocation_chain &operator=(transform_multiallocation_chain &);
+
+   static pointer cast(void_pointer p)
+   {
+      return pointer(static_cast<T*>(containers_detail::get_pointer(p)));
+   }
+
+public:
+   BOOST_ENABLE_MOVE_EMULATION(transform_multiallocation_chain)
+
+      typedef transform_iterator
+      < typename MultiallocationChain::iterator
+      , containers_detail::cast_functor <T> >                 iterator;
+
+   transform_multiallocation_chain(void_pointer p1, void_pointer p2, std::size_t n)
+      : holder_(p1, p2, n)
+   {}
+
+   transform_multiallocation_chain()
+      : holder_()
+   {}
+
+   transform_multiallocation_chain(BOOST_RV_REF(transform_multiallocation_chain) other)
+      : holder_()
+   {  this->swap(other); }
+
+   transform_multiallocation_chain(BOOST_RV_REF(MultiallocationChain) other)
+      : holder_(boost::move(other))
+   {}
+
+   transform_multiallocation_chain& operator=(BOOST_RV_REF(transform_multiallocation_chain) other)
+   {
+      transform_multiallocation_chain tmp(boost::move(other));
+      this->swap(tmp);
+      return *this;
+   }
+
+   void push_front(pointer mem)
+   {  holder_.push_front(mem);  }
+
+   void swap(transform_multiallocation_chain &other_chain)
+   {  holder_.swap(other_chain.holder_); }
+   /*
+   void splice_after(iterator after_this, iterator before_begin, iterator before_end)
+   {  holder_.splice_after(after_this.base(), before_begin.base(), before_end.base());  }
+   */
+   void splice_after(iterator after_this, transform_multiallocation_chain &x, iterator before_begin, iterator before_end, std::size_t n)
+   {  holder_.splice_after(after_this.base(), x.holder_, before_begin.base(), before_end.base(), n);  }
+
+   void pop_front()
+   {  holder_.pop_front();  }
+
+   pointer front() const
+   {  return cast(holder_.front());   }
+
+   bool empty() const
+   {  return holder_.empty(); }
+
+   iterator before_begin() const
+   {  return iterator(holder_.before_begin());   }
+
+   iterator begin() const
+   {  return iterator(holder_.begin());   }
+
+   iterator end() const
+   {  return iterator(holder_.end());   }
+
+   iterator last() const
+   {  return iterator(holder_.last());   }
+
+   std::size_t size() const
+   {  return holder_.size();  }
+
+   void clear()
+   {  holder_.clear(); }
+
+   iterator insert_after(iterator it, pointer m)
+   {  return iterator(holder_.insert_after(it.base(), m)); }
+
+   static iterator iterator_to(pointer p)
+   {  return iterator(MultiallocationChain::iterator_to(p));  }
+
+   std::pair<void_pointer, void_pointer> extract_data()
+   {  return holder_.extract_data();  }
+
+   MultiallocationChain extract_multiallocation_chain()
+   {
+      return MultiallocationChain(boost::move(holder_));
+   }
+};
+
+}}}
+
+// namespace containers_detail {
+// namespace container {
+// namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //BOOST_CONTAINERS_DETAIL_MULTIALLOCATION_CHAIN_HPP
Added: sandbox/move/boost/container/detail/node_alloc_holder.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/node_alloc_holder.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,499 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_NODE_ALLOC_HPP_
+#define BOOST_CONTAINERS_DETAIL_NODE_ALLOC_HPP_
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <utility>
+#include <functional>
+
+#include <boost/move/move.hpp>
+#include <boost/intrusive/options.hpp>
+
+#include <boost/container/detail/version_type.hpp>
+#include <boost/container/detail/type_traits.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/destroyers.hpp>
+
+#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+#include <boost/container/detail/preprocessor.hpp>
+#endif
+
+#include <boost/container/detail/algorithms.hpp>
+
+
+namespace boost {
+namespace container {
+namespace containers_detail {
+
+//!A deleter for scoped_ptr that deallocates the memory
+//!allocated for an object using a STL allocator.
+template <class Allocator>
+struct scoped_deallocator
+{
+   typedef typename Allocator::pointer pointer;
+   typedef containers_detail::integral_constant<unsigned,
+      boost::container::containers_detail::
+         version<Allocator>::value>                   alloc_version;
+   typedef containers_detail::integral_constant<unsigned, 1>     allocator_v1;
+   typedef containers_detail::integral_constant<unsigned, 2>     allocator_v2;
+
+   private:
+   void priv_deallocate(allocator_v1)
+   {  m_alloc.deallocate(m_ptr, 1); }
+
+   void priv_deallocate(allocator_v2)
+   {  m_alloc.deallocate_one(m_ptr); }
+
+   scoped_deallocator(scoped_deallocator &);
+   scoped_deallocator& operator=(scoped_deallocator &);
+
+   public:
+
+   BOOST_ENABLE_MOVE_EMULATION(scoped_deallocator)
+
+   pointer     m_ptr;
+   Allocator&  m_alloc;
+
+   scoped_deallocator(pointer p, Allocator& a)
+      : m_ptr(p), m_alloc(a)
+   {}
+
+   ~scoped_deallocator()
+   {  if (m_ptr)priv_deallocate(alloc_version());  }
+
+   scoped_deallocator(BOOST_RV_REF(scoped_deallocator) o)
+      :  m_ptr(o.m_ptr), m_alloc(o.m_alloc)
+   {  o.release();  }
+
+   pointer get() const
+   {  return m_ptr;  }
+
+   void release()
+   {  m_ptr = 0; }
+};
+
+template <class A>
+class allocator_destroyer_and_chain_builder
+{
+   typedef typename A::value_type value_type;
+   typedef typename A::multiallocation_chain    multiallocation_chain;
+
+   A & a_;
+   multiallocation_chain &c_;
+
+   public:
+   allocator_destroyer_and_chain_builder(A &a, multiallocation_chain &c)
+      :  a_(a), c_(c)
+   {}
+
+   void operator()(const typename A::pointer &p)
+   {  
+      value_type *vp = containers_detail::get_pointer(p);
+      vp->~value_type();
+      c_.push_front(vp);
+   }
+};
+
+template <class A>
+class allocator_multialloc_chain_node_deallocator
+{
+   typedef typename A::value_type value_type;
+   typedef typename A::multiallocation_chain    multiallocation_chain;
+   typedef allocator_destroyer_and_chain_builder<A> chain_builder;
+
+   A & a_;
+   multiallocation_chain c_;
+
+   public:
+   allocator_multialloc_chain_node_deallocator(A &a)
+      :  a_(a), c_()
+   {}
+
+   chain_builder get_chain_builder()
+   {  return chain_builder(a_, c_);  }
+
+   ~allocator_multialloc_chain_node_deallocator()
+   {
+      if(!c_.empty())
+         a_.deallocate_individual(boost::move(c_));
+   }
+};
+
+
+template<class ValueCompare, class Node>
+struct node_compare
+   :  private ValueCompare
+{
+   typedef typename ValueCompare::key_type     key_type;
+   typedef typename ValueCompare::value_type   value_type;
+   typedef typename ValueCompare::key_of_value key_of_value;
+
+   node_compare(const ValueCompare &pred)
+      :  ValueCompare(pred)
+   {}
+
+   ValueCompare &value_comp()
+   {  return static_cast<ValueCompare &>(*this);  }
+
+   ValueCompare &value_comp() const
+   {  return static_cast<const ValueCompare &>(*this);  }
+
+   bool operator()(const Node &a, const Node &b) const
+   {  return ValueCompare::operator()(a.get_data(), b.get_data());  }
+};
+
+template<class A, class ICont>
+struct node_alloc_holder
+{
+   typedef node_alloc_holder<A, ICont>                self_t;
+   typedef typename A::value_type                     value_type;
+   typedef typename ICont::value_type                 Node;
+   typedef typename A::template rebind<Node>::other   NodeAlloc;
+   typedef A                                          ValAlloc;
+   typedef typename NodeAlloc::pointer                NodePtr;
+   typedef containers_detail::scoped_deallocator<NodeAlloc>      Deallocator;
+   typedef typename NodeAlloc::size_type              size_type;
+   typedef typename NodeAlloc::difference_type        difference_type;
+   typedef containers_detail::integral_constant<unsigned, 1>     allocator_v1;
+   typedef containers_detail::integral_constant<unsigned, 2>     allocator_v2;
+   typedef containers_detail::integral_constant<unsigned,
+      boost::container::containers_detail::
+         version<NodeAlloc>::value>                   alloc_version;
+   typedef typename ICont::iterator                   icont_iterator;
+   typedef typename ICont::const_iterator             icont_citerator;
+   typedef allocator_destroyer<NodeAlloc>             Destroyer;
+
+   private:
+   node_alloc_holder(node_alloc_holder&);
+   node_alloc_holder & operator=(node_alloc_holder&);
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(node_alloc_holder)
+
+   node_alloc_holder(const ValAlloc &a) 
+      : members_(a)
+   {}
+
+   node_alloc_holder(const node_alloc_holder &other)
+      : members_(other.node_alloc())
+   {}
+
+   node_alloc_holder(BOOST_RV_REF(node_alloc_holder) other)
+      : members_(boost::move(other.node_alloc()))
+   {  this->swap(other);  }
+
+   template<class Pred>
+   node_alloc_holder(const ValAlloc &a, const Pred &c) 
+      : members_(a, typename ICont::value_compare(c))
+   {}
+
+   template<class Pred>
+   node_alloc_holder(BOOST_RV_REF(ValAlloc) a, const Pred &c) 
+      : members_(a, typename ICont::value_compare(c))
+   {}
+
+   template<class Pred>
+   node_alloc_holder(const node_alloc_holder &other, const Pred &c)
+      : members_(other.node_alloc(), typename ICont::value_compare(c))
+   {}
+
+   ~node_alloc_holder()
+   {  this->clear(alloc_version()); }
+
+   size_type max_size() const
+   {  return this->node_alloc().max_size();  }
+
+   NodePtr allocate_one()
+   {  return this->allocate_one(alloc_version());   }
+
+   NodePtr allocate_one(allocator_v1)
+   {  return this->node_alloc().allocate(1);   }
+
+   NodePtr allocate_one(allocator_v2)
+   {  return this->node_alloc().allocate_one();   }
+
+   void deallocate_one(NodePtr p)
+   {  return this->deallocate_one(p, alloc_version());   }
+
+   void deallocate_one(NodePtr p, allocator_v1)
+   {  this->node_alloc().deallocate(p, 1);   }
+
+   void deallocate_one(NodePtr p, allocator_v2)
+   {  this->node_alloc().deallocate_one(p);   }
+
+   template<class Convertible1, class Convertible2>
+   static void construct(const NodePtr &ptr,
+      #ifdef BOOST_HAS_RVALUE_REFS
+      std::pair<Convertible1, Convertible2> &&
+      #else
+      boost::rv<std::pair<Convertible1, Convertible2> > &
+      #endif
+      value)
+   {  
+      typedef typename Node::hook_type                hook_type;
+      typedef typename Node::value_type::first_type   first_type;
+      typedef typename Node::value_type::second_type  second_type;
+      Node *nodeptr = containers_detail::get_pointer(ptr);
+
+      //Hook constructor does not throw
+      new(static_cast<hook_type*>(nodeptr))hook_type();
+      //Now construct pair members_holder
+      value_type *valueptr = &nodeptr->get_data();
+      new((void*)&valueptr->first) first_type(boost::move(value.first));
+      BOOST_TRY{
+         new((void*)&valueptr->second) second_type(boost::move(value.second));
+      }
+      BOOST_CATCH(...){
+         valueptr->first.~first_type();
+         static_cast<hook_type*>(nodeptr)->~hook_type();
+         BOOST_RETHROW
+      }
+      BOOST_CATCH_END
+   }
+
+   static void destroy(const NodePtr &ptr)
+   {  containers_detail::get_pointer(ptr)->~Node();  }
+
+   Deallocator create_node_and_deallocator()
+   {
+      return Deallocator(this->allocate_one(), this->node_alloc());
+   }
+
+   #ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template<class ...Args>
+   static void construct(const NodePtr &ptr, Args &&...args)
+   {  new((void*)containers_detail::get_pointer(ptr)) Node(boost::forward<Args>(args)...);  }
+
+   template<class ...Args>
+   NodePtr create_node(Args &&...args)
+   {
+      NodePtr p = this->allocate_one();
+      Deallocator node_deallocator(p, this->node_alloc());
+      self_t::construct(p, boost::forward<Args>(args)...);
+      node_deallocator.release();
+      return (p);
+   }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   static void construct(const NodePtr &ptr)
+   {  new((void*)containers_detail::get_pointer(ptr)) Node();  }
+
+   NodePtr create_node()
+   {
+      NodePtr p = this->allocate_one();
+      Deallocator node_deallocator(p, this->node_alloc());
+      self_t::construct(p);
+      node_deallocator.release();
+      return (p);
+   }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                           \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   void construct(const NodePtr &ptr, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _)) \
+   {                                                                                         \
+      new((void*)containers_detail::get_pointer(ptr))                                                   \
+      Node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                        \
+   }                                                                                         \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                        \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                             \
+   NodePtr create_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))             \
+   {                                                                                      \
+      NodePtr p = this->allocate_one();                                                   \
+      Deallocator node_deallocator(p, this->node_alloc());                                \
+      self_t::construct(p, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));     \
+      node_deallocator.release();                                                         \
+      return (p);                                                                         \
+   }                                                                                      \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template<class It>
+   NodePtr create_node_from_it(It it)
+   {
+      NodePtr p = this->allocate_one();
+      Deallocator node_deallocator(p, this->node_alloc());
+      ::boost::container::construct_in_place(containers_detail::get_pointer(p), it);
+      node_deallocator.release();
+      return (p);
+   }
+
+   void destroy_node(NodePtr node)
+   {
+      self_t::destroy(node);
+      this->deallocate_one(node);
+   }
+
+   void swap(node_alloc_holder &x)
+   {
+      NodeAlloc& this_alloc   = this->node_alloc();
+      NodeAlloc& other_alloc  = x.node_alloc();
+
+      if (this_alloc != other_alloc){
+         containers_detail::do_swap(this_alloc, other_alloc);
+      }
+
+      this->icont().swap(x.icont());
+   }
+
+   template<class FwdIterator, class Inserter>
+   FwdIterator allocate_many_and_construct
+      (FwdIterator beg, difference_type n, Inserter inserter)
+   {
+      if(n){
+         typedef typename NodeAlloc::multiallocation_chain multiallocation_chain;
+
+         //Try to allocate memory in a single block
+         multiallocation_chain mem(this->node_alloc().allocate_individual(n));
+         int constructed = 0;
+         Node *p = 0;
+         BOOST_TRY{
+            for(difference_type i = 0; i < n; ++i, ++beg, --constructed){
+               p = containers_detail::get_pointer(mem.front());
+               mem.pop_front();
+               //This can throw
+               constructed = 0;
+               boost::container::construct_in_place(p, beg);
+               ++constructed;
+               //This can throw in some containers (predicate might throw)
+               inserter(*p);
+            }
+         }
+         BOOST_CATCH(...){
+            if(constructed){
+               this->destroy(p);
+            }
+            this->node_alloc().deallocate_individual(boost::move(mem));
+            BOOST_RETHROW
+         }
+         BOOST_CATCH_END
+      }
+      return beg;
+
+   }
+
+   void clear(allocator_v1)
+   {  this->icont().clear_and_dispose(Destroyer(this->node_alloc()));   }
+
+   void clear(allocator_v2)
+   {
+      typename NodeAlloc::multiallocation_chain chain;
+      allocator_destroyer_and_chain_builder<NodeAlloc> builder(this->node_alloc(), chain);
+      this->icont().clear_and_dispose(builder);
+      BOOST_STATIC_ASSERT((boost::is_movable<typename NodeAlloc::multiallocation_chain>::value == true));
+      if(!chain.empty())
+         this->node_alloc().deallocate_individual(boost::move(chain));
+   }
+
+   icont_iterator erase_range(icont_iterator first, icont_iterator last, allocator_v1)
+   {  return this->icont().erase_and_dispose(first, last, Destroyer(this->node_alloc())); }
+
+   icont_iterator erase_range(icont_iterator first, icont_iterator last, allocator_v2)
+   {
+      allocator_multialloc_chain_node_deallocator<NodeAlloc> chain_holder(this->node_alloc());
+      return this->icont().erase_and_dispose(first, last, chain_holder.get_chain_builder());
+   }
+
+   template<class Key, class Comparator>
+   size_type erase_key(const Key& k, const Comparator &comp, allocator_v1)
+   {  return this->icont().erase_and_dispose(k, comp, Destroyer(this->node_alloc())); }
+
+   template<class Key, class Comparator>
+   size_type erase_key(const Key& k, const Comparator &comp, allocator_v2)
+   {
+      allocator_multialloc_chain_node_deallocator<NodeAlloc> chain_holder(this->node_alloc());
+      return this->icont().erase_and_dispose(k, comp, chain_holder.get_chain_builder());
+   }
+
+   protected:
+   struct cloner
+   {
+      cloner(node_alloc_holder &holder)
+         :  m_holder(holder)
+      {}
+
+      NodePtr operator()(const Node &other) const
+      {  return m_holder.create_node(other.get_data());  }
+
+      node_alloc_holder &m_holder;
+   };
+
+   struct destroyer
+   {
+      destroyer(node_alloc_holder &holder)
+         :  m_holder(holder)
+      {}
+
+      void operator()(NodePtr n) const
+      {  m_holder.destroy_node(n);  }
+
+      node_alloc_holder &m_holder;
+   };
+
+   struct members_holder
+      :  public NodeAlloc
+   {
+      private:
+      members_holder(const members_holder&);
+
+      public:
+      template<class ConvertibleToAlloc>
+      members_holder(const ConvertibleToAlloc &c2alloc)
+         :  NodeAlloc(c2alloc)
+      {}
+
+      template<class ConvertibleToAlloc, class Pred>
+      members_holder(const ConvertibleToAlloc &c2alloc, const Pred &c)
+         :  NodeAlloc(c2alloc), m_icont(c)
+      {}
+      //The intrusive container
+      ICont m_icont;
+   } members_;
+
+   ICont &non_const_icont() const
+   {  return const_cast<ICont&>(this->members_.m_icont);   }
+
+   ICont &icont()
+   {  return this->members_.m_icont;   }
+
+   const ICont &icont() const
+   {  return this->members_.m_icont;   }
+
+   NodeAlloc &node_alloc()
+   {  return static_cast<NodeAlloc &>(this->members_);   }
+
+   const NodeAlloc &node_alloc() const
+   {  return static_cast<const NodeAlloc &>(this->members_);   }
+};
+
+}  //namespace containers_detail {
+}  //namespace container {
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif // BOOST_CONTAINERS_DETAIL_NODE_ALLOC_HPP_
Added: sandbox/move/boost/container/detail/pair.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/pair.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,189 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2009.
+//
+// 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_CONTAINERS_DETAIL_PAIR_HPP
+#define BOOST_CONTAINERS_CONTAINERS_DETAIL_PAIR_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/type_traits.hpp>
+
+#include <utility>   //std::pair
+
+#include <boost/move/move.hpp>
+
+#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+#include <boost/container/detail/preprocessor.hpp>
+#endif
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+template <class T1, class T2>
+struct pair
+{
+   BOOST_ENABLE_MOVE_EMULATION(pair)
+
+   typedef T1 first_type;
+   typedef T2 second_type;
+
+   T1 first;
+   T2 second;
+
+   //std::pair compatibility
+   template <class D, class S>
+   pair(const std::pair<D, S>& p)
+      : first(p.first), second(p.second)
+   {}
+
+   //To resolve ambiguity with the variadic constructor of 1 argument
+   //and the previous constructor
+   pair(std::pair<T1, T2>& x)
+      : first(x.first), second(x.second)
+   {}
+
+   template <class D, class S>
+   pair(BOOST_RV_REF_2_TEMPL_ARGS(std::pair, D, S) p)
+      : first(boost::move(p.first)), second(boost::move(p.second))
+   {}
+
+   pair()
+      : first(), second()
+   {}
+
+   pair(const pair<T1, T2>& x)
+      : first(x.first), second(x.second)
+   {}
+
+   //To resolve ambiguity with the variadic constructor of 1 argument
+   //and the copy constructor
+   pair(pair<T1, T2>& x)
+      : first(x.first), second(x.second)
+   {}
+
+   pair(BOOST_RV_REF(pair) p)
+      : first(boost::move(p.first)), second(boost::move(p.second))
+   {}
+
+   template <class D, class S>
+   pair(BOOST_RV_REF_2_TEMPL_ARGS(pair, D, S) p)
+      : first(boost::move(p.first)), second(boost::move(p.second))
+   {}
+
+   #ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template<class U, class ...Args>
+   pair(U &&u, Args &&... args)
+      : first(boost::forward<U>(u))
+      , second(boost::forward<Args>(args)...)
+   {}
+
+   #else
+
+   template<class U>
+   pair( BOOST_CONTAINERS_PARAM(U, u)
+       #ifndef BOOST_HAS_RVALUE_REFS
+       , typename containers_detail::disable_if
+          < containers_detail::is_same<U, boost::rv<pair> > >::type* = 0
+       #endif
+      )
+      : first(boost::forward<U>(const_cast<U&>(u)))
+   {}
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                            \
+   template<class U, BOOST_PP_ENUM_PARAMS(n, class P)>                                        \
+   pair(BOOST_CONTAINERS_PARAM(U, u)                                                          \
+       ,BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                                  \
+      : first(boost::forward<U>(const_cast<U&>(u)))                             \
+      , second(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _))                        \
+   {}                                                                                         \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+   #endif
+
+   pair& operator=(BOOST_RV_REF(pair) p)
+   {
+      first  = boost::move(p.first);
+      second = boost::move(p.second);
+      return *this;
+   }
+
+   pair& operator=(BOOST_RV_REF_2_TEMPL_ARGS(std::pair, T1, T2) p)
+   {
+      first  = boost::move(p.first);
+      second = boost::move(p.second);
+      return *this;
+   }
+
+   template <class D, class S>
+   pair& operator=(BOOST_RV_REF_2_TEMPL_ARGS(std::pair, D, S) p)
+   {
+      first  = boost::move(p.first);
+      second = boost::move(p.second);
+      return *this;
+   }
+
+   void swap(pair& p)
+   {  std::swap(*this, p); }
+};
+
+template <class T1, class T2>
+inline bool operator==(const pair<T1,T2>& x, const pair<T1,T2>& y)
+{  return static_cast<bool>(x.first == y.first && x.second == y.second);  }
+
+template <class T1, class T2>
+inline bool operator< (const pair<T1,T2>& x, const pair<T1,T2>& y)
+{  return static_cast<bool>(x.first < y.first ||
+                         (!(y.first < x.first) && x.second < y.second)); }
+
+template <class T1, class T2>
+inline bool operator!=(const pair<T1,T2>& x, const pair<T1,T2>& y)
+{  return static_cast<bool>(!(x == y));  }
+
+template <class T1, class T2>
+inline bool operator> (const pair<T1,T2>& x, const pair<T1,T2>& y)
+{  return y < x;  }
+
+template <class T1, class T2>
+inline bool operator>=(const pair<T1,T2>& x, const pair<T1,T2>& y)
+{  return static_cast<bool>(!(x < y)); }
+
+template <class T1, class T2>
+inline bool operator<=(const pair<T1,T2>& x, const pair<T1,T2>& y)
+{  return static_cast<bool>(!(y < x)); }
+
+template <class T1, class T2>
+inline pair<T1, T2> make_pair(T1 x, T2 y)
+{  return pair<T1, T2>(x, y); }
+
+template <class T1, class T2>
+inline void swap(pair<T1, T2>& x, pair<T1, T2>& y)
+{
+   swap(x.first, y.first);
+   swap(x.second, y.second);
+}
+
+}  //namespace containers_detail { 
+}  //namespace container { 
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_PAIR_HPP
Added: sandbox/move/boost/container/detail/preprocessor.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/preprocessor.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,101 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2008-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_PREPROCESSOR_HPP
+#define BOOST_CONTAINERS_DETAIL_PREPROCESSOR_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+#error "This file is not needed when perfect forwarding is available"
+#endif
+
+#include <boost/preprocessor/iteration/local.hpp> 
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+
+#define BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS 10
+
+//Note:
+//We define template parameters as const references to
+//be able to bind temporaries. After that we will un-const them.
+//This cast is ugly but it is necessary until "perfect forwarding"
+//is achieved in C++0x. Meanwhile, if we want to be able to
+//bind rvalues with non-const references, we have to be ugly
+#ifdef BOOST_HAS_RVALUE_REFS
+   #define BOOST_CONTAINERS_PP_PARAM_LIST(z, n, data) \
+   BOOST_PP_CAT(P, n) && BOOST_PP_CAT(p, n) \
+   //!
+#else
+   #define BOOST_CONTAINERS_PP_PARAM_LIST(z, n, data) \
+   const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n) \
+   //!
+#endif
+
+#ifdef BOOST_HAS_RVALUE_REFS
+   #define BOOST_CONTAINERS_PARAM(U, u) \
+   U && u \
+   //!
+#else
+   #define BOOST_CONTAINERS_PARAM(U, u) \
+   const U & u \
+   //!
+#endif
+
+#ifdef BOOST_HAS_RVALUE_REFS
+#define BOOST_CONTAINERS_AUX_PARAM_INIT(z, n, data) \
+  BOOST_PP_CAT(m_p, n) (BOOST_PP_CAT(p, n))           \
+//!
+#else
+#define BOOST_CONTAINERS_AUX_PARAM_INIT(z, n, data) \
+  BOOST_PP_CAT(m_p, n) (const_cast<BOOST_PP_CAT(P, n) &>(BOOST_PP_CAT(p, n))) \
+//!
+#endif
+
+#define BOOST_CONTAINERS_AUX_PARAM_INC(z, n, data)   \
+  BOOST_PP_CAT(++m_p, n)                        \
+//!
+
+#ifdef BOOST_HAS_RVALUE_REFS
+#define BOOST_CONTAINERS_AUX_PARAM_DEFINE(z, n, data)  \
+  BOOST_PP_CAT(P, n) && BOOST_PP_CAT(m_p, n);            \
+//!
+#else
+#define BOOST_CONTAINERS_AUX_PARAM_DEFINE(z, n, data)  \
+  BOOST_PP_CAT(P, n) & BOOST_PP_CAT(m_p, n);             \
+//!
+#endif
+
+#define BOOST_CONTAINERS_PP_PARAM_FORWARD(z, n, data) \
+boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ) \
+//!
+
+#define BOOST_CONTAINERS_PP_MEMBER_FORWARD(z, n, data) \
+boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(m_p, n) ) \
+//!
+
+#define BOOST_CONTAINERS_PP_MEMBER_IT_FORWARD(z, n, data) \
+BOOST_PP_CAT(*m_p, n) \
+//!
+
+#include <boost/container/detail/config_end.hpp>
+
+#else
+#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+#error "This file is not needed when perfect forwarding is available"
+#endif
+#endif //#ifndef BOOST_CONTAINERS_DETAIL_PREPROCESSOR_HPP
Added: sandbox/move/boost/container/detail/transform_iterator.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/transform_iterator.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,176 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008.
+// (C) Copyright Gennaro Prota 2003 - 2004.
+//
+// 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_TRANSFORM_ITERATORS_HPP
+#define BOOST_CONTAINERS_DETAIL_TRANSFORM_ITERATORS_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/type_traits.hpp>
+#include <iterator>
+
+namespace boost {
+namespace container { 
+
+template <class PseudoReference>
+struct operator_arrow_proxy
+{
+   operator_arrow_proxy(const PseudoReference &px)
+      :  m_value(px)
+   {}
+
+   PseudoReference* operator->() const { return &m_value; }
+   // This function is needed for MWCW and BCC, which won't call operator->
+   // again automatically per 13.3.1.2 para 8
+//   operator T*() const { return &m_value; }
+   mutable PseudoReference m_value;
+};
+
+template <class T>
+struct operator_arrow_proxy<T&>
+{
+   operator_arrow_proxy(T &px)
+      :  m_value(px)
+   {}
+
+   T* operator->() const { return &m_value; }
+   // This function is needed for MWCW and BCC, which won't call operator->
+   // again automatically per 13.3.1.2 para 8
+//   operator T*() const { return &m_value; }
+   mutable T &m_value;
+};
+
+template <class Iterator, class UnaryFunction>
+class transform_iterator
+   : public UnaryFunction
+   , public std::iterator
+      < typename Iterator::iterator_category
+      , typename containers_detail::remove_reference<typename UnaryFunction::result_type>::type
+      , typename Iterator::difference_type
+      , operator_arrow_proxy<typename UnaryFunction::result_type>
+      , typename UnaryFunction::result_type>
+{
+   public:
+   explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction())
+      :  UnaryFunction(f), m_it(it)
+   {}
+
+   explicit transform_iterator()
+      :  UnaryFunction(), m_it()
+   {}
+
+   //Constructors
+   transform_iterator& operator++() 
+   { increment();   return *this;   }
+
+   transform_iterator operator++(int)
+   {
+      transform_iterator result (*this);
+      increment();
+      return result;
+   }
+
+   friend bool operator== (const transform_iterator& i, const transform_iterator& i2)
+   { return i.equal(i2); }
+
+   friend bool operator!= (const transform_iterator& i, const transform_iterator& i2)
+   { return !(i == i2); }
+
+/*
+   friend bool operator> (const transform_iterator& i, const transform_iterator& i2)
+   { return i2 < i; }
+
+   friend bool operator<= (const transform_iterator& i, const transform_iterator& i2)
+   { return !(i > i2); }
+
+   friend bool operator>= (const transform_iterator& i, const transform_iterator& i2)
+   { return !(i < i2); }
+*/
+   friend typename Iterator::difference_type operator- (const transform_iterator& i, const transform_iterator& i2)
+   { return i2.distance_to(i); }
+
+   //Arithmetic
+   transform_iterator& operator+=(typename Iterator::difference_type off)
+   {  this->advance(off); return *this;   }
+
+   transform_iterator operator+(typename Iterator::difference_type off) const
+   {
+      transform_iterator other(*this);
+      other.advance(off);
+      return other;
+   }
+
+   friend transform_iterator operator+(typename Iterator::difference_type off, const transform_iterator& right)
+   {  return right + off; }
+
+   transform_iterator& operator-=(typename Iterator::difference_type off)
+   {  this->advance(-off); return *this;   }
+
+   transform_iterator operator-(typename Iterator::difference_type off) const
+   {  return *this + (-off);  }
+
+   typename UnaryFunction::result_type operator*() const
+   { return dereference(); }
+
+   operator_arrow_proxy<typename UnaryFunction::result_type>
+      operator->() const
+   { return operator_arrow_proxy<typename UnaryFunction::result_type>(dereference());  }
+
+   Iterator & base()
+   {  return m_it;   }
+
+   const Iterator & base() const
+   {  return m_it;   }
+
+   private:
+   Iterator m_it;
+
+   void increment()
+   { ++m_it; }
+
+   void decrement()
+   { --m_it; }
+
+   bool equal(const transform_iterator &other) const
+   {  return m_it == other.m_it;   }
+
+   bool less(const transform_iterator &other) const
+   {  return other.m_it < m_it;   }
+
+   typename UnaryFunction::result_type dereference() const
+   { return UnaryFunction::operator()(*m_it); }
+
+   void advance(typename Iterator::difference_type n)
+   {  std::advance(m_it, n); }
+
+   typename Iterator::difference_type distance_to(const transform_iterator &other)const
+   {  return std::distance(other.m_it, m_it); }
+};
+
+template <class Iterator, class UnaryFunc>
+transform_iterator<Iterator, UnaryFunc>
+make_transform_iterator(Iterator it, UnaryFunc fun)
+{
+   return transform_iterator<Iterator, UnaryFunc>(it, fun);
+}
+
+}  //namespace container { 
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_TRANSFORM_ITERATORS_HPP
Added: sandbox/move/boost/container/detail/tree.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/tree.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1014 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_tree file. Modified by Ion Gaztanaga 2005.
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+/*
+ *
+ * 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.
+ *
+ */
+#ifndef BOOST_CONTAINERS_TREE_HPP
+#define BOOST_CONTAINERS_TREE_HPP
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/move/move.hpp>
+#include <boost/pointer_to_other.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/intrusive/rbtree.hpp>
+
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/algorithms.hpp>
+#include <boost/container/detail/node_alloc_holder.hpp>
+#include <boost/container/detail/destroyers.hpp>
+#include <boost/container/detail/pair.hpp>
+#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+#include <boost/container/detail/preprocessor.hpp>
+#endif
+
+#include <utility>   //std::pair
+#include <iterator>
+#include <algorithm>
+
+namespace boost {
+namespace container {
+namespace containers_detail {
+
+template<class Key, class Value, class KeyCompare, class KeyOfValue>
+struct value_compare_impl
+   :  public KeyCompare
+{
+   typedef Value        value_type;
+   typedef KeyCompare   key_compare; 
+   typedef KeyOfValue   key_of_value;
+   typedef Key          key_type;
+
+   value_compare_impl(key_compare kcomp)
+      :  key_compare(kcomp)
+   {}
+
+   const key_compare &key_comp() const
+   {  return static_cast<const key_compare &>(*this);  }
+
+   key_compare &key_comp()
+   {  return static_cast<key_compare &>(*this);  }
+
+   template<class A, class B>
+   bool operator()(const A &a, const B &b) const
+   {  return key_compare::operator()(KeyOfValue()(a), KeyOfValue()(b)); }
+};
+
+template<class VoidPointer>
+struct rbtree_hook
+{
+   typedef typename containers_detail::bi::make_set_base_hook
+      < containers_detail::bi::void_pointer<VoidPointer>
+      , containers_detail::bi::link_mode<containers_detail::bi::normal_link>
+      , containers_detail::bi::optimize_size<true>
+      >::type  type;
+};
+
+template<class T>
+struct rbtree_type
+{
+   typedef T type;
+};
+
+template<class T1, class T2>
+struct rbtree_type< std::pair<T1, T2> >
+{
+   typedef pair<T1, T2> type;
+};
+
+template <class T, class VoidPointer>
+struct rbtree_node
+   :  public rbtree_hook<VoidPointer>::type
+{
+   typedef typename rbtree_hook<VoidPointer>::type hook_type;
+
+   typedef T value_type;
+   typedef typename rbtree_type<T>::type internal_type;
+
+   typedef rbtree_node<T, VoidPointer> node_type;
+
+   #ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   rbtree_node()
+      : m_data()
+   {}
+
+   rbtree_node(const rbtree_node &other)
+      : m_data(other.m_data)
+   {}
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                           \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   rbtree_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                        \
+      : m_data(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _))                     \
+   {}                                                                                        \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #else //#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template<class ...Args>
+   rbtree_node(Args &&...args)
+      : m_data(boost::forward<Args>(args)...)
+   {}
+   #endif//#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   rbtree_node &operator=(const rbtree_node &other)
+   {  do_assign(other.m_data);   return *this;  }
+
+   T &get_data()
+   {
+      T* ptr = reinterpret_cast<T*>(&this->m_data);
+      return *ptr;
+   }
+
+   const T &get_data() const
+   {
+      const T* ptr = reinterpret_cast<const T*>(&this->m_data);
+      return *ptr;
+   }
+
+   private:
+   internal_type m_data;
+
+   template<class A, class B>
+   void do_assign(const std::pair<const A, B> &p)
+   {
+      const_cast<A&>(m_data.first) = p.first;
+      m_data.second  = p.second;
+   }
+
+   template<class A, class B>
+   void do_assign(const pair<const A, B> &p)
+   {
+      const_cast<A&>(m_data.first) = p.first;
+      m_data.second  = p.second;
+   }
+
+   template<class V>
+   void do_assign(const V &v)
+   {  m_data = v; }
+
+   public:
+   template<class Convertible>
+   static void construct(node_type *ptr, BOOST_FWD_REF(Convertible) convertible)
+   {  new(ptr) node_type(boost::forward<Convertible>(convertible));  }
+};
+
+}//namespace containers_detail {
+#if !defined(BOOST_HAS_RVALUE_REFS)
+template<class T, class VoidPointer>
+struct has_own_construct_from_it
+   < boost::container::containers_detail::rbtree_node<T, VoidPointer> >
+{
+   static const bool value = true;
+};
+#endif
+namespace containers_detail {
+
+template<class A, class ValueCompare>
+struct intrusive_rbtree_type
+{
+   typedef typename A::value_type                  value_type;
+   typedef typename boost::pointer_to_other
+      <typename A::pointer, void>::type            void_pointer;
+   typedef typename containers_detail::rbtree_node
+         <value_type, void_pointer>                node_type;
+   typedef node_compare<ValueCompare, node_type>   node_compare_type;
+   typedef typename containers_detail::bi::make_rbtree
+      <node_type
+      ,containers_detail::bi::compare<node_compare_type>
+      ,containers_detail::bi::base_hook<typename rbtree_hook<void_pointer>::type>
+      ,containers_detail::bi::constant_time_size<true>
+      ,containers_detail::bi::size_type<typename A::size_type>
+      >::type                                      container_type;
+   typedef container_type                          type ;
+};
+
+}  //namespace containers_detail {
+
+namespace containers_detail {
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+class rbtree
+   : protected containers_detail::node_alloc_holder
+      <A, typename containers_detail::intrusive_rbtree_type
+         <A, value_compare_impl<Key, Value, KeyCompare, KeyOfValue>  
+         >::type
+      >
+{
+   typedef typename containers_detail::intrusive_rbtree_type
+         <A, value_compare_impl
+            <Key, Value, KeyCompare, KeyOfValue>
+         >::type                                      Icont;
+   typedef containers_detail::node_alloc_holder<A, Icont>        AllocHolder;
+   typedef typename AllocHolder::NodePtr              NodePtr;
+   typedef rbtree < Key, Value, KeyOfValue
+                  , KeyCompare, A>                    ThisType;
+   typedef typename AllocHolder::NodeAlloc            NodeAlloc;
+   typedef typename AllocHolder::ValAlloc             ValAlloc;
+   typedef typename AllocHolder::Node                 Node;
+   typedef typename Icont::iterator                   iiterator;
+   typedef typename Icont::const_iterator             iconst_iterator;
+   typedef containers_detail::allocator_destroyer<NodeAlloc>     Destroyer;
+   typedef typename AllocHolder::allocator_v1         allocator_v1;
+   typedef typename AllocHolder::allocator_v2         allocator_v2;
+   typedef typename AllocHolder::alloc_version        alloc_version;
+
+   class RecyclingCloner;
+   friend class RecyclingCloner;
+   
+   class RecyclingCloner
+   {
+      public:
+      RecyclingCloner(AllocHolder &holder, Icont &irbtree)
+         :  m_holder(holder), m_icont(irbtree)
+      {}
+
+      NodePtr operator()(const Node &other) const
+      {
+//         if(!m_icont.empty()){
+         if(NodePtr p = m_icont.unlink_leftmost_without_rebalance()){
+            //First recycle a node (this can't throw)
+            //NodePtr p = m_icont.unlink_leftmost_without_rebalance();
+            try{
+               //This can throw
+               *p = other;
+               return p;
+            }
+            catch(...){
+               //If there is an exception destroy the whole source
+               m_holder.destroy_node(p);
+               while((p = m_icont.unlink_leftmost_without_rebalance())){
+                  m_holder.destroy_node(p);
+               }
+               throw;
+            }
+         }
+         else{
+            return m_holder.create_node(other);
+         }
+      }
+
+      AllocHolder &m_holder;
+      Icont &m_icont;
+   };
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(rbtree)
+
+   typedef Key                                        key_type;
+   typedef Value                                      value_type;
+   typedef A                                          allocator_type;
+   typedef KeyCompare                                 key_compare;
+   typedef value_compare_impl< Key, Value
+                        , KeyCompare, KeyOfValue>     value_compare;
+   typedef typename A::pointer                        pointer;
+   typedef typename A::const_pointer                  const_pointer;
+   typedef typename A::reference                      reference;
+   typedef typename A::const_reference                const_reference;
+   typedef typename A::size_type                      size_type;
+   typedef typename A::difference_type                difference_type;
+   typedef difference_type                            rbtree_difference_type;
+   typedef pointer                                    rbtree_pointer;
+   typedef const_pointer                              rbtree_const_pointer;
+   typedef reference                                  rbtree_reference;
+   typedef const_reference                            rbtree_const_reference;
+   typedef NodeAlloc                                  stored_allocator_type;
+
+   private:
+
+   template<class KeyValueCompare>
+   struct key_node_compare
+      :  private KeyValueCompare
+   {
+      key_node_compare(KeyValueCompare comp)
+         :  KeyValueCompare(comp)
+      {}
+      
+      template<class KeyType>
+      bool operator()(const Node &n, const KeyType &k) const
+      {  return KeyValueCompare::operator()(n.get_data(), k);  }
+
+      template<class KeyType>
+      bool operator()(const KeyType &k, const Node &n) const
+      {  return KeyValueCompare::operator()(k, n.get_data());  }
+   };
+
+   typedef key_node_compare<value_compare>  KeyNodeCompare;
+
+   public:
+   //rbtree const_iterator
+   class const_iterator
+      : public std::iterator
+         < std::bidirectional_iterator_tag
+         , value_type            , rbtree_difference_type
+         , rbtree_const_pointer  , rbtree_const_reference>
+   {
+      protected:
+      typedef typename Icont::iterator  iiterator;
+      iiterator m_it;
+      explicit const_iterator(iiterator it)  : m_it(it){}
+      void prot_incr() { ++m_it; }
+      void prot_decr() { --m_it; }
+
+      private:
+      iiterator get()
+      {  return this->m_it;   }
+
+      public:
+      friend class rbtree <Key, Value, KeyOfValue, KeyCompare, A>;
+      typedef rbtree_difference_type        difference_type;
+
+      //Constructors
+      const_iterator()
+         :  m_it()
+      {}
+
+      //Pointer like operators
+      const_reference operator*()  const 
+      { return  m_it->get_data();  }
+
+      const_pointer   operator->() const 
+      { return  const_pointer(&m_it->get_data()); }
+
+      //Increment / Decrement
+      const_iterator& operator++()       
+      { prot_incr();  return *this; }
+
+      const_iterator operator++(int)      
+      { iiterator tmp = m_it; ++*this; return const_iterator(tmp);  }
+
+      const_iterator& operator--()
+      {   prot_decr(); return *this;   }
+
+      const_iterator operator--(int)
+      {  iiterator tmp = m_it; --*this; return const_iterator(tmp); }
+
+      //Comparison operators
+      bool operator==   (const const_iterator& r)  const
+      {  return m_it == r.m_it;  }
+
+      bool operator!=   (const const_iterator& r)  const
+      {  return m_it != r.m_it;  }
+   };
+
+   //rbtree iterator
+   class iterator : public const_iterator
+   {
+      private:
+      explicit iterator(iiterator it)
+         :  const_iterator(it)
+      {}
+   
+      iiterator get()
+      {  return this->m_it;   }
+
+      public:
+      friend class rbtree <Key, Value, KeyOfValue, KeyCompare, A>;
+      typedef rbtree_pointer       pointer;
+      typedef rbtree_reference     reference;
+
+      //Constructors
+      iterator(){}
+
+      //Pointer like operators
+      reference operator*()  const {  return  this->m_it->get_data();  }
+      pointer   operator->() const {  return  pointer(&this->m_it->get_data());  }
+
+      //Increment / Decrement
+      iterator& operator++()  
+         { this->prot_incr(); return *this;  }
+
+      iterator operator++(int)
+         { iiterator tmp = this->m_it; ++*this; return iterator(tmp); }
+      
+      iterator& operator--()
+         {  this->prot_decr(); return *this;  }
+
+      iterator operator--(int)
+         {  iterator tmp = *this; --*this; return tmp; }
+   };
+
+   typedef std::reverse_iterator<iterator>        reverse_iterator;
+   typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
+
+   rbtree(const key_compare& comp = key_compare(), 
+           const allocator_type& a = allocator_type())
+      : AllocHolder(a, comp)
+   {}
+
+   template <class InputIterator>
+   rbtree(InputIterator first, InputIterator last, const key_compare& comp,
+          const allocator_type& a, bool unique_insertion)
+      : AllocHolder(a, comp)
+   {
+      typedef typename std::iterator_traits<InputIterator>::iterator_category ItCat;
+      priv_create_and_insert_nodes(first, last, unique_insertion, alloc_version(), ItCat());
+   }
+
+   rbtree(const rbtree& x) 
+      :  AllocHolder(x, x.key_comp())
+   {
+      this->icont().clone_from
+         (x.icont(), typename AllocHolder::cloner(*this), Destroyer(this->node_alloc()));
+   }
+
+   rbtree(BOOST_RV_REF(rbtree) x) 
+      :  AllocHolder(x, x.key_comp())
+   {  this->swap(x);  }
+
+   ~rbtree()
+   {} //AllocHolder clears the tree
+
+   rbtree& operator=(const rbtree& x)
+   {
+      if (this != &x) {
+         //Transfer all the nodes to a temporary tree
+         //If anything goes wrong, all the nodes will be destroyed
+         //automatically
+         Icont other_tree(this->icont().value_comp());
+         other_tree.swap(this->icont());
+
+         //Now recreate the source tree reusing nodes stored by other_tree
+         this->icont().clone_from
+            (x.icont()
+            , RecyclingCloner(*this, other_tree)
+            //, AllocHolder::cloner(*this)
+            , Destroyer(this->node_alloc()));
+
+         //If there are remaining nodes, destroy them
+         NodePtr p;
+         while((p = other_tree.unlink_leftmost_without_rebalance())){
+            AllocHolder::destroy_node(p);
+         }
+      }
+      return *this;
+   }
+
+   rbtree& operator=(BOOST_RV_REF(rbtree) mx)
+   {  this->clear(); this->swap(mx);   return *this;  }
+
+   public:    
+   // accessors:
+   value_compare value_comp() const 
+   {  return this->icont().value_comp().value_comp(); }
+
+   key_compare key_comp() const 
+   {  return this->icont().value_comp().value_comp().key_comp(); }
+
+   allocator_type get_allocator() const 
+   {  return allocator_type(this->node_alloc()); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   {  return this->node_alloc(); }
+
+   stored_allocator_type &get_stored_allocator()
+   {  return this->node_alloc(); }
+
+   iterator begin()
+   { return iterator(this->icont().begin()); }
+
+   const_iterator begin() const
+   {  return this->cbegin();  }
+
+   iterator end()
+   {  return iterator(this->icont().end());  }
+
+   const_iterator end() const
+   {  return this->cend();  }
+
+   reverse_iterator rbegin()
+   {  return reverse_iterator(end());  }
+
+   const_reverse_iterator rbegin() const
+   {  return this->crbegin();  }
+
+   reverse_iterator rend()
+   {  return reverse_iterator(begin());   }
+
+   const_reverse_iterator rend() const
+   {  return this->crend();   }
+
+   //! <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 cbegin() const 
+   { return const_iterator(this->non_const_icont().begin()); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend() const 
+   { return const_iterator(this->non_const_icont().end()); }
+
+   //! <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 crbegin() const 
+   { return const_reverse_iterator(cend()); } 
+
+   //! <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 crend() const 
+   { return const_reverse_iterator(cbegin()); }
+
+   bool empty() const 
+   {  return !this->size();  }
+
+   size_type size() const 
+   {  return this->icont().size();   }
+
+   size_type max_size() const 
+   {  return AllocHolder::max_size();  }
+
+   void swap(ThisType& x)
+   {  AllocHolder::swap(x);   }
+
+   public:
+
+   typedef typename Icont::insert_commit_data insert_commit_data;
+
+   // insert/erase
+   std::pair<iterator,bool> insert_unique_check
+      (const key_type& key, insert_commit_data &data)
+   {
+      std::pair<iiterator, bool> ret = 
+         this->icont().insert_unique_check(key, KeyNodeCompare(value_comp()), data);
+      return std::pair<iterator, bool>(iterator(ret.first), ret.second);
+   }
+
+   std::pair<iterator,bool> insert_unique_check
+      (const_iterator hint, const key_type& key, insert_commit_data &data)
+   {
+      std::pair<iiterator, bool> ret = 
+         this->icont().insert_unique_check(hint.get(), key, KeyNodeCompare(value_comp()), data);
+      return std::pair<iterator, bool>(iterator(ret.first), ret.second);
+   }
+
+   iterator insert_unique_commit(const value_type& v, insert_commit_data &data)
+   {
+      NodePtr tmp = AllocHolder::create_node(v);
+      iiterator it(this->icont().insert_unique_commit(*tmp, data));
+      return iterator(it);
+   }
+
+   template<class MovableConvertible>
+   iterator insert_unique_commit
+      (BOOST_FWD_REF(MovableConvertible) mv, insert_commit_data &data)
+   {
+      NodePtr tmp = AllocHolder::create_node(boost::forward<MovableConvertible>(mv));
+      iiterator it(this->icont().insert_unique_commit(*tmp, data));
+      return iterator(it);
+   }
+
+   std::pair<iterator,bool> insert_unique(const value_type& v)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         this->insert_unique_check(KeyOfValue()(v), data);
+      if(!ret.second)
+         return ret;
+      return std::pair<iterator,bool>
+         (this->insert_unique_commit(v, data), true);
+   }
+
+   template<class MovableConvertible>
+   std::pair<iterator,bool> insert_unique(BOOST_FWD_REF(MovableConvertible) mv)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         this->insert_unique_check(KeyOfValue()(mv), data);
+      if(!ret.second)
+         return ret;
+      return std::pair<iterator,bool>
+         (this->insert_unique_commit(boost::forward<MovableConvertible>(mv), data), true);
+   }
+
+   private:
+   iterator emplace_unique_impl(NodePtr p)
+   {
+      value_type &v = p->get_data();
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         this->insert_unique_check(KeyOfValue()(v), data);
+      if(!ret.second){
+         Destroyer(this->node_alloc())(p);
+         return ret.first;
+      }
+      return iterator(iiterator(this->icont().insert_unique_commit(*p, data)));
+   }
+
+   iterator emplace_unique_hint_impl(const_iterator hint, NodePtr p)
+   {
+      value_type &v = p->get_data();
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         this->insert_unique_check(hint, KeyOfValue()(v), data);
+      if(!ret.second){
+         Destroyer(this->node_alloc())(p);
+         return ret.first;
+      }
+      return iterator(iiterator(this->icont().insert_unique_commit(*p, data)));
+   }
+
+   public:
+
+   #ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template <class... Args>
+   iterator emplace_unique(Args&&... args)
+   {  return this->emplace_unique_impl(AllocHolder::create_node(boost::forward<Args>(args)...));   }
+
+   template <class... Args>
+   iterator emplace_hint_unique(const_iterator hint, Args&&... args)
+   {  return this->emplace_unique_hint_impl(hint, AllocHolder::create_node(boost::forward<Args>(args)...));   }
+
+   template <class... Args>
+   iterator emplace_equal(Args&&... args)
+   {
+      NodePtr p(AllocHolder::create_node(boost::forward<Args>(args)...));
+      return iterator(this->icont().insert_equal(this->icont().end(), *p));
+   }
+
+   template <class... Args>
+   iterator emplace_hint_equal(const_iterator hint, Args&&... args)
+   {
+      NodePtr p(AllocHolder::create_node(boost::forward<Args>(args)...));
+      return iterator(this->icont().insert_equal(hint.get(), *p));
+   }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace_unique()
+   {  return this->emplace_unique_impl(AllocHolder::create_node());   }
+
+   iterator emplace_hint_unique(const_iterator hint)
+   {  return this->emplace_unique_hint_impl(hint, AllocHolder::create_node());   }
+
+   iterator emplace_equal()
+   {
+      NodePtr p(AllocHolder::create_node());
+      return iterator(this->icont().insert_equal(this->icont().end(), *p));
+   }
+
+   iterator emplace_hint_equal(const_iterator hint)
+   {
+      NodePtr p(AllocHolder::create_node());
+      return iterator(this->icont().insert_equal(hint.get(), *p));
+   }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                          \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                               \
+   iterator emplace_unique(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                           \
+   {                                                                                                        \
+      return this->emplace_unique_impl                                                                      \
+         (AllocHolder::create_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));              \
+   }                                                                                                        \
+                                                                                                            \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                               \
+   iterator emplace_hint_unique(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _)) \
+   {                                                                                                        \
+      return this->emplace_unique_hint_impl                                                                 \
+         (hint, AllocHolder::create_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));        \
+   }                                                                                                        \
+                                                                                                            \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                               \
+   iterator emplace_equal(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                            \
+   {                                                                                                        \
+      NodePtr p(AllocHolder::create_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));        \
+      return iterator(this->icont().insert_equal(this->icont().end(), *p));                                 \
+   }                                                                                                        \
+                                                                                                            \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                               \
+   iterator emplace_hint_equal(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))  \
+   {                                                                                                        \
+      NodePtr p(AllocHolder::create_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));        \
+      return iterator(this->icont().insert_equal(hint.get(), *p));                                          \
+   }                                                                                                        \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator insert_unique(const_iterator hint, const value_type& v)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         this->insert_unique_check(hint, KeyOfValue()(v), data);
+      if(!ret.second)
+         return ret.first;
+      return this->insert_unique_commit(v, data);
+   }
+
+   template<class MovableConvertible>
+   iterator insert_unique(const_iterator hint, BOOST_FWD_REF(MovableConvertible) mv)
+   {
+      insert_commit_data data;
+      std::pair<iterator,bool> ret =
+         this->insert_unique_check(hint, KeyOfValue()(mv), data);
+      if(!ret.second)
+         return ret.first;
+      return this->insert_unique_commit(boost::forward<MovableConvertible>(mv), data);
+   }
+
+   template <class InputIterator>
+   void insert_unique(InputIterator first, InputIterator last)
+   {
+      if(this->empty()){
+         //Insert with end hint, to achieve linear
+         //complexity if [first, last) is ordered
+         const_iterator end(this->end());
+         for( ; first != last; ++first)
+            this->insert_unique(end, *first);
+      }
+      else{
+         for( ; first != last; ++first)
+            this->insert_unique(*first);
+      }
+   }
+
+   iterator insert_equal(const value_type& v)
+   {
+      NodePtr p(AllocHolder::create_node(v));
+      return iterator(this->icont().insert_equal(this->icont().end(), *p));
+   }
+
+   template<class MovableConvertible>
+   iterator insert_equal(BOOST_FWD_REF(MovableConvertible) mv)
+   {
+      NodePtr p(AllocHolder::create_node(boost::forward<MovableConvertible>(mv)));
+      return iterator(this->icont().insert_equal(this->icont().end(), *p));
+   }
+
+   iterator insert_equal(const_iterator hint, const value_type& v)
+   {
+      NodePtr p(AllocHolder::create_node(v));
+      return iterator(this->icont().insert_equal(hint.get(), *p));
+   }
+
+   template<class MovableConvertible>
+   iterator insert_equal(const_iterator hint, BOOST_FWD_REF(MovableConvertible) mv)
+   {
+      NodePtr p(AllocHolder::create_node(boost::forward<MovableConvertible>(mv)));
+      return iterator(this->icont().insert_equal(hint.get(), *p));
+   }
+
+   template <class InputIterator>
+   void insert_equal(InputIterator first, InputIterator last)
+   {
+      //Insert with end hint, to achieve linear
+      //complexity if [first, last) is ordered
+      const_iterator end(this->cend());
+      for( ; first != last; ++first)
+         this->insert_equal(end, *first);
+   }
+
+   iterator erase(const_iterator position)
+   {  return iterator(this->icont().erase_and_dispose(position.get(), Destroyer(this->node_alloc()))); }
+
+   size_type erase(const key_type& k)
+   {  return AllocHolder::erase_key(k, KeyNodeCompare(value_comp()), alloc_version()); }
+
+   iterator erase(const_iterator first, const_iterator last)
+   {  return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version())); }
+
+   void clear() 
+   {  AllocHolder::clear(alloc_version());  }
+
+   // set operations:
+   iterator find(const key_type& k)
+   {  return iterator(this->icont().find(k, KeyNodeCompare(value_comp())));  }
+
+   const_iterator find(const key_type& k) const
+   {  return const_iterator(this->non_const_icont().find(k, KeyNodeCompare(value_comp())));  }
+
+   size_type count(const key_type& k) const
+   {  return size_type(this->icont().count(k, KeyNodeCompare(value_comp()))); }
+
+   iterator lower_bound(const key_type& k)
+   {  return iterator(this->icont().lower_bound(k, KeyNodeCompare(value_comp())));  }
+
+   const_iterator lower_bound(const key_type& k) const
+   {  return const_iterator(this->non_const_icont().lower_bound(k, KeyNodeCompare(value_comp())));  }
+
+   iterator upper_bound(const key_type& k)
+   {  return iterator(this->icont().upper_bound(k, KeyNodeCompare(value_comp())));   }
+
+   const_iterator upper_bound(const key_type& k) const
+   {  return const_iterator(this->non_const_icont().upper_bound(k, KeyNodeCompare(value_comp())));  }
+
+   std::pair<iterator,iterator> equal_range(const key_type& k)
+   {  
+      std::pair<iiterator, iiterator> ret =
+         this->icont().equal_range(k, KeyNodeCompare(value_comp()));
+      return std::pair<iterator,iterator>(iterator(ret.first), iterator(ret.second));
+   }
+
+   std::pair<const_iterator, const_iterator> equal_range(const key_type& k) const
+   {  
+      std::pair<iiterator, iiterator> ret =
+         this->non_const_icont().equal_range(k, KeyNodeCompare(value_comp()));
+      return std::pair<const_iterator,const_iterator>
+         (const_iterator(ret.first), const_iterator(ret.second));
+   }
+
+   private:
+   //Iterator range version
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (InpIterator beg, InpIterator end, bool unique)
+   {
+      typedef typename std::iterator_traits<InpIterator>::iterator_category ItCat;
+      priv_create_and_insert_nodes(beg, end, unique, alloc_version(), ItCat());
+   }
+
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (InpIterator beg, InpIterator end, bool unique, allocator_v1, std::input_iterator_tag)
+   {
+      if(unique){
+         for (; beg != end; ++beg){
+            this->insert_unique(*beg);
+         }
+      }
+      else{
+         for (; beg != end; ++beg){
+            this->insert_equal(*beg);
+         }
+      }
+   }
+
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (InpIterator beg, InpIterator end, bool unique, allocator_v2, std::input_iterator_tag)
+   {  //Just forward to the default one
+      priv_create_and_insert_nodes(beg, end, unique, allocator_v1(), std::input_iterator_tag());
+   }
+
+   class insertion_functor;
+   friend class insertion_functor;
+
+   class insertion_functor
+   {
+      Icont &icont_;
+
+      public:
+      insertion_functor(Icont &icont)
+         :  icont_(icont)
+      {}
+
+      void operator()(Node &n)
+      {  this->icont_.insert_equal(this->icont_.cend(), n); }
+   };
+
+
+   template<class FwdIterator>
+   void priv_create_and_insert_nodes
+      (FwdIterator beg, FwdIterator end, bool unique, allocator_v2, std::forward_iterator_tag)
+   {
+      if(beg != end){
+         if(unique){
+            priv_create_and_insert_nodes(beg, end, unique, allocator_v2(), std::input_iterator_tag());
+         }
+         else{
+            //Optimized allocation and construction
+            this->allocate_many_and_construct
+               (beg, std::distance(beg, end), insertion_functor(this->icont()));
+         }
+      }
+   }
+};
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+inline bool 
+operator==(const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& x, 
+           const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& y)
+{
+  return x.size() == y.size() &&
+         std::equal(x.begin(), x.end(), y.begin());
+}
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+inline bool 
+operator<(const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& x, 
+          const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& y)
+{
+  return std::lexicographical_compare(x.begin(), x.end(), 
+                                      y.begin(), y.end());
+}
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+inline bool 
+operator!=(const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& x, 
+           const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& y) {
+  return !(x == y);
+}
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+inline bool 
+operator>(const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& x, 
+          const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& y) {
+  return y < x;
+}
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+inline bool 
+operator<=(const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& x, 
+           const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& y) {
+  return !(y < x);
+}
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+inline bool 
+operator>=(const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& x, 
+           const rbtree<Key,Value,KeyOfValue,KeyCompare,A>& y) {
+  return !(x < y);
+}
+
+
+template <class Key, class Value, class KeyOfValue, 
+          class KeyCompare, class A>
+inline void 
+swap(rbtree<Key,Value,KeyOfValue,KeyCompare,A>& x, 
+     rbtree<Key,Value,KeyOfValue,KeyCompare,A>& y)
+{
+  x.swap(y);
+}
+
+} //namespace containers_detail {
+} //namespace container {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class K, class V, class KOV, 
+class C, class A>
+struct has_trivial_destructor_after_move
+   <boost::container::containers_detail::rbtree<K, V, KOV, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+} //namespace boost  {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINERS_TREE_HPP
Added: sandbox/move/boost/container/detail/type_traits.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/type_traits.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,166 @@
+//////////////////////////////////////////////////////////////////////////////
+// (C) Copyright John Maddock 2000.
+// (C) Copyright Ion Gaztanaga 2005-2008.
+//
+// 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/container for documentation.
+//
+// The alignment_of implementation comes from John Maddock's boost::alignment_of code
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_CONTAINER_DETAIL_TYPE_TRAITS_HPP
+#define BOOST_CONTAINERS_CONTAINER_DETAIL_TYPE_TRAITS_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+struct nat{};
+
+//boost::alignment_of yields to 10K lines of preprocessed code, so we
+//need an alternative
+template <typename T> struct alignment_of;
+
+template <typename T>
+struct alignment_of_hack
+{
+    char c;
+    T t;
+    alignment_of_hack();
+};
+
+template <unsigned A, unsigned S>
+struct alignment_logic
+{
+    enum{   value = A < S ? A : S  };
+};
+
+template< typename T >
+struct alignment_of
+{
+   enum{ value = alignment_logic
+            < sizeof(alignment_of_hack<T>) - sizeof(T)
+            , sizeof(T)>::value   };
+};
+
+//This is not standard, but should work with all compilers
+union max_align
+{
+   char        char_;
+   short       short_;
+   int         int_;
+   long        long_;
+   #ifdef BOOST_HAS_LONG_LONG
+   long long   long_long_;
+   #endif
+   float       float_;
+   double      double_;
+   long double long_double_;
+   void *      void_ptr_;
+};
+
+template<class T>
+struct remove_reference
+{
+   typedef T type;
+};
+
+template<class T>
+struct remove_reference<T&>
+{
+   typedef T type;
+};
+
+template<class T>
+struct is_reference
+{
+   enum {  value = false   };
+};
+
+template<class T>
+struct is_reference<T&>
+{
+   enum {  value = true   };
+};
+
+template<class T>
+struct is_pointer
+{
+   enum {  value = false   };
+};
+
+template<class T>
+struct is_pointer<T*>
+{
+   enum {  value = true   };
+};
+
+template <typename T>
+struct add_reference
+{
+    typedef T& type;
+};
+
+template<class T>
+struct add_reference<T&>
+{
+    typedef T& type;
+};
+
+template<>
+struct add_reference<void>
+{
+    typedef nat &type;
+};
+
+template<>
+struct add_reference<const void>
+{
+    typedef const nat &type;
+};
+
+template <class T>
+struct add_const_reference
+{  typedef const T &type;   };
+
+template <class T>
+struct add_const_reference<T&>
+{  typedef T& type;   };
+
+template <typename T, typename U>
+struct is_same
+{
+   typedef char yes_type;
+   struct no_type
+   {
+      char padding[8];
+   };
+
+   template <typename V>
+   static yes_type is_same_tester(V*, V*);
+   static no_type is_same_tester(...);
+
+   static T *t;
+   static U *u;
+
+   static const bool value = sizeof(yes_type) == sizeof(is_same_tester(t,u));
+};
+
+} // namespace containers_detail
+}  //namespace container { 
+}  //namespace boost {
+
+#endif   //#ifndef BOOST_CONTAINERS_CONTAINER_DETAIL_TYPE_TRAITS_HPP
+
+#include <boost/container/detail/config_end.hpp>
+
Added: sandbox/move/boost/container/detail/utilities.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/utilities.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,95 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_UTILITIES_HPP
+#define BOOST_CONTAINERS_DETAIL_UTILITIES_HPP
+
+#include <boost/container/detail/config_begin.hpp>
+#include <cstdio>
+#include <algorithm>
+
+namespace boost {
+namespace container {
+namespace containers_detail {
+
+template <class SizeType>
+SizeType
+   get_next_capacity(const SizeType max_size
+                    ,const SizeType capacity
+                    ,const SizeType n)
+{
+//   if (n > max_size - capacity)
+//      throw std::length_error("get_next_capacity");
+
+   const SizeType m3 = max_size/3;
+
+   if (capacity < m3)
+      return capacity + max_value(3*(capacity+1)/5, n);
+
+   if (capacity < m3*2)
+      return capacity + max_value((capacity+1)/2, n);
+
+   return max_size;
+}
+
+template<class T>
+const T &max_value(const T &a, const T &b)
+{  return a > b ? a : b;   }
+
+template<class T>
+const T &min_value(const T &a, const T &b)
+{  return a < b ? a : b;   }
+
+template<class SmartPtr>
+struct smart_ptr_type
+{
+   typedef typename SmartPtr::value_type value_type;
+   typedef value_type *pointer;
+   static pointer get (const SmartPtr &smartptr)
+   {  return smartptr.get();}
+};
+
+template<class T>
+struct smart_ptr_type<T*>
+{
+   typedef T value_type;
+   typedef value_type *pointer;
+   static pointer get (pointer ptr)
+   {  return ptr;}
+};
+
+//!Overload for smart pointers to avoid ADL problems with get_pointer
+template<class Ptr>
+inline typename smart_ptr_type<Ptr>::pointer
+get_pointer(const Ptr &ptr)
+{  return smart_ptr_type<Ptr>::get(ptr);   }
+
+//!To avoid ADL problems with swap
+template <class T>
+inline void do_swap(T& x, T& y)
+{
+   using std::swap;
+   swap(x, y);
+}
+
+template <std::size_t OrigSize, std::size_t RoundTo>
+struct ct_rounded_size
+{
+   enum { value = ((OrigSize-1)/RoundTo+1)*RoundTo };
+};
+
+}  //namespace containers_detail {
+}  //namespace container {
+}  //namespace boost {
+
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_UTILITIES_HPP
Added: sandbox/move/boost/container/detail/value_init.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/value_init.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2009.
+//
+// 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_VALUE_INIT_HPP
+#define BOOST_CONTAINERS_DETAIL_VALUE_INIT_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+template<class T>
+struct value_init
+{
+   value_init()
+      : m_t()
+   {}
+
+   T m_t;
+};
+
+}  //namespace containers_detail { 
+}  //namespace container { 
+}  //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_VALUE_INIT_HPP
Added: sandbox/move/boost/container/detail/variadic_templates_tools.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/variadic_templates_tools.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,153 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2008-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP
+#define BOOST_CONTAINERS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/type_traits.hpp>
+#include <cstddef>   //std::size_t
+
+namespace boost {
+namespace container { 
+namespace containers_detail {
+
+template<typename... Values>
+class tuple;
+
+template<> class tuple<>
+{};
+
+template<typename Head, typename... Tail>
+class tuple<Head, Tail...>
+   : private tuple<Tail...>
+{
+   typedef tuple<Tail...> inherited;
+
+   public:
+   tuple() { }
+
+   // implicit copy-constructor is okay
+   // Construct tuple from separate arguments.
+   tuple(typename add_const_reference<Head>::type v,
+         typename add_const_reference<Tail>::type... vtail)
+   : inherited(vtail...), m_head(v)
+   {}
+
+   // Construct tuple from another tuple.
+   template<typename... VValues>
+   tuple(const tuple<VValues...>& other)
+      : m_head(other.head()), inherited(other.tail())
+   {}
+
+   template<typename... VValues>
+   tuple& operator=(const tuple<VValues...>& other)
+   {
+      m_head = other.head();
+      tail() = other.tail();
+      return this;
+   }
+
+   typename add_reference<Head>::type head()             {  return m_head; }
+   typename add_reference<const Head>::type head() const {  return m_head; }
+
+   inherited& tail()             { return *this; }
+   const inherited& tail() const { return *this; }
+
+   protected:
+   Head m_head;
+};
+
+
+template<typename... Values>
+tuple<Values&&...> tie_forward(Values&&... values)
+{ return tuple<Values&&...>(values...); }
+
+template<int I, typename Tuple>
+struct tuple_element;
+
+template<int I, typename Head, typename... Tail>
+struct tuple_element<I, tuple<Head, Tail...> >
+{
+   typedef typename tuple_element<I-1, tuple<Tail...> >::type type;
+};
+
+template<typename Head, typename... Tail>
+struct tuple_element<0, tuple<Head, Tail...> >
+{
+   typedef Head type;
+};
+
+template<int I, typename Tuple>
+class get_impl;
+
+template<int I, typename Head, typename... Values>
+class get_impl<I, tuple<Head, Values...> >
+{
+   typedef typename tuple_element<I-1, tuple<Values...> >::type   Element;
+   typedef get_impl<I-1, tuple<Values...> >                       Next;
+
+   public:
+   typedef typename add_reference<Element>::type                  type;
+   typedef typename add_const_reference<Element>::type            const_type;
+   static type get(tuple<Head, Values...>& t)              { return Next::get(t.tail()); }
+   static const_type get(const tuple<Head, Values...>& t)  { return Next::get(t.tail()); }
+};
+
+template<typename Head, typename... Values>
+class get_impl<0, tuple<Head, Values...> >
+{
+   public:
+   typedef typename add_reference<Head>::type         type;
+   typedef typename add_const_reference<Head>::type   const_type;
+   static type       get(tuple<Head, Values...>& t)      { return t.head(); }
+   static const_type get(const tuple<Head, Values...>& t){ return t.head(); }
+};
+
+template<int I, typename... Values>
+typename get_impl<I, tuple<Values...> >::type get(tuple<Values...>& t)
+{  return get_impl<I, tuple<Values...> >::get(t);  }
+
+template<int I, typename... Values>
+typename get_impl<I, tuple<Values...> >::const_type get(const tuple<Values...>& t)
+{  return get_impl<I, tuple<Values...> >::get(t);  }
+
+////////////////////////////////////////////////////
+// Builds an index_tuple<0, 1, 2, ..., Num-1>, that will
+// be used to "unpack" into comma-separated values
+// in a function call.
+////////////////////////////////////////////////////
+
+template<int... Indexes>
+struct index_tuple{};
+
+template<std::size_t Num, typename Tuple = index_tuple<> >
+struct build_number_seq;
+
+template<std::size_t Num, int... Indexes> 
+struct build_number_seq<Num, index_tuple<Indexes...> >
+   : build_number_seq<Num - 1, index_tuple<Indexes..., sizeof...(Indexes)> >
+{};
+
+template<int... Indexes>
+struct build_number_seq<0, index_tuple<Indexes...> >
+{  typedef index_tuple<Indexes...> type;  };
+
+
+}}}   //namespace boost { namespace container { namespace containers_detail {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP
Added: sandbox/move/boost/container/detail/version_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/version_type.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,89 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+//       This code comes from N1953 document by Howard E. Hinnant
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+#ifndef BOOST_CONTAINERS_DETAIL_VERSION_TYPE_HPP
+#define BOOST_CONTAINERS_DETAIL_VERSION_TYPE_HPP
+
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/type_traits.hpp>
+
+
+namespace boost{
+namespace container {
+namespace containers_detail {
+
+//using namespace boost;
+
+template <class T, unsigned V>
+struct version_type
+    : public containers_detail::integral_constant<unsigned, V>
+{
+    typedef T type;
+
+    version_type(const version_type<T, 0>&);
+};
+
+namespace impl{
+
+template <class T, 
+          bool = containers_detail::is_convertible<version_type<T, 0>, typename T::version>::value>
+struct extract_version
+{
+   static const unsigned value = 1;
+};
+
+template <class T>
+struct extract_version<T, true>
+{
+   static const unsigned value = T::version::value;
+};
+
+template <class T>
+struct has_version
+{
+   private:
+   struct two {char _[2];};
+   template <class U> static two test(...);
+   template <class U> static char test(const typename U::version*);
+   public:
+   static const bool value = sizeof(test<T>(0)) == 1;
+   void dummy(){}
+};
+
+template <class T, bool = has_version<T>::value>
+struct version
+{
+   static const unsigned value = 1;
+};
+
+template <class T>
+struct version<T, true>
+{
+   static const unsigned value = extract_version<T>::value;
+};
+
+}  //namespace impl
+
+template <class T>
+struct version
+   : public containers_detail::integral_constant<unsigned, impl::version<T>::value>
+{
+};
+
+}  //namespace containers_detail {
+}  //namespace container {
+}  //namespace boost{
+
+#endif   //#define BOOST_CONTAINERS_DETAIL_VERSION_TYPE_HPP
Added: sandbox/move/boost/container/detail/workaround.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/detail/workaround.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,24 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_DETAIL_WORKAROUND_HPP
+#define BOOST_CONTAINERS_DETAIL_WORKAROUND_HPP
+
+#include <boost/container/detail/config_begin.hpp>
+
+#if     defined(BOOST_HAS_RVALUE_REFS) && defined(BOOST_HAS_VARIADIC_TMPL)\
+    && !defined(BOOST_CONTAINER_DISABLE_VARIADIC_TMPL)
+#define BOOST_CONTAINERS_PERFECT_FORWARDING
+
+#endif
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_CONTAINERS_DETAIL_WORKAROUND_HPP
Added: sandbox/move/boost/container/flat_map.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/flat_map.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1382 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_FLAT_MAP_HPP
+#define BOOST_CONTAINERS_FLAT_MAP_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/containers_fwd.hpp>
+#include <utility>
+#include <functional>
+#include <memory>
+#include <stdexcept>
+#include <boost/container/detail/flat_tree.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/move/move.hpp>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+// Forward declarations of operators == and <, needed for friend declarations.
+template <class Key, class T, class Pred, class Alloc>
+class flat_map;
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const flat_map<Key,T,Pred,Alloc>& x, 
+                       const flat_map<Key,T,Pred,Alloc>& y);
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const flat_map<Key,T,Pred,Alloc>& x, 
+                      const flat_map<Key,T,Pred,Alloc>& y);
+/// @endcond
+
+//! A flat_map is a kind of associative container that supports unique keys (contains at
+//! most one of each key value) and provides for fast retrieval of values of another 
+//! type T based on the keys. The flat_map class supports random-access iterators.
+//! 
+//! A flat_map satisfies all of the requirements of a container and of a reversible 
+//! container and of an associative container. A flat_map also provides 
+//! most operations described for unique keys. For a 
+//! flat_map<Key,T> the key_type is Key and the value_type is std::pair<Key,T>
+//! (unlike std::map<Key, T> which value_type is std::pair<<b>const</b> Key, T>).
+//!
+//! Pred is the ordering function for Keys (e.g. <i>std::less<Key></i>).
+//!
+//! Alloc is the allocator to allocate the value_types
+//! (e.g. <i>allocator< std::pair<Key, T> ></i>).
+//! 
+//! flat_map is similar to std::map but it's implemented like an ordered vector.
+//! This means that inserting a new element into a flat_map invalidates
+//! previous iterators and references
+//!
+//! Erasing an element of a flat_map invalidates iterators and references 
+//! pointing to elements that come after (their keys are bigger) the erased element.
+template <class Key, class T, class Pred, class Alloc>
+class flat_map 
+{
+   /// @cond
+   private:
+   //This is the tree that we should store if pair was movable
+   typedef containers_detail::flat_tree<Key, 
+                           std::pair<Key, T>, 
+                           containers_detail::select1st< std::pair<Key, T> >, 
+                           Pred, 
+                           Alloc> tree_t;
+
+   //This is the real tree stored here. It's based on a movable pair
+   typedef containers_detail::flat_tree<Key, 
+                           containers_detail::pair<Key, T>, 
+                           containers_detail::select1st<containers_detail::pair<Key, T> >, 
+                           Pred, 
+                           typename Alloc::template
+                              rebind<containers_detail::pair<Key, T> >::other> impl_tree_t;
+   impl_tree_t m_flat_tree;  // flat tree representing flat_map
+
+   typedef typename impl_tree_t::value_type              impl_value_type;
+   typedef typename impl_tree_t::pointer                 impl_pointer;
+   typedef typename impl_tree_t::const_pointer           impl_const_pointer;
+   typedef typename impl_tree_t::reference               impl_reference;
+   typedef typename impl_tree_t::const_reference         impl_const_reference;
+   typedef typename impl_tree_t::value_compare           impl_value_compare;
+   typedef typename impl_tree_t::iterator                impl_iterator;
+   typedef typename impl_tree_t::const_iterator          impl_const_iterator;
+   typedef typename impl_tree_t::reverse_iterator        impl_reverse_iterator;
+   typedef typename impl_tree_t::const_reverse_iterator  impl_const_reverse_iterator;
+   typedef typename impl_tree_t::allocator_type          impl_allocator_type;
+
+   template<class D, class S>
+   static D &force(const S &s)
+   {  return *const_cast<D*>(reinterpret_cast<const D*>(&s)); }
+
+   template<class D, class S>
+   static D force_copy(S s)
+   {
+      value_type *vp = reinterpret_cast<value_type *>(&*s);
+      return D(vp);
+   }
+
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(flat_map)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef typename tree_t::value_compare          value_compare;
+   typedef T                                       mapped_type;
+   typedef typename tree_t::key_compare            key_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+
+   //! <b>Effects</b>: Constructs an empty flat_map using the specified
+   //! comparison object and allocator.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit flat_map(const Pred& comp = Pred(), const allocator_type& a = allocator_type()) 
+      : m_flat_tree(comp, force<impl_allocator_type>(a)) {}
+
+   //! <b>Effects</b>: Constructs an empty flat_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_map(InputIterator first, InputIterator last, const Pred& comp = Pred(),
+         const allocator_type& a = allocator_type())
+      : m_flat_tree(comp, force<impl_allocator_type>(a)) 
+      { m_flat_tree.insert_unique(first, last); }
+
+   //! <b>Effects</b>: Copy constructs a flat_map.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   flat_map(const flat_map<Key,T,Pred,Alloc>& x) 
+      : m_flat_tree(x.m_flat_tree) {}
+
+   //! <b>Effects</b>: Move constructs a flat_map.
+   //!   Constructs *this using x's resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
+   flat_map(BOOST_RV_REF(flat_map) x) 
+      : m_flat_tree(boost::move(x.m_flat_tree))
+   {}
+
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   flat_map<Key,T,Pred,Alloc>& operator=(const flat_map<Key, T, Pred, Alloc>& x)
+      {  m_flat_tree = x.m_flat_tree;   return *this;  }
+
+   //! <b>Effects</b>: Move constructs a flat_map.
+   //!   Constructs *this using x's resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
+   flat_map<Key,T,Pred,Alloc>& operator=(BOOST_RV_REF(flat_map) mx)
+   {  m_flat_tree = boost::move(mx.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 force<key_compare>(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 value_compare(force<key_compare>(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 force<allocator_type>(m_flat_tree.get_allocator()); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+      { return force<stored_allocator_type>(m_flat_tree.get_stored_allocator()); }
+
+   stored_allocator_type &get_stored_allocator()
+      { return force<stored_allocator_type>(m_flat_tree.get_stored_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 force_copy<iterator>(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 force<const_iterator>(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 cbegin() const 
+      { return force<const_iterator>(m_flat_tree.cbegin()); }
+
+   //! <b>Effects</b>: Returns an iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator end() 
+      { return force_copy<iterator>(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 force<const_iterator>(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 cend() const 
+      { return force<const_iterator>(m_flat_tree.cend()); }
+
+   //! <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 force<reverse_iterator>(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 force<const_reverse_iterator>(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 crbegin() const 
+      { return force<const_reverse_iterator>(m_flat_tree.crbegin()); }
+
+   //! <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 force<reverse_iterator>(m_flat_tree.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 force<const_reverse_iterator>(m_flat_tree.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 crend() const 
+      { return force<const_reverse_iterator>(m_flat_tree.crend()); }
+
+   //! <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(); }
+
+   //! Effects: If there is no key equivalent to x in the flat_map, inserts 
+   //!   value_type(x, T()) into the flat_map.
+   //! 
+   //! Returns: A reference to the mapped_type corresponding to x in *this.
+   //! 
+   //! Complexity: Logarithmic.
+   T &operator[](const key_type& k) 
+   {
+      iterator i = lower_bound(k);
+      // i->first is greater than or equivalent to k.
+      if (i == end() || key_comp()(k, (*i).first))
+         i = insert(i, value_type(k, T()));
+      return (*i).second;
+   }
+
+   //! Effects: If there is no key equivalent to x in the flat_map, inserts 
+   //! value_type(move(x), T()) into the flat_map (the key is move-constructed)
+   //! 
+   //! Returns: A reference to the mapped_type corresponding to x in *this.
+   //! 
+   //! Complexity: Logarithmic.
+   T &operator[](BOOST_RV_REF(key_type) mk) 
+   {
+      key_type &k = mk;
+      iterator i = lower_bound(k);
+      // i->first is greater than or equivalent to k.
+      if (i == end() || key_comp()(k, (*i).first))
+         i = insert(i, value_type(boost::move(k), boost::move(T())));
+      return (*i).second;
+   }
+
+   //! Returns: A reference to the element whose key is equivalent to x.
+   //! Throws: An exception object of type out_of_range if no such element is present.
+   //! Complexity: logarithmic.
+   T& at(const key_type& k)
+   {
+      iterator i = this->find(k);
+      if(i == this->end()){
+         throw std::out_of_range("key not found");
+      }
+      return i->second;
+   }
+
+   //! Returns: A reference to the element whose key is equivalent to x.
+   //! Throws: An exception object of type out_of_range if no such element is present.
+   //! Complexity: logarithmic.
+   const T& at(const key_type& k) const
+   {
+      const_iterator i = this->find(k);
+      if(i == this->end()){
+         throw std::out_of_range("key not found");
+      }
+      return i->second;
+   }
+
+   //! <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_map& x)
+   { m_flat_tree.swap(x.m_flat_tree); }
+
+   //! <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 force<std::pair<iterator,bool> >(
+         m_flat_tree.insert_unique(force<impl_value_type>(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(BOOST_RV_REF(value_type) x) 
+   {  return force<std::pair<iterator,bool> >(
+      m_flat_tree.insert_unique(boost::move(force<impl_value_type>(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(BOOST_RV_REF(impl_value_type) x) 
+   {
+      return force<std::pair<iterator,bool> >
+      (m_flat_tree.insert_unique(boost::move(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(const_iterator position, const value_type& x)
+      { return force_copy<iterator>(
+         m_flat_tree.insert_unique(force<impl_const_iterator>(position), force<impl_value_type>(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(const_iterator position, BOOST_RV_REF(value_type) x)
+      { return force_copy<iterator>(
+         m_flat_tree.insert_unique(force<impl_const_iterator>(position), boost::move(force<impl_value_type>(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(const_iterator position, BOOST_RV_REF(impl_value_type) x)
+   {
+      return force_copy<iterator>(
+         m_flat_tree.insert_unique(force<impl_const_iterator>(position), boost::move(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);  }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return force_copy<iterator>(m_flat_tree.emplace_unique(boost::forward<Args>(args)...)); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {  return force_copy<iterator>(m_flat_tree.emplace_hint_unique(force<impl_const_iterator>(hint), boost::forward<Args>(args)...)); }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return force_copy<iterator>(m_flat_tree.emplace_unique()); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return force_copy<iterator>(m_flat_tree.emplace_hint_unique(force<impl_const_iterator>(hint))); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                    \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                         \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                            \
+   {                                                                                                  \
+      return force_copy<iterator>(m_flat_tree.emplace_unique                                               \
+         (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));                                 \
+   }                                                                                                  \
+                                                                                                      \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                         \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))  \
+   {                                                                                                  \
+      return force_copy<iterator>(m_flat_tree.emplace_hint_unique                                          \
+         (force<impl_const_iterator>(hint),                                                           \
+         BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));                                  \
+   }                                                                                                  \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <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 force_copy<iterator>(m_flat_tree.erase(force<impl_const_iterator>(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 force_copy<iterator>(m_flat_tree.erase(force<impl_const_iterator>(first), force<impl_const_iterator>(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(); }
+
+   //! <b>Effects</b>: Tries to deallocate the excess of memory created
+   //    with previous allocations. The size of the vector is unchanged
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to size().
+   void shrink_to_fit()
+      { m_flat_tree.shrink_to_fit(); }
+
+   //! <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 force_copy<iterator>(m_flat_tree.find(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 force<const_iterator>(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;  }
+
+   //! <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 force_copy<iterator>(m_flat_tree.lower_bound(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 force<const_iterator>(m_flat_tree.lower_bound(x)); }
+
+   //! <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 force_copy<iterator>(m_flat_tree.upper_bound(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 force<const_iterator>(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<iterator,iterator> equal_range(const key_type& x) 
+      {  return force<std::pair<iterator,iterator> >(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<const_iterator,const_iterator> equal_range(const key_type& x) const 
+      {  return force<std::pair<const_iterator,const_iterator> >(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 T1, class C1, class A1>
+   friend bool operator== (const flat_map<K1, T1, C1, A1>&,
+                           const flat_map<K1, T1, C1, A1>&);
+   template <class K1, class T1, class C1, class A1>
+   friend bool operator< (const flat_map<K1, T1, C1, A1>&,
+                           const flat_map<K1, T1, C1, A1>&);
+   /// @endcond
+};
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const flat_map<Key,T,Pred,Alloc>& x, 
+                       const flat_map<Key,T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree == y.m_flat_tree;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const flat_map<Key,T,Pred,Alloc>& x, 
+                      const flat_map<Key,T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree < y.m_flat_tree;   }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator!=(const flat_map<Key,T,Pred,Alloc>& x, 
+                       const flat_map<Key,T,Pred,Alloc>& y) 
+   {  return !(x == y); }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>(const flat_map<Key,T,Pred,Alloc>& x, 
+                      const flat_map<Key,T,Pred,Alloc>& y) 
+   {  return y < x;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<=(const flat_map<Key,T,Pred,Alloc>& x, 
+                       const flat_map<Key,T,Pred,Alloc>& y) 
+   {  return !(y < x);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>=(const flat_map<Key,T,Pred,Alloc>& x, 
+                       const flat_map<Key,T,Pred,Alloc>& y) 
+   {  return !(x < y);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline void swap(flat_map<Key,T,Pred,Alloc>& x, 
+                 flat_map<Key,T,Pred,Alloc>& y) 
+   {  x.swap(y);  }
+
+/// @cond
+
+}  //namespace container {
+
+//!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<boost::container::flat_map<K, T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+namespace container {
+
+// Forward declaration of operators < and ==, needed for friend declaration.
+template <class Key, class T, 
+          class Pred,
+          class Alloc>
+class flat_multimap;
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                       const flat_multimap<Key,T,Pred,Alloc>& y);
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                      const flat_multimap<Key,T,Pred,Alloc>& y);
+/// @endcond
+
+//! A flat_multimap is a kind of associative container that supports equivalent keys 
+//! (possibly containing multiple copies of the same key value) and provides for 
+//! fast retrieval of values of another type T based on the keys. The flat_multimap 
+//! class supports random-access iterators.
+//! 
+//! A flat_multimap satisfies all of the requirements of a container and of a reversible 
+//! container and of an associative container. For a 
+//! flat_multimap<Key,T> the key_type is Key and the value_type is std::pair<Key,T>
+//! (unlike std::multimap<Key, T> which value_type is std::pair<<b>const</b> Key, T>).
+//!
+//! Pred is the ordering function for Keys (e.g. <i>std::less<Key></i>).
+//!
+//! Alloc is the allocator to allocate the value_types
+//! (e.g. <i>allocator< std::pair<Key, T> ></i>).
+template <class Key, class T, class Pred, class Alloc>
+class flat_multimap 
+{
+   /// @cond
+   private:
+   typedef containers_detail::flat_tree<Key, 
+                           std::pair<Key, T>, 
+                           containers_detail::select1st< std::pair<Key, T> >, 
+                           Pred, 
+                           Alloc> tree_t;
+   //This is the real tree stored here. It's based on a movable pair
+   typedef containers_detail::flat_tree<Key, 
+                           containers_detail::pair<Key, T>, 
+                           containers_detail::select1st<containers_detail::pair<Key, T> >, 
+                           Pred, 
+                           typename Alloc::template
+                              rebind<containers_detail::pair<Key, T> >::other> impl_tree_t;
+   impl_tree_t m_flat_tree;  // flat tree representing flat_map
+
+   typedef typename impl_tree_t::value_type              impl_value_type;
+   typedef typename impl_tree_t::pointer                 impl_pointer;
+   typedef typename impl_tree_t::const_pointer           impl_const_pointer;
+   typedef typename impl_tree_t::reference               impl_reference;
+   typedef typename impl_tree_t::const_reference         impl_const_reference;
+   typedef typename impl_tree_t::value_compare           impl_value_compare;
+   typedef typename impl_tree_t::iterator                impl_iterator;
+   typedef typename impl_tree_t::const_iterator          impl_const_iterator;
+   typedef typename impl_tree_t::reverse_iterator        impl_reverse_iterator;
+   typedef typename impl_tree_t::const_reverse_iterator  impl_const_reverse_iterator;
+   typedef typename impl_tree_t::allocator_type          impl_allocator_type;
+
+   template<class D, class S>
+   static D &force(const S &s)
+   {  return *const_cast<D*>((reinterpret_cast<const D*>(&s))); }
+
+   template<class D, class S>
+   static D force_copy(S s)
+   {
+      value_type *vp = reinterpret_cast<value_type *>(&*s);
+      return D(vp);
+   }
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(flat_multimap)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef typename tree_t::value_compare          value_compare;
+   typedef T                                       mapped_type;
+   typedef typename tree_t::key_compare            key_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+
+   //! <b>Effects</b>: Constructs an empty flat_multimap using the specified comparison
+   //!   object and allocator.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit flat_multimap(const Pred& comp = Pred(),
+                          const allocator_type& a = allocator_type())
+      : m_flat_tree(comp, force<impl_allocator_type>(a)) { }
+
+   //! <b>Effects</b>: Constructs an empty flat_multimap 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_multimap(InputIterator first, InputIterator last,
+            const Pred& comp        = Pred(),
+            const allocator_type& a = allocator_type())
+      : m_flat_tree(comp, force<impl_allocator_type>(a)) 
+      { m_flat_tree.insert_equal(first, last); }
+
+   //! <b>Effects</b>: Copy constructs a flat_multimap.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   flat_multimap(const flat_multimap<Key,T,Pred,Alloc>& x) 
+      : m_flat_tree(x.m_flat_tree) { }
+
+   //! <b>Effects</b>: Move constructs a flat_multimap. Constructs *this using x's resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
+   flat_multimap(BOOST_RV_REF(flat_multimap) x) 
+      : m_flat_tree(boost::move(x.m_flat_tree))
+   { }
+
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   flat_multimap<Key,T,Pred,Alloc>& operator=(const flat_multimap<Key,T,Pred,Alloc>& x) 
+      {  m_flat_tree = x.m_flat_tree;   return *this;  }
+
+   //! <b>Effects</b>: this->swap(x.get()).
+   //! 
+   //! <b>Complexity</b>: Constant.
+   flat_multimap<Key,T,Pred,Alloc>& operator=(BOOST_RV_REF(flat_multimap) mx) 
+      {  m_flat_tree = boost::move(mx.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 force<key_compare>(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 value_compare(force<key_compare>(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 force<allocator_type>(m_flat_tree.get_allocator()); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+      { return force<stored_allocator_type>(m_flat_tree.get_stored_allocator()); }
+
+   stored_allocator_type &get_stored_allocator()
+      { return force<stored_allocator_type>(m_flat_tree.get_stored_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 force_copy<iterator>(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 force<const_iterator>(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 force_copy<iterator>(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 force<const_iterator>(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 force<reverse_iterator>(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 force<const_reverse_iterator>(m_flat_tree.rbegin()); }
+
+   //! <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 force<reverse_iterator>(m_flat_tree.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 force<const_reverse_iterator>(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_multimap& x)
+   { m_flat_tree.swap(x.m_flat_tree); }
+
+   //! <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 force_copy<iterator>(m_flat_tree.insert_equal(force<impl_value_type>(x))); }
+
+   //! <b>Effects</b>: Inserts a new value 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(BOOST_RV_REF(value_type) x) 
+   { return force_copy<iterator>(m_flat_tree.insert_equal(boost::move(x))); }
+
+   //! <b>Effects</b>: Inserts a new value 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(BOOST_RV_REF(impl_value_type) x) 
+      { return force_copy<iterator>(m_flat_tree.insert_equal(boost::move(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 time if the value
+   //!   is to be inserted before p) 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_iterator position, const value_type& x) 
+      { return force_copy<iterator>(m_flat_tree.insert_equal(force<impl_const_iterator>(position), force<impl_value_type>(x))); }
+
+   //! <b>Effects</b>: Inserts a 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 time if the value
+   //!   is to be inserted before p) 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_iterator position, BOOST_RV_REF(value_type) x) 
+   {
+      return force_copy<iterator>
+         (m_flat_tree.insert_equal(force<impl_const_iterator>(position)
+                                  , boost::move(x)));
+   }
+
+   //! <b>Effects</b>: Inserts a 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 time if the value
+   //!   is to be inserted before p) 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_iterator position, BOOST_RV_REF(impl_value_type) x) 
+   {
+      return force_copy<iterator>(
+         m_flat_tree.insert_equal(force<impl_const_iterator>(position), boost::move(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); }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return force_copy<iterator>(m_flat_tree.emplace_equal(boost::forward<Args>(args)...)); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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 time if the value
+   //!   is to be inserted before p) plus linear insertion
+   //!   to the elements with bigger keys than x.
+   //!
+   //! <b>Note</b>: If an element it's inserted it might invalidate elements.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {
+      return force_copy<iterator>(m_flat_tree.emplace_hint_equal
+         (force<impl_const_iterator>(hint), boost::forward<Args>(args)...));
+   }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return force_copy<iterator>(m_flat_tree.emplace_equal()); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return force_copy<iterator>(m_flat_tree.emplace_hint_equal(force<impl_const_iterator>(hint))); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                    \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                         \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                            \
+   {                                                                                                  \
+      return force_copy<iterator>(m_flat_tree.emplace_equal                                                \
+         (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));                                 \
+   }                                                                                                  \
+                                                                                                      \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                         \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))  \
+   {                                                                                                  \
+      return force_copy<iterator>(m_flat_tree.emplace_hint_equal                                           \
+         (force<impl_const_iterator>(hint),                                                           \
+            BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)));                               \
+   }                                                                                                  \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <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 force_copy<iterator>(m_flat_tree.erase(force<impl_const_iterator>(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 force_copy<iterator>(m_flat_tree.erase(force<impl_const_iterator>(first), force<impl_const_iterator>(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(); }
+
+   //! <b>Effects</b>: Tries to deallocate the excess of memory created
+   //    with previous allocations. The size of the vector is unchanged
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to size().
+   void shrink_to_fit()
+      { m_flat_tree.shrink_to_fit(); }
+
+   //! <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 force_copy<iterator>(m_flat_tree.find(x)); }
+
+   //! <b>Returns</b>: An 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.
+   const_iterator find(const key_type& x) const 
+      { return force<const_iterator>(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); }
+
+   //! <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 force_copy<iterator>(m_flat_tree.lower_bound(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 force<const_iterator>(m_flat_tree.lower_bound(x));  }
+
+   //! <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 force_copy<iterator>(m_flat_tree.upper_bound(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 force<const_iterator>(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<iterator,iterator> equal_range(const key_type& x) 
+      {  return force_copy<std::pair<iterator,iterator> >(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<const_iterator,const_iterator> 
+      equal_range(const key_type& x) const 
+      {  return force_copy<std::pair<const_iterator,const_iterator> >(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 T1, class C1, class A1>
+   friend bool operator== (const flat_multimap<K1, T1, C1, A1>& x,
+                           const flat_multimap<K1, T1, C1, A1>& y);
+
+   template <class K1, class T1, class C1, class A1>
+   friend bool operator< (const flat_multimap<K1, T1, C1, A1>& x,
+                          const flat_multimap<K1, T1, C1, A1>& y);
+   /// @endcond
+};
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                       const flat_multimap<Key,T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree == y.m_flat_tree;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                      const flat_multimap<Key,T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree < y.m_flat_tree;   }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator!=(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                       const flat_multimap<Key,T,Pred,Alloc>& y) 
+   {  return !(x == y);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                      const flat_multimap<Key,T,Pred,Alloc>& y) 
+   {  return y < x;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<=(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                       const flat_multimap<Key,T,Pred,Alloc>& y) 
+   {  return !(y < x);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>=(const flat_multimap<Key,T,Pred,Alloc>& x, 
+                       const flat_multimap<Key,T,Pred,Alloc>& y) 
+   {  return !(x < y);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline void swap(flat_multimap<Key,T,Pred,Alloc>& x, flat_multimap<Key,T,Pred,Alloc>& y) 
+   {  x.swap(y);  }
+
+}
+
+/// @cond
+
+//!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< boost::container::flat_multimap<K, T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+/// @endcond
+
+}
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif /* BOOST_CONTAINERS_FLAT_MAP_HPP */
Added: sandbox/move/boost/container/flat_set.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/flat_set.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1162 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINERS_FLAT_SET_HPP
+#define BOOST_CONTAINERS_FLAT_SET_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/containers_fwd.hpp>
+#include <utility>
+#include <functional>
+#include <memory>
+#include <boost/container/detail/flat_tree.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/move/move.hpp>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+// Forward declarations of operators < and ==, needed for friend declaration.
+
+template <class T, class Pred, class Alloc>
+class flat_set;
+
+template <class T, class Pred, class Alloc>
+inline bool operator==(const flat_set<T,Pred,Alloc>& x, 
+                       const flat_set<T,Pred,Alloc>& y);
+
+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 
+{
+   /// @cond
+   private:
+   typedef containers_detail::flat_tree<T, T, containers_detail::identity<T>, Pred, Alloc> tree_t;
+   tree_t m_flat_tree;  // flat tree representing flat_set
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(flat_set)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef typename tree_t::key_compare            key_compare;
+   typedef typename tree_t::value_compare          value_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+
+   //! <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)
+   {}
+
+   //! <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(),
+            const allocator_type& a = allocator_type())
+      : 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(BOOST_RV_REF(flat_set) mx) 
+      : m_flat_tree(boost::move(mx.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;  }
+
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   flat_set<T,Pred,Alloc>& operator=(BOOST_RV_REF(flat_set) mx)
+   {  m_flat_tree = boost::move(mx.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(); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   {  return m_flat_tree.get_stored_allocator(); }
+
+   stored_allocator_type &get_stored_allocator()
+   {  return m_flat_tree.get_stored_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 a const_iterator to the first element contained in the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cbegin() const 
+      { return m_flat_tree.cbegin(); }
+
+   //! <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 const_iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend() const 
+      { return m_flat_tree.cend(); }
+
+   //! <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(); } 
+
+   //! <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 crbegin() const 
+      { return m_flat_tree.crbegin(); } 
+
+   //! <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(); }
+
+   //! <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 a const_reverse_iterator pointing to the end
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator crend() const 
+      { return m_flat_tree.crend(); }
+
+   //! <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& x)
+   { m_flat_tree.swap(x.m_flat_tree); }
+
+   //! <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(BOOST_RV_REF(value_type) x) 
+   {  return m_flat_tree.insert_unique(boost::move(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(const_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(const_iterator position, BOOST_RV_REF(value_type) x) 
+   {  return m_flat_tree.insert_unique(position, boost::move(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);  }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return m_flat_tree.emplace_unique(boost::forward<Args>(args)...); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {  return m_flat_tree.emplace_hint_unique(hint, boost::forward<Args>(args)...); }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return m_flat_tree.emplace_unique(); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return m_flat_tree.emplace_hint_unique(hint); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                             \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                                  \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                                     \
+   {  return m_flat_tree.emplace_unique(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }           \
+                                                                                                               \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                                  \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))           \
+   {  return m_flat_tree.emplace_hint_unique(hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }\
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <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(); }
+
+   //! <b>Effects</b>: Tries to deallocate the excess of memory created
+   //    with previous allocations. The size of the vector is unchanged
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to size().
+   void shrink_to_fit()
+      { m_flat_tree.shrink_to_fit(); }
+
+   //! <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); }
+
+   //! <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;  }
+
+   //! <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); }
+
+   //! <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); }
+
+   //! <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);    }
+
+   //! <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>
+inline bool operator==(const flat_set<T,Pred,Alloc>& x, 
+                       const flat_set<T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree == y.m_flat_tree;  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<(const flat_set<T,Pred,Alloc>& x, 
+                      const flat_set<T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree < y.m_flat_tree;   }
+
+template <class T, class Pred, class Alloc>
+inline bool operator!=(const flat_set<T,Pred,Alloc>& x, 
+                       const flat_set<T,Pred,Alloc>& y) 
+   {  return !(x == y);   }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>(const flat_set<T,Pred,Alloc>& x, 
+                      const flat_set<T,Pred,Alloc>& y) 
+   {  return y < x; }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<=(const flat_set<T,Pred,Alloc>& x, 
+                       const flat_set<T,Pred,Alloc>& y) 
+   {  return !(y < x); }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>=(const flat_set<T,Pred,Alloc>& x, 
+                       const flat_set<T,Pred,Alloc>& y) 
+   {  return !(x < y);  }
+
+template <class T, class Pred, class Alloc>
+inline void swap(flat_set<T,Pred,Alloc>& x, flat_set<T,Pred,Alloc>& y) 
+   {  x.swap(y);  }
+
+/// @cond
+
+}  //namespace container {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class C, class A>
+struct has_trivial_destructor_after_move<boost::container::flat_set<T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value &&has_trivial_destructor<C>::value;
+};
+
+namespace container {
+
+// Forward declaration of operators < and ==, needed for friend declaration.
+
+template <class T, class Pred, class Alloc>
+class flat_multiset;
+
+template <class T, class Pred, class Alloc>
+inline bool operator==(const flat_multiset<T,Pred,Alloc>& x, 
+                       const flat_multiset<T,Pred,Alloc>& y);
+
+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
+
+//! flat_multiset is a Sorted Associative Container that stores objects of type Key. 
+//! flat_multiset is a Simple Associative Container, meaning that its value type, 
+//! as well as its key type, is Key.
+//! flat_Multiset can store multiple copies of the same key value.
+//! 
+//! flat_multiset is similar to std::multiset but it's implemented like an ordered vector.
+//! This means that inserting a new element into a flat_multiset invalidates
+//! previous iterators and references
+//!
+//! Erasing an element of a flat_multiset invalidates iterators and references 
+//! pointing to elements that come after (their keys are equal or bigger) the erased element.
+template <class T, class Pred, class Alloc>
+class flat_multiset 
+{
+   /// @cond
+   private:
+   typedef containers_detail::flat_tree<T, T, containers_detail::identity<T>, Pred, Alloc> tree_t;
+   tree_t m_flat_tree;  // flat tree representing flat_multiset
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(flat_multiset)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef typename tree_t::key_compare            key_compare;
+   typedef typename tree_t::value_compare          value_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+
+   // allocation/deallocation
+   explicit flat_multiset(const Pred& comp = Pred(),
+                          const allocator_type& a = allocator_type())
+      : m_flat_tree(comp, a) {}
+
+   template <class InputIterator>
+   flat_multiset(InputIterator first, InputIterator last,
+                 const Pred& comp        = Pred(),
+                 const allocator_type& a = allocator_type())
+      : m_flat_tree(comp, a) 
+      { m_flat_tree.insert_equal(first, last); }
+
+   flat_multiset(const flat_multiset<T,Pred,Alloc>& x) 
+      : m_flat_tree(x.m_flat_tree) {}
+
+   flat_multiset(BOOST_RV_REF(flat_multiset) x) 
+      : m_flat_tree(boost::move(x.m_flat_tree))
+   {}
+
+   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=(BOOST_RV_REF(flat_multiset) mx) 
+   {  m_flat_tree = boost::move(mx.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(); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   { return m_flat_tree.get_stored_allocator(); }
+
+   stored_allocator_type &get_stored_allocator()
+   { return m_flat_tree.get_stored_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 a const_iterator to the first element contained in the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cbegin() const 
+      { return m_flat_tree.cbegin(); }
+
+   //! <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 const_iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend() const 
+      { return m_flat_tree.cend(); }
+
+   //! <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(); } 
+
+   //! <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 crbegin() const 
+      { return m_flat_tree.crbegin(); } 
+
+   //! <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(); }
+
+   //! <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 a const_reverse_iterator pointing to the end
+   //! of the reversed container. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator crend() const 
+      { return m_flat_tree.crend(); }
+
+   //! <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& x)
+   { m_flat_tree.swap(x.m_flat_tree); }
+
+   //! <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(BOOST_RV_REF(value_type) x) 
+   {  return m_flat_tree.insert_equal(boost::move(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(const_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(const_iterator position, BOOST_RV_REF(value_type) x) 
+   {  return m_flat_tree.insert_equal(position, boost::move(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);  }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return m_flat_tree.emplace_equal(boost::forward<Args>(args)...); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {  return m_flat_tree.emplace_hint_equal(hint, boost::forward<Args>(args)...); }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return m_flat_tree.emplace_equal(); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return m_flat_tree.emplace_hint_equal(hint); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                             \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                                  \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                                     \
+   {  return m_flat_tree.emplace_equal(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }            \
+                                                                                                               \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                                  \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))           \
+   {  return m_flat_tree.emplace_hint_equal(hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); } \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <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(); }
+
+   //! <b>Effects</b>: Tries to deallocate the excess of memory created
+   //    with previous allocations. The size of the vector is unchanged
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to size().
+   void shrink_to_fit()
+      { m_flat_tree.shrink_to_fit(); }
+
+   //! <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); }
+
+   //! <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); }
+
+   //! <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); }
+
+   //! <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); }
+
+   //! <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);    }
+
+   //! <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>
+inline bool operator==(const flat_multiset<T,Pred,Alloc>& x, 
+                       const flat_multiset<T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree == y.m_flat_tree;  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<(const flat_multiset<T,Pred,Alloc>& x, 
+                      const flat_multiset<T,Pred,Alloc>& y) 
+   {  return x.m_flat_tree < y.m_flat_tree;   }
+
+template <class T, class Pred, class Alloc>
+inline bool operator!=(const flat_multiset<T,Pred,Alloc>& x, 
+                       const flat_multiset<T,Pred,Alloc>& y) 
+   {  return !(x == y);  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>(const flat_multiset<T,Pred,Alloc>& x, 
+                      const flat_multiset<T,Pred,Alloc>& y) 
+   {  return y < x;  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<=(const flat_multiset<T,Pred,Alloc>& x, 
+                       const flat_multiset<T,Pred,Alloc>& y) 
+   {  return !(y < x);  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>=(const flat_multiset<T,Pred,Alloc>& x, 
+                       const flat_multiset<T,Pred,Alloc>& y) 
+{  return !(x < y);  }
+
+template <class T, class Pred, class Alloc>
+inline void swap(flat_multiset<T,Pred,Alloc>& x, flat_multiset<T,Pred,Alloc>& y) 
+   {  x.swap(y);  }
+
+}  //namespace container {
+
+/// @cond
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class C, class A>
+struct has_trivial_destructor_after_move<boost::container::flat_multiset<T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+/// @endcond
+
+}
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif /* BOOST_CONTAINERS_FLAT_SET_HPP */
Added: sandbox/move/boost/container/list.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/list.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1366 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_list.h file. Modified by Ion Gaztanaga 2004
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+/*
+ *
+ * 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.
+ *
+ */
+
+#ifndef BOOST_CONTAINERS_LIST_HPP_
+#define BOOST_CONTAINERS_LIST_HPP_
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/containers_fwd.hpp>
+#include <boost/container/detail/version_type.hpp>
+#include <boost/move/move.hpp>
+#include <boost/pointer_to_other.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/algorithms.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/intrusive/list.hpp>
+#include <boost/container/detail/node_alloc_holder.hpp>
+
+#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+//Preprocessor library to emulate perfect forwarding
+#include <boost/container/detail/preprocessor.hpp> 
+#endif
+
+#include <iterator>
+#include <utility>
+#include <memory>
+#include <functional>
+#include <algorithm>
+#include <stdexcept>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+namespace containers_detail {
+
+template<class VoidPointer>
+struct list_hook
+{
+   typedef typename containers_detail::bi::make_list_base_hook
+      <containers_detail::bi::void_pointer<VoidPointer>, containers_detail::bi::link_mode<containers_detail::bi::normal_link> >::type type;
+};
+
+template <class T, class VoidPointer>
+struct list_node
+   :  public list_hook<VoidPointer>::type
+{
+
+   #ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   list_node()
+      : m_data()
+   {}
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                           \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   list_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                          \
+      : m_data(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _))                     \
+   {}                                                                                        \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #else //#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template<class ...Args>
+   list_node(Args &&...args)
+      : m_data(boost::forward<Args>(args)...)
+   {}
+   #endif//#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   T m_data;
+};
+
+template<class A>
+struct intrusive_list_type
+{
+   typedef typename A::value_type               value_type;
+   typedef typename boost::pointer_to_other
+      <typename A::pointer, void>::type         void_pointer;
+   typedef typename containers_detail::list_node
+         <value_type, void_pointer>             node_type;
+   typedef typename containers_detail::bi::make_list
+      < node_type
+      , containers_detail::bi::base_hook<typename list_hook<void_pointer>::type>
+      , containers_detail::bi::constant_time_size<true>
+      , containers_detail::bi::size_type<typename A::size_type>
+      >::type                                   container_type;
+   typedef container_type                       type ;
+};
+
+}  //namespace containers_detail {
+/// @endcond
+
+//! A list is a doubly linked list. That is, it is a Sequence that supports both
+//! forward and backward traversal, and (amortized) constant time insertion and 
+//! removal of elements at the beginning or the end, or in the middle. Lists have 
+//! the important property that insertion and splicing do not invalidate iterators 
+//! to list elements, and that even removal invalidates only the iterators that point 
+//! to the elements that are removed. The ordering of iterators may be changed 
+//! (that is, list<T>::iterator might have a different predecessor or successor 
+//! after a list operation than it did before), but the iterators themselves will 
+//! not be invalidated or made to point to different elements unless that invalidation 
+//! or mutation is explicit.
+template <class T, class A>
+class list 
+   : protected containers_detail::node_alloc_holder
+      <A, typename containers_detail::intrusive_list_type<A>::type>
+{
+   /// @cond
+   typedef typename 
+      containers_detail::intrusive_list_type<A>::type            Icont;
+   typedef list <T, A>                                ThisType;
+   typedef containers_detail::node_alloc_holder<A, Icont>        AllocHolder;
+   typedef typename AllocHolder::NodePtr              NodePtr;
+   typedef typename AllocHolder::NodeAlloc            NodeAlloc;
+   typedef typename AllocHolder::ValAlloc             ValAlloc;
+   typedef typename AllocHolder::Node                 Node;
+   typedef containers_detail::allocator_destroyer<NodeAlloc>     Destroyer;
+   typedef typename AllocHolder::allocator_v1         allocator_v1;
+   typedef typename AllocHolder::allocator_v2         allocator_v2;
+   typedef typename AllocHolder::alloc_version        alloc_version;
+
+   class equal_to_value
+   {
+      typedef typename AllocHolder::value_type value_type;
+      const value_type &t_;
+
+      public:
+      equal_to_value(const value_type &t)
+         :  t_(t)
+      {}
+
+      bool operator()(const value_type &t)const
+      {  return t_ == t;   }
+   };
+
+   template<class Pred>
+   struct ValueCompareToNodeCompare
+      :  Pred
+   {
+      ValueCompareToNodeCompare(Pred pred)
+         :  Pred(pred)
+      {}
+
+      bool operator()(const Node &a, const Node &b) const
+      {  return static_cast<const Pred&>(*this)(a.m_data, b.m_data);  }
+
+      bool operator()(const Node &a) const
+      {  return static_cast<const Pred&>(*this)(a.m_data);  }
+   };
+   /// @endcond
+
+   public:
+   //! The type of object, T, stored in the list
+   typedef T                                       value_type;
+   //! Pointer to T
+   typedef typename A::pointer                     pointer;
+   //! Const pointer to T
+   typedef typename A::const_pointer               const_pointer;
+   //! Reference to T
+   typedef typename A::reference                   reference;
+   //! Const reference to T
+   typedef typename A::const_reference             const_reference;
+   //! An unsigned integral type
+   typedef typename A::size_type                   size_type;
+   //! A signed integral type
+   typedef typename A::difference_type             difference_type;
+   //! The allocator type
+   typedef A                                       allocator_type;
+   //! The stored allocator type
+   typedef NodeAlloc                               stored_allocator_type;
+
+   /// @cond
+   private:
+   typedef difference_type                         list_difference_type;
+   typedef pointer                                 list_pointer;
+   typedef const_pointer                           list_const_pointer;
+   typedef reference                               list_reference;
+   typedef const_reference                         list_const_reference;
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(list)
+
+   //! Const iterator used to iterate through a list. 
+   class const_iterator
+      /// @cond
+      : public std::iterator<std::bidirectional_iterator_tag, 
+                                 value_type,         list_difference_type, 
+                                 list_const_pointer, list_const_reference>
+   {
+
+      protected:
+      typename Icont::iterator m_it;
+      explicit const_iterator(typename Icont::iterator it)  : m_it(it){}
+      void prot_incr() { ++m_it; }
+      void prot_decr() { --m_it; }
+
+      private:
+      typename Icont::iterator get()
+      {  return this->m_it;   }
+
+      public:
+      friend class list<T, A>;
+      typedef list_difference_type        difference_type;
+
+      //Constructors
+      const_iterator()
+         :  m_it()
+      {}
+
+      //Pointer like operators
+      const_reference operator*()  const 
+      { return  m_it->m_data;  }
+
+      const_pointer   operator->() const 
+      { return  const_pointer(&m_it->m_data); }
+
+      //Increment / Decrement
+      const_iterator& operator++()       
+      { prot_incr();  return *this; }
+
+      const_iterator operator++(int)      
+      { typename Icont::iterator tmp = m_it; ++*this; return const_iterator(tmp);  }
+
+      const_iterator& operator--()
+      {   prot_decr(); return *this;   }
+
+      const_iterator operator--(int)
+      {  typename Icont::iterator tmp = m_it; --*this; return const_iterator(tmp); }
+
+      //Comparison operators
+      bool operator==   (const const_iterator& r)  const
+      {  return m_it == r.m_it;  }
+
+      bool operator!=   (const const_iterator& r)  const
+      {  return m_it != r.m_it;  }
+   }
+   /// @endcond
+   ;
+
+   //! Iterator used to iterate through a list
+   class iterator
+   /// @cond
+      : public const_iterator
+   {
+
+      private:
+      explicit iterator(typename Icont::iterator it)
+         :  const_iterator(it)
+      {}
+   
+      typename Icont::iterator get()
+      {  return this->m_it;   }
+
+      public:
+      friend class list<T, A>;
+      typedef list_pointer       pointer;
+      typedef list_reference     reference;
+
+      //Constructors
+      iterator(){}
+
+      //Pointer like operators
+      reference operator*()  const {  return  this->m_it->m_data;  }
+      pointer   operator->() const {  return  pointer(&this->m_it->m_data);  }
+
+      //Increment / Decrement
+      iterator& operator++()  
+         { this->prot_incr(); return *this;  }
+
+      iterator operator++(int)
+         { typename Icont::iterator tmp = this->m_it; ++*this; return iterator(tmp); }
+      
+      iterator& operator--()
+         {  this->prot_decr(); return *this;  }
+
+      iterator operator--(int)
+         {  iterator tmp = *this; --*this; return tmp; }
+   };
+   /// @endcond
+
+   //! Iterator used to iterate backwards through a list. 
+   typedef std::reverse_iterator<iterator>        reverse_iterator;
+   //! Const iterator used to iterate backwards through a list. 
+   typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
+
+   //! <b>Effects</b>: Constructs a list taking the allocator as parameter.
+   //! 
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit list(const allocator_type &a = A()) 
+      : AllocHolder(a)
+   {}
+
+   //! <b>Effects</b>: Constructs a list that will use a copy of allocator a
+   //!   and inserts n copies of value.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's default or copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Linear to n.
+   list(size_type n)
+      : AllocHolder(A())
+   {  this->resize(n);  }
+
+   //! <b>Effects</b>: Constructs a list that will use a copy of allocator a
+   //!   and inserts n copies of value.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's default or copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Linear to n.
+   list(size_type n, const T& value, const A& a = A())
+      : AllocHolder(a)
+   {  this->insert(this->cbegin(), n, value);  }
+
+   //! <b>Effects</b>: Copy constructs a list.
+   //!
+   //! <b>Postcondition</b>: x == *this.
+   //! 
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements x contains.
+   list(const list& x) 
+      : AllocHolder(x)
+   {  this->insert(this->cbegin(), x.begin(), x.end());   }
+
+   //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
+   //!
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   list(BOOST_RV_REF(list) x)
+      : AllocHolder(boost::move((AllocHolder&)x))
+   {}
+
+   //! <b>Effects</b>: Constructs a list that will use a copy of allocator a
+   //!   and inserts a copy of the range [first, last) in the list.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's constructor taking an dereferenced InIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to the range [first, last).
+   template <class InpIt>
+   list(InpIt first, InpIt last, const A &a = A())
+      : AllocHolder(a)
+   {  this->insert(this->cbegin(), first, last);  }
+
+   //! <b>Effects</b>: Destroys the list. All stored values are destroyed
+   //!   and used memory is deallocated.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements.
+   ~list()
+   {} //AllocHolder clears the list
+
+   //! <b>Effects</b>: Returns a copy of the internal allocator.
+   //! 
+   //! <b>Throws</b>: If allocator's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   allocator_type get_allocator() const
+   {  return allocator_type(this->node_alloc()); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   {  return this->node_alloc(); }
+
+   stored_allocator_type &get_stored_allocator()
+   {  return this->node_alloc(); }
+
+   //! <b>Effects</b>: Erases all the elements of the list.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in the list.
+   void clear()
+   {  AllocHolder::clear(alloc_version());  }
+
+   //! <b>Effects</b>: Returns an iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator begin()
+   { return iterator(this->icont().begin()); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator begin() const
+   {  return this->cbegin();   }
+
+   //! <b>Effects</b>: Returns an iterator to the end of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator end()
+   {  return iterator(this->icont().end());  }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator end() const
+   {  return this->cend();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning 
+   //! of the reversed list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rbegin()
+   {  return reverse_iterator(end());  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning 
+   //! of the reversed list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rbegin() const
+   {  return this->crbegin();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //! of the reversed list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rend()
+   {  return reverse_iterator(begin());   }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //! of the reversed list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rend() const
+   {  return this->crend();   }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cbegin() const
+   {  return const_iterator(this->non_const_icont().begin());   }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend() const
+   {  return const_iterator(this->non_const_icont().end());  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning 
+   //! of the reversed list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator crbegin() const
+   {  return const_reverse_iterator(this->cend());  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //! of the reversed list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator crend() const
+   {  return const_reverse_iterator(this->cbegin());   }
+
+   //! <b>Effects</b>: Returns true if the list contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   bool empty() const 
+   {  return !this->size();  }
+
+   //! <b>Effects</b>: Returns the number of the elements contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type size() const 
+   {   return this->icont().size();   }
+
+   //! <b>Effects</b>: Returns the largest possible size of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type max_size() const 
+   {  return AllocHolder::max_size();  }
+
+   //! <b>Effects</b>: Inserts a copy of t in the beginning of the list.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_front(const T& x)   
+   {  this->insert(this->cbegin(), x);  }
+
+   //! <b>Effects</b>: Constructs a new element in the beginning of the list
+   //!   and moves the resources of t to this new element.
+   //!
+   //! <b>Throws</b>: If memory allocation throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_front(BOOST_RV_REF(T) x)
+   {  this->insert(this->cbegin(), boost::move(x));  }
+
+   //! <b>Effects</b>: Removes the last element from the list.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_back (const T& x)   
+   {  this->insert(this->cend(), x);    }
+
+   //! <b>Effects</b>: Removes the first element from the list.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_back (BOOST_RV_REF(T) x)
+   {  this->insert(this->cend(), boost::move(x));    }
+
+   //! <b>Effects</b>: Removes the first element from the list.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void pop_front()              
+   {  this->erase(this->cbegin());      }
+
+   //! <b>Effects</b>: Removes the last element from the list.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void pop_back()               
+   {  const_iterator tmp = this->cend(); this->erase(--tmp);  }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference front()             
+   { return *this->begin(); }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a const reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference front() const 
+   { return *this->begin(); }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference back()              
+   { return *(--this->end()); }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a const reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference back()  const 
+   { return *(--this->end()); }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are copy constructed from x.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type new_size, const T& x)
+   {
+      const_iterator iend = this->cend();
+      size_type len = this->size();
+      
+      if(len > new_size){
+         size_type to_erase = len - new_size;
+         while(to_erase--){
+            --iend;
+         }
+         this->erase(iend, this->cend());
+      }
+      else{
+         this->priv_create_and_insert_nodes(iend, new_size - len, x);
+      }
+   }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are default constructed.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type new_size)
+   {
+      const_iterator iend = this->end();
+      size_type len = this->size();
+      
+      if(len > new_size){
+         size_type to_erase = len - new_size;
+         const_iterator ifirst;
+         if(to_erase < len/2u){
+            ifirst = iend;
+            while(to_erase--){
+               --ifirst;
+            }
+         }
+         else{
+            ifirst = this->begin();
+            size_type to_skip = len - to_erase;
+            while(to_skip--){
+               ++ifirst;
+            }
+         }
+         this->erase(ifirst, iend);
+      }
+      else{
+         this->priv_create_and_insert_nodes(this->cend(), new_size - len);
+      }
+   }
+
+   //! <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(ThisType& x)
+   {  AllocHolder::swap(x);   }
+
+   //! <b>Effects</b>: Makes *this contain the same elements as x.
+   //!
+   //! <b>Postcondition</b>: this->size() == x.size(). *this contains a copy 
+   //! of each of x's elements. 
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in x.
+   ThisType& operator=(const ThisType& x)
+   {
+      if (this != &x) {
+         this->assign(x.begin(), x.end());
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Move assignment. All mx's values are transferred to *this.
+   //!
+   //! <b>Postcondition</b>: x.empty(). *this contains a the elements x had
+   //!   before the function.
+   //!
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Constant.
+   ThisType& operator=(BOOST_RV_REF(ThisType) mx)
+   {
+      this->clear();
+      this->swap(mx);
+      return *this;
+   }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Inserts n copies of x before p.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   void insert(const_iterator p, size_type n, const T& x)
+   { this->priv_create_and_insert_nodes(p, n, x); }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a copy of the [first, last) range before p.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, T's constructor from a
+   //!   dereferenced InpIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to std::distance [first, last).
+   template <class InpIt>
+   void insert(const_iterator p, InpIt first, InpIt last) 
+   {
+      const bool aux_boolean = containers_detail::is_convertible<InpIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_insert_dispatch(p, first, last, Result());
+   }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a copy of x before p.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or x's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   iterator insert(const_iterator p, const T& x) 
+   {
+      NodePtr tmp = AllocHolder::create_node(x);
+      return iterator(this->icont().insert(p.get(), *tmp));
+   }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a new element before p with mx's resources.
+   //!
+   //! <b>Throws</b>: If memory allocation throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   iterator insert(const_iterator p, BOOST_RV_REF(T) x) 
+   {
+      NodePtr tmp = AllocHolder::create_node(boost::move(x));
+      return iterator(this->icont().insert(p.get(), *tmp));
+   }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... in the end of the list.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Constant
+   template <class... Args>
+   void emplace_back(Args&&... args)
+   {
+      this->emplace(this->cend(), boost::forward<Args>(args)...);
+   }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... in the beginning of the list.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Constant
+   template <class... Args>
+   void emplace_front(Args&&... args)
+   {
+      this->emplace(this->cbegin(), boost::forward<Args>(args)...);
+   }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... before p.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Constant
+   template <class... Args>
+   iterator emplace(const_iterator p, Args&&... args)
+   {
+      typename AllocHolder::Deallocator d(AllocHolder::create_node_and_deallocator());
+      new ((void*)containers_detail::get_pointer(d.get())) Node(boost::forward<Args>(args)...);
+      NodePtr node = d.get();
+      d.release();
+      return iterator(this->icont().insert(p.get(), *node));
+   }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //0 args
+   void emplace_back()
+   {  this->emplace(this->cend());  }
+
+   void emplace_front()
+   {  this->emplace(this->cbegin());   }
+
+   iterator emplace(const_iterator p)
+   {
+      typename AllocHolder::Deallocator d(AllocHolder::create_node_and_deallocator());
+      new ((void*)containers_detail::get_pointer(d.get())) Node();
+      NodePtr node = d.get();
+      d.release();
+      return iterator(this->icont().insert(p.get(), *node));
+   }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                              \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                   \
+   void emplace_back(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                     \
+   {                                                                                            \
+      this->emplace(this->cend(), BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));    \
+   }                                                                                            \
+                                                                                                \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                   \
+   void emplace_front(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                    \
+   {  this->emplace(this->cbegin(), BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));} \
+                                                                                                \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                   \
+   iterator emplace(const_iterator p, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))    \
+   {                                                                                            \
+      typename AllocHolder::Deallocator d(AllocHolder::create_node_and_deallocator());          \
+      new ((void*)containers_detail::get_pointer(d.get()))                                                 \
+         Node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                        \
+      NodePtr node = d.get();                                                                   \
+      d.release();                                                                              \
+      return iterator(this->icont().insert(p.get(), *node));                                    \
+   }                                                                                            \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Erases the element at p p.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   iterator erase(const_iterator p) 
+   {  return iterator(this->icont().erase_and_dispose(p.get(), Destroyer(this->node_alloc()))); }
+
+   //! <b>Requires</b>: first and last must be valid iterator to elements in *this.
+   //!
+   //! <b>Effects</b>: Erases the elements pointed by [first, last).
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the distance between first and last.
+   iterator erase(const_iterator first, const_iterator last)
+   {  return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version())); }
+
+   //! <b>Effects</b>: Assigns the n copies of val to *this.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   void assign(size_type n, const T& val) 
+   {  this->priv_fill_assign(n, val);  }
+
+   //! <b>Effects</b>: Assigns the the range [first, last) to *this.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's constructor from dereferencing InpIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   template <class InpIt>
+   void assign(InpIt first, InpIt last) 
+   {
+      const bool aux_boolean = containers_detail::is_convertible<InpIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_assign_dispatch(first, last, Result());
+   }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by the list. x != *this
+   //!
+   //! <b>Effects</b>: Transfers all the elements of list x to this list, before the
+   //!   the element pointed by p. No destructors or copy constructors are called.
+   //!
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //!
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of
+   //!    this list. Iterators of this list and all the references are not invalidated.
+   void splice(iterator p, ThisType& x) 
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice(p.get(), x.icont());
+      }
+      else{
+         throw std::runtime_error("list::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by this list. i must point to an element contained in list x.
+   //! 
+   //! <b>Effects</b>: Transfers the value pointed by i, from list x to this list, 
+   //!   before the the element pointed by p. No destructors or copy constructors are called.
+   //!   If p == i or p == ++i, this function is a null operation. 
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice(const_iterator p, ThisType &x, const_iterator i) 
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice(p.get(), x.icont(), i.get());
+      }
+      else{
+         throw std::runtime_error("list::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by this list. first and last must point to elements contained in list x.
+   //! 
+   //! <b>Effects</b>: Transfers the range pointed by first and last from list x to this list, 
+   //!   before the the element pointed by p. No destructors or copy constructors are called.
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements transferred.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice(const_iterator p, ThisType &x, const_iterator first, const_iterator last) 
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice(p.get(), x.icont(), first.get(), last.get());
+      }
+      else{
+         throw std::runtime_error("list::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by this list. first and last must point to elements contained in list x.
+   //!   n == std::distance(first, last)
+   //! 
+   //! <b>Effects</b>: Transfers the range pointed by first and last from list x to this list, 
+   //!   before the the element pointed by p. No destructors or copy constructors are called.
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice(const_iterator p, ThisType &x, const_iterator first, const_iterator last, size_type n) 
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice(p.get(), x.icont(), first.get(), last.get(), n);
+      }
+      else{
+         throw std::runtime_error("list::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Effects</b>: Reverses the order of elements in the list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: This function is linear time.
+   //! 
+   //! <b>Note</b>: Iterators and references are not invalidated
+   void reverse()
+   {  this->icont().reverse(); }    
+
+   //! <b>Effects</b>: Removes all the elements that compare equal to value.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear time. It performs exactly size() comparisons for equality.
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   void remove(const T& value)
+   {  remove_if(equal_to_value(value));  }
+
+   //! <b>Effects</b>: Removes all the elements for which a specified
+   //!   predicate is satisfied.
+   //! 
+   //! <b>Throws</b>: If pred throws.
+   //! 
+   //! <b>Complexity</b>: Linear time. It performs exactly size() calls to the predicate.
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   template <class Pred>
+   void remove_if(Pred pred)
+   {
+      typedef ValueCompareToNodeCompare<Pred> Predicate;
+      this->icont().remove_and_dispose_if(Predicate(pred), Destroyer(this->node_alloc()));
+   }
+
+   //! <b>Effects</b>: Removes adjacent duplicate elements or adjacent 
+   //!   elements that are equal from the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear time (size()-1 comparisons calls to pred()).
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   void unique()
+   {  this->unique(value_equal());  }
+
+   //! <b>Effects</b>: Removes adjacent duplicate elements or adjacent 
+   //!   elements that satisfy some binary predicate from the list.
+   //! 
+   //! <b>Throws</b>: If pred throws.
+   //! 
+   //! <b>Complexity</b>: Linear time (size()-1 comparisons equality comparisons).
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   template <class BinaryPredicate>
+   void unique(BinaryPredicate binary_pred)
+   {
+      typedef ValueCompareToNodeCompare<BinaryPredicate> Predicate;
+      this->icont().unique_and_dispose(Predicate(binary_pred), Destroyer(this->node_alloc()));
+   }
+
+   //! <b>Requires</b>: The lists x and *this must be distinct. 
+   //!
+   //! <b>Effects</b>: This function removes all of x's elements and inserts them
+   //!   in order into *this according to std::less<value_type>. The merge is stable; 
+   //!   that is, if an element from *this is equivalent to one from x, then the element 
+   //!   from *this will precede the one from x. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: This function is linear time: it performs at most
+   //!   size() + x.size() - 1 comparisons.
+   void merge(list<T, A>& x)
+   {  this->merge(x, value_less());  }
+
+   //! <b>Requires</b>: p must be a comparison function that induces a strict weak
+   //!   ordering and both *this and x must be sorted according to that ordering
+   //!   The lists x and *this must be distinct. 
+   //! 
+   //! <b>Effects</b>: This function removes all of x's elements and inserts them
+   //!   in order into *this. The merge is stable; that is, if an element from *this is 
+   //!   equivalent to one from x, then the element from *this will precede the one from x. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: This function is linear time: it performs at most
+   //!   size() + x.size() - 1 comparisons.
+   //! 
+   //! <b>Note</b>: Iterators and references to *this are not invalidated.
+   template <class StrictWeakOrdering>
+   void merge(list &x, StrictWeakOrdering comp)
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().merge(x.icont(),
+            ValueCompareToNodeCompare<StrictWeakOrdering>(comp));
+      }
+      else{
+         throw std::runtime_error("list::merge called with unequal allocators");
+      }
+   }
+
+   //! <b>Effects</b>: This function sorts the list *this according to std::less<value_type>. 
+   //!   The sort is stable, that is, the relative order of equivalent elements is preserved.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Notes</b>: Iterators and references are not invalidated.
+   //!   
+   //! <b>Complexity</b>: The number of comparisons is approximately N log N, where N
+   //!   is the list's size.
+   void sort()
+   {  this->sort(value_less());  }
+
+   //! <b>Effects</b>: This function sorts the list *this according to std::less<value_type>. 
+   //!   The sort is stable, that is, the relative order of equivalent elements is preserved.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Notes</b>: Iterators and references are not invalidated.
+   //! 
+   //! <b>Complexity</b>: The number of comparisons is approximately N log N, where N
+   //!   is the list's size.
+   template <class StrictWeakOrdering>
+   void sort(StrictWeakOrdering comp)
+   {
+      // nothing if the list has length 0 or 1.
+      if (this->size() < 2)
+         return;
+      this->icont().sort(ValueCompareToNodeCompare<StrictWeakOrdering>(comp));
+   }
+
+   /// @cond
+   private:
+
+   //Iterator range version
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator pos, InpIterator beg, InpIterator end)
+   {
+      typedef typename std::iterator_traits<InpIterator>::iterator_category ItCat;
+      priv_create_and_insert_nodes(pos, beg, end, alloc_version(), ItCat());
+   }
+
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator pos, InpIterator beg, InpIterator end, allocator_v1, std::input_iterator_tag)
+   {
+      for (; beg != end; ++beg){
+         this->icont().insert(pos.get(), *this->create_node_from_it(beg));
+      }
+   }
+
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator pos, InpIterator beg, InpIterator end, allocator_v2, std::input_iterator_tag)
+   {  //Just forward to the default one
+      priv_create_and_insert_nodes(pos, beg, end, allocator_v1(), std::input_iterator_tag());
+   }
+
+   class insertion_functor;
+   friend class insertion_functor;
+
+   class insertion_functor
+   {
+      Icont &icont_;
+      typename Icont::const_iterator pos_;
+
+      public:
+      insertion_functor(Icont &icont, typename Icont::const_iterator pos)
+         :  icont_(icont), pos_(pos)
+      {}
+
+      void operator()(Node &n)
+      {  this->icont_.insert(pos_, n); }
+   };
+
+
+   template<class FwdIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator pos, FwdIterator beg, FwdIterator end, allocator_v2, std::forward_iterator_tag)
+   {
+      if(beg != end){
+         //Optimized allocation and construction
+         this->allocate_many_and_construct
+            (beg, std::distance(beg, end), insertion_functor(this->icont(), pos.get()));
+      }
+   }
+
+   //Default constructed version
+   void priv_create_and_insert_nodes(const_iterator pos, size_type n)
+   {
+      typedef default_construct_iterator<value_type, difference_type> default_iterator;
+      this->priv_create_and_insert_nodes(pos, default_iterator(n), default_iterator());
+   }
+
+   //Copy constructed version
+   void priv_create_and_insert_nodes(const_iterator pos, size_type n, const T& x)
+   {
+      typedef constant_iterator<value_type, difference_type> cvalue_iterator;
+      this->priv_create_and_insert_nodes(pos, cvalue_iterator(x, n), cvalue_iterator());
+   }
+
+   //Dispatch to detect iterator range or integer overloads
+   template <class InputIter>
+   void priv_insert_dispatch(const_iterator p,
+                             InputIter first, InputIter last,
+                             containers_detail::false_)
+   {  this->priv_create_and_insert_nodes(p, first, last);   }
+
+   template<class Integer>
+   void priv_insert_dispatch(const_iterator p, Integer n, Integer x, containers_detail::true_) 
+   {  this->insert(p, (size_type)n, x);  }
+
+   void priv_fill_assign(size_type n, const T& val) 
+   {
+      iterator i = this->begin(), iend = this->end();
+
+      for ( ; i != iend && n > 0; ++i, --n)
+         *i = val;
+      if (n > 0){
+         this->priv_create_and_insert_nodes(this->cend(), n, val);
+      }
+      else{
+         this->erase(i, cend());
+      }
+   }
+
+   template <class Integer>
+   void priv_assign_dispatch(Integer n, Integer val, containers_detail::true_)
+   {  this->priv_fill_assign((size_type) n, (T) val); }
+
+   template <class InputIter>
+   void priv_assign_dispatch(InputIter first2, InputIter last2, containers_detail::false_)
+   {
+      iterator first1   = this->begin();
+      iterator last1    = this->end();
+      for ( ; first1 != last1 && first2 != last2; ++first1, ++first2)
+         *first1 = *first2;
+      if (first2 == last2)
+         this->erase(first1, last1);
+      else{
+         this->priv_create_and_insert_nodes(last1, first2, last2);
+      }
+   }
+
+   //Functors for member algorithm defaults
+   struct value_less
+   {
+      bool operator()(const value_type &a, const value_type &b) const
+         {  return a < b;  }
+   };
+
+   struct value_equal
+   {
+      bool operator()(const value_type &a, const value_type &b) const
+         {  return a == b;  }
+   };
+   /// @endcond
+
+};
+
+template <class T, class A>
+inline bool operator==(const list<T,A>& x, const list<T,A>& y)
+{
+   if(x.size() != y.size()){
+      return false;
+   }
+   typedef typename list<T,A>::const_iterator const_iterator;
+   const_iterator end1 = x.end();
+
+   const_iterator i1 = x.begin();
+   const_iterator i2 = y.begin();
+   while (i1 != end1 && *i1 == *i2) {
+      ++i1;
+      ++i2;
+   }
+   return i1 == end1;
+}
+
+template <class T, class A>
+inline bool operator<(const list<T,A>& x,
+                      const list<T,A>& y)
+{
+  return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+template <class T, class A>
+inline bool operator!=(const list<T,A>& x, const list<T,A>& y) 
+{
+  return !(x == y);
+}
+
+template <class T, class A>
+inline bool operator>(const list<T,A>& x, const list<T,A>& y) 
+{
+  return y < x;
+}
+
+template <class T, class A>
+inline bool operator<=(const list<T,A>& x, const list<T,A>& y) 
+{
+  return !(y < x);
+}
+
+template <class T, class A>
+inline bool operator>=(const list<T,A>& x, const list<T,A>& y) 
+{
+  return !(x < y);
+}
+
+template <class T, class A>
+inline void swap(list<T, A>& x, list<T, A>& y)
+{
+  x.swap(y);
+}
+
+}  //namespace container {
+
+/// @cond
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class A>
+struct has_trivial_destructor_after_move<boost::container::list<T, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value;
+};
+
+/// @endcond
+
+}
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif // BOOST_CONTAINERS_LIST_HPP_
Added: sandbox/move/boost/container/map.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/map.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1256 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_map/stl_multimap files. Modified by Ion Gaztanaga.
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+/*
+ *
+ * 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.
+ *
+ */
+
+#ifndef BOOST_CONTAINERS_MAP_HPP
+#define BOOST_CONTAINERS_MAP_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/containers_fwd.hpp>
+#include <utility>
+#include <functional>
+#include <memory>
+#include <stdexcept>
+#include <boost/container/detail/tree.hpp>
+#include <boost/container/detail/value_init.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/pair.hpp>
+#include <boost/move/move.hpp>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+// Forward declarations of operators == and <, needed for friend declarations.
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const map<Key,T,Pred,Alloc>& x, 
+                       const map<Key,T,Pred,Alloc>& y);
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const map<Key,T,Pred,Alloc>& x, 
+                      const map<Key,T,Pred,Alloc>& y);
+/// @endcond
+
+//! A map is a kind of associative container that supports unique keys (contains at 
+//! most one of each key value) and provides for fast retrieval of values of another 
+//! type T based on the keys. The map class supports bidirectional iterators.
+//! 
+//! A map satisfies all of the requirements of a container and of a reversible 
+//! container and of an associative container. For a 
+//! map<Key,T> the key_type is Key and the value_type is std::pair<const Key,T>.
+//!
+//! Pred is the ordering function for Keys (e.g. <i>std::less<Key></i>).
+//!
+//! Alloc is the allocator to allocate the value_types
+//! (e.g. <i>allocator< std::pair<const Key, T> > </i>).
+template <class Key, class T, class Pred, class Alloc>
+class map 
+{
+   /// @cond
+   private:
+   typedef containers_detail::rbtree<Key, 
+                           std::pair<const Key, T>, 
+                           containers_detail::select1st< std::pair<const Key, T> >, 
+                           Pred, 
+                           Alloc> tree_t;
+   tree_t m_tree;  // red-black tree representing map
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(map)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef T                                       mapped_type;
+   typedef Pred                                    key_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+   typedef std::pair<key_type, mapped_type>        nonconst_value_type;
+   typedef containers_detail::pair
+      <key_type, mapped_type>                      nonconst_impl_value_type;
+
+   /// @cond
+   class value_compare_impl
+      :  public Pred,
+         public std::binary_function<value_type, value_type, bool> 
+   {
+      friend class map<Key,T,Pred,Alloc>;
+    protected :
+      value_compare_impl(const Pred &c) : Pred(c) {}
+    public:
+      bool operator()(const value_type& x, const value_type& y) const {
+         return Pred::operator()(x.first, y.first);
+      }
+   };
+   /// @endcond
+   typedef value_compare_impl             value_compare;
+
+   //! <b>Effects</b>: Constructs an empty map using the specified comparison object 
+   //! and allocator.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit map(const Pred& comp = Pred(),
+                const allocator_type& a = allocator_type())
+      : m_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>
+   map(InputIterator first, InputIterator last, const Pred& comp = Pred(),
+         const allocator_type& a = allocator_type())
+      : m_tree(first, last, comp, a, true) 
+   {}
+
+   //! <b>Effects</b>: Copy constructs a map.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   map(const map<Key,T,Pred,Alloc>& x) 
+      : m_tree(x.m_tree)
+   {}
+
+   //! <b>Effects</b>: Move constructs a map. Constructs *this using x's resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
+   map(BOOST_RV_REF(map) x) 
+      : m_tree(boost::move(x.m_tree))
+   {}
+
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   map& operator=(const map<Key, T, Pred, Alloc>& x)
+   {  m_tree = x.m_tree;   return *this;  }
+
+   //! <b>Effects</b>: this->swap(x.get()).
+   //! 
+   //! <b>Complexity</b>: Constant.
+   map& operator=(BOOST_RV_REF(map) x)
+   {  m_tree = boost::move(x.m_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_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 value_compare(m_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_tree.get_allocator(); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   { return m_tree.get_stored_allocator(); }
+
+   stored_allocator_type &get_stored_allocator()
+   { return m_tree.get_stored_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_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_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_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_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_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_tree.rbegin(); }
+
+   //! <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_tree.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_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_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_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_tree.max_size(); }
+
+   //! Effects: If there is no key equivalent to x in the map, inserts 
+   //! value_type(x, T()) into the map.
+   //! 
+   //! Returns: A reference to the mapped_type corresponding to x in *this.
+   //! 
+   //! Complexity: Logarithmic.
+   T& operator[](const key_type& k) 
+   {
+      //we can optimize this
+      iterator i = lower_bound(k);
+      // i->first is greater than or equivalent to k.
+      if (i == end() || key_comp()(k, (*i).first)){
+         containers_detail::value_init<T> v;
+         value_type val(k, boost::move(v.m_t));
+         i = insert(i, boost::move(val));
+      }
+      return (*i).second;
+   }
+
+   //! Effects: If there is no key equivalent to x in the map, inserts 
+   //! value_type(boost::move(x), T()) into the map (the key is move-constructed)
+   //! 
+   //! Returns: A reference to the mapped_type corresponding to x in *this.
+   //! 
+   //! Complexity: Logarithmic.
+   T& operator[](BOOST_RV_REF(key_type) mk) 
+   {
+      key_type &k = mk;
+      //we can optimize this
+      iterator i = lower_bound(k);
+      // i->first is greater than or equivalent to k.
+      if (i == end() || key_comp()(k, (*i).first)){
+         value_type val(boost::move(k), boost::move(T()));
+         i = insert(i, boost::move(val));
+      }
+      return (*i).second;
+   }
+
+   //! Returns: A reference to the element whose key is equivalent to x.
+   //! Throws: An exception object of type out_of_range if no such element is present.
+   //! Complexity: logarithmic.
+   T& at(const key_type& k)
+   {
+      iterator i = this->find(k);
+      if(i == this->end()){
+         throw std::out_of_range("key not found");
+      }
+      return i->second;
+   }
+
+   //! Returns: A reference to the element whose key is equivalent to x.
+   //! Throws: An exception object of type out_of_range if no such element is present.
+   //! Complexity: logarithmic.
+   const T& at(const key_type& k) const
+   {
+      const_iterator i = this->find(k);
+      if(i == this->end()){
+         throw std::out_of_range("key not found");
+      }
+      return i->second;
+   }
+
+   //! <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(map& x)
+   { m_tree.swap(x.m_tree); }
+
+   //! <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.
+   std::pair<iterator,bool> insert(const value_type& x) 
+   { return m_tree.insert_unique(x); }
+
+   //! <b>Effects</b>: Inserts a new value_type created 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.
+   std::pair<iterator,bool> insert(const nonconst_value_type& x) 
+   { return m_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.
+   std::pair<iterator,bool> insert(BOOST_RV_REF(nonconst_value_type) x) 
+   { return m_tree.insert_unique(boost::move(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.
+   std::pair<iterator,bool> insert(BOOST_RV_REF(nonconst_impl_value_type) x) 
+   { return m_tree.insert_unique(boost::move(x)); }
+
+   //! <b>Effects</b>: Move constructs a new value from 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.
+   std::pair<iterator,bool> insert(BOOST_RV_REF(value_type) x) 
+   { return m_tree.insert_unique(boost::move(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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(iterator position, const value_type& x)
+   { return m_tree.insert_unique(position, x); }
+
+   //! <b>Effects</b>: Move constructs a new value from x 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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(iterator position, BOOST_RV_REF(nonconst_value_type) x)
+   { return m_tree.insert_unique(position, boost::move(x)); }
+
+   //! <b>Effects</b>: Move constructs a new value from x 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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(iterator position, BOOST_RV_REF(nonconst_impl_value_type) x)
+   { return m_tree.insert_unique(position, boost::move(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.
+   iterator insert(iterator position, const nonconst_value_type& x)
+   { return m_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.
+   iterator insert(iterator position, BOOST_RV_REF(value_type) x)
+   { return m_tree.insert_unique(position, boost::move(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)
+   template <class InputIterator>
+   void insert(InputIterator first, InputIterator last) 
+   {  m_tree.insert_unique(first, last);  }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... in the container if and only if there is 
+   //!   no element in the container with an equivalent key.
+   //!   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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return m_tree.emplace_unique(boost::forward<Args>(args)...); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... in the container if and only if there is 
+   //!   no element in the container with an equivalent key.
+   //!   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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {  return m_tree.emplace_hint_unique(hint, boost::forward<Args>(args)...); }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return m_tree.emplace_unique(); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return m_tree.emplace_hint_unique(hint); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                       \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                               \
+   {  return m_tree.emplace_unique(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }          \
+                                                                                                         \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))     \
+   {  return m_tree.emplace_hint_unique(hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));}\
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <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>: Amortized constant time
+   iterator erase(const_iterator position) 
+   { return m_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>: log(size()) + count(k)
+   size_type erase(const key_type& x) 
+   { return m_tree.erase(x); }
+
+   //! <b>Effects</b>: Erases all the elements in the range [first, last).
+   //!
+   //! <b>Returns</b>: Returns last.
+   //!
+   //! <b>Complexity</b>: log(size())+N where N is the distance from first to last.
+   iterator erase(const_iterator first, const_iterator last)
+   { return m_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_tree.clear(); }
+
+   //! <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_tree.find(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.
+   const_iterator find(const key_type& x) const 
+   { return m_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_tree.find(x) == m_tree.end() ? 0 : 1;  }
+
+   //! <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_tree.lower_bound(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_tree.lower_bound(x); }
+
+   //! <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_tree.upper_bound(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_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<iterator,iterator> equal_range(const key_type& x) 
+   {  return m_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<const_iterator,const_iterator> equal_range(const key_type& x) const 
+   {  return m_tree.equal_range(x); }
+
+   /// @cond
+   template <class K1, class T1, class C1, class A1>
+   friend bool operator== (const map<K1, T1, C1, A1>&,
+                           const map<K1, T1, C1, A1>&);
+   template <class K1, class T1, class C1, class A1>
+   friend bool operator< (const map<K1, T1, C1, A1>&,
+                           const map<K1, T1, C1, A1>&);
+   /// @endcond
+};
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const map<Key,T,Pred,Alloc>& x, 
+                       const map<Key,T,Pred,Alloc>& y) 
+   {  return x.m_tree == y.m_tree;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const map<Key,T,Pred,Alloc>& x, 
+                      const map<Key,T,Pred,Alloc>& y) 
+   {  return x.m_tree < y.m_tree;   }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator!=(const map<Key,T,Pred,Alloc>& x, 
+                       const map<Key,T,Pred,Alloc>& y) 
+   {  return !(x == y); }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>(const map<Key,T,Pred,Alloc>& x, 
+                      const map<Key,T,Pred,Alloc>& y) 
+   {  return y < x;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<=(const map<Key,T,Pred,Alloc>& x, 
+                       const map<Key,T,Pred,Alloc>& y) 
+   {  return !(y < x);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>=(const map<Key,T,Pred,Alloc>& x, 
+                       const map<Key,T,Pred,Alloc>& y) 
+   {  return !(x < y);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline void swap(map<Key,T,Pred,Alloc>& x, map<Key,T,Pred,Alloc>& y) 
+   {  x.swap(y);  }
+
+/// @cond
+
+// Forward declaration of operators < and ==, needed for friend declaration.
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const multimap<Key,T,Pred,Alloc>& x, 
+                       const multimap<Key,T,Pred,Alloc>& y);
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const multimap<Key,T,Pred,Alloc>& x, 
+                      const multimap<Key,T,Pred,Alloc>& y);
+
+}  //namespace container {
+
+//!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<boost::container::map<K, T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+namespace container {
+
+/// @endcond
+
+//! A multimap is a kind of associative container that supports equivalent keys 
+//! (possibly containing multiple copies of the same key value) and provides for 
+//! fast retrieval of values of another type T based on the keys. The multimap class
+//! supports bidirectional iterators.
+//! 
+//! A multimap satisfies all of the requirements of a container and of a reversible 
+//! container and of an associative container. For a 
+//! map<Key,T> the key_type is Key and the value_type is std::pair<const Key,T>. 
+//!
+//! Pred is the ordering function for Keys (e.g. <i>std::less<Key></i>).
+//!
+//! Alloc is the allocator to allocate the value_types
+//!(e.g. <i>allocator< std::pair<<b>const</b> Key, T> ></i>).
+template <class Key, class T, class Pred, class Alloc>
+class multimap 
+{
+   /// @cond
+   private:
+   typedef containers_detail::rbtree<Key, 
+                           std::pair<const Key, T>, 
+                           containers_detail::select1st< std::pair<const Key, T> >, 
+                           Pred, 
+                           Alloc> tree_t;
+   tree_t m_tree;  // red-black tree representing map
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(multimap)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef T                                       mapped_type;
+   typedef Pred                                    key_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+   typedef std::pair<key_type, mapped_type>        nonconst_value_type;
+   typedef containers_detail::pair
+      <key_type, mapped_type>                      nonconst_impl_value_type;
+
+   /// @cond
+   class value_compare_impl
+      :  public Pred,
+         public std::binary_function<value_type, value_type, bool> 
+   {
+      friend class multimap<Key,T,Pred,Alloc>;
+    protected :
+      value_compare_impl(const Pred &c) : Pred(c) {}
+    public:
+      bool operator()(const value_type& x, const value_type& y) const {
+         return Pred::operator()(x.first, y.first);
+      }
+   };
+   /// @endcond
+   typedef value_compare_impl                      value_compare;
+
+   //! <b>Effects</b>: Constructs an empty multimap using the specified comparison
+   //!   object and allocator.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit multimap(const Pred& comp = Pred(),
+                     const allocator_type& a = allocator_type())
+      : m_tree(comp, a)
+   {}
+
+   //! <b>Effects</b>: Constructs an empty multimap 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>
+   multimap(InputIterator first, InputIterator last,
+            const Pred& comp = Pred(),
+            const allocator_type& a = allocator_type())
+      : m_tree(first, last, comp, a, false) 
+   {}
+
+   //! <b>Effects</b>: Copy constructs a multimap.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   multimap(const multimap<Key,T,Pred,Alloc>& x) 
+      : m_tree(x.m_tree)
+   {}
+
+   //! <b>Effects</b>: Move constructs a multimap. Constructs *this using x's resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
+   multimap(BOOST_RV_REF(multimap) x) 
+      : m_tree(boost::move(x.m_tree))
+   {}
+
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   multimap& operator=(const multimap<Key,T,Pred,Alloc>& x) 
+   {  m_tree = x.m_tree;   return *this;  }
+
+   //! <b>Effects</b>: this->swap(x.get()).
+   //! 
+   //! <b>Complexity</b>: Constant.
+   multimap& operator=(BOOST_RV_REF(multimap) x) 
+   {  m_tree = boost::move(x.m_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_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 value_compare(m_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_tree.get_allocator(); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   { return m_tree.get_stored_allocator(); }
+
+   stored_allocator_type &get_stored_allocator()
+   { return m_tree.get_stored_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_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_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_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_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_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_tree.rbegin(); }
+
+   //! <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_tree.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_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_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_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_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(multimap& x)
+   { m_tree.swap(x.m_tree); }
+
+   //! <b>Effects</b>: Inserts x and returns the iterator pointing to the
+   //!   newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   iterator insert(const value_type& x) 
+   { return m_tree.insert_equal(x); }
+
+   //! <b>Effects</b>: Inserts a new value constructed from x and returns 
+   //!   the iterator pointing to the newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   iterator insert(const nonconst_value_type& x) 
+   { return m_tree.insert_equal(x); }
+
+   //! <b>Effects</b>: Inserts a new value move-constructed from x and returns 
+   //!   the iterator pointing to the newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   iterator insert(BOOST_RV_REF(nonconst_value_type) x) 
+   { return m_tree.insert_equal(boost::move(x)); }
+
+   //! <b>Effects</b>: Inserts a new value move-constructed from x and returns 
+   //!   the iterator pointing to the newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   iterator insert(BOOST_RV_REF(nonconst_impl_value_type) x) 
+   { return m_tree.insert_equal(boost::move(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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(iterator position, const value_type& x)
+   { return m_tree.insert_equal(position, x); }
+
+   //! <b>Effects</b>: Inserts a new value 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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(iterator position, const nonconst_value_type& x)
+   { return m_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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(iterator position, BOOST_RV_REF(nonconst_value_type) x)
+   { return m_tree.insert_equal(position, boost::move(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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(iterator position, BOOST_RV_REF(nonconst_impl_value_type) x)
+   { return m_tree.insert_equal(position, boost::move(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)
+   template <class InputIterator>
+   void insert(InputIterator first, InputIterator last) 
+   {  m_tree.insert_equal(first, last); }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return m_tree.emplace_equal(boost::forward<Args>(args)...); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... 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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {  return m_tree.emplace_hint_equal(hint, boost::forward<Args>(args)...); }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return m_tree.emplace_equal(); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return m_tree.emplace_hint_equal(hint); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                       \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                               \
+   {  return m_tree.emplace_equal(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }           \
+                                                                                                         \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))     \
+   {  return m_tree.emplace_hint_equal(hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }\
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <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>: Amortized constant time
+   iterator erase(const_iterator position) 
+   { return m_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>: log(size()) + count(k)
+   size_type erase(const key_type& x) 
+   { return m_tree.erase(x); }
+
+   //! <b>Effects</b>: Erases all the elements in the range [first, last).
+   //!
+   //! <b>Returns</b>: Returns last.
+   //!
+   //! <b>Complexity</b>: log(size())+N where N is the distance from first to last.
+   iterator erase(const_iterator first, const_iterator last)
+   { return m_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_tree.clear(); }
+
+   //! <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_tree.find(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.
+   const_iterator find(const key_type& x) const 
+   { return m_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_tree.count(x); }
+
+   //! <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_tree.lower_bound(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_tree.lower_bound(x);  }
+
+   //! <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_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<iterator,iterator> equal_range(const key_type& x) 
+   {  return m_tree.equal_range(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_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_tree.equal_range(x);   }
+
+   /// @cond
+   template <class K1, class T1, class C1, class A1>
+   friend bool operator== (const multimap<K1, T1, C1, A1>& x,
+                           const multimap<K1, T1, C1, A1>& y);
+
+   template <class K1, class T1, class C1, class A1>
+   friend bool operator< (const multimap<K1, T1, C1, A1>& x,
+                          const multimap<K1, T1, C1, A1>& y);
+   /// @endcond
+};
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator==(const multimap<Key,T,Pred,Alloc>& x, 
+                       const multimap<Key,T,Pred,Alloc>& y) 
+{  return x.m_tree == y.m_tree;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<(const multimap<Key,T,Pred,Alloc>& x, 
+                      const multimap<Key,T,Pred,Alloc>& y) 
+{  return x.m_tree < y.m_tree;   }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator!=(const multimap<Key,T,Pred,Alloc>& x, 
+                       const multimap<Key,T,Pred,Alloc>& y) 
+{  return !(x == y);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>(const multimap<Key,T,Pred,Alloc>& x, 
+                      const multimap<Key,T,Pred,Alloc>& y) 
+{  return y < x;  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator<=(const multimap<Key,T,Pred,Alloc>& x, 
+                       const multimap<Key,T,Pred,Alloc>& y) 
+{  return !(y < x);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline bool operator>=(const multimap<Key,T,Pred,Alloc>& x, 
+                       const multimap<Key,T,Pred,Alloc>& y) 
+{  return !(x < y);  }
+
+template <class Key, class T, class Pred, class Alloc>
+inline void swap(multimap<Key,T,Pred,Alloc>& x, multimap<Key,T,Pred,Alloc>& y) 
+{  x.swap(y);  }
+
+}  //namespace container {
+
+/// @cond
+
+//!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<boost::container::multimap<K, T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+/// @endcond
+
+}
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif /* BOOST_CONTAINERS_MAP_HPP */
+
Added: sandbox/move/boost/container/set.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/set.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1102 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_set/stl_multiset files. Modified by Ion Gaztanaga 2004.
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+/*
+ *
+ * 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.
+ *
+ */
+
+#ifndef BOOST_CONTAINERS_SET_HPP
+#define BOOST_CONTAINERS_SET_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/containers_fwd.hpp>
+
+#include <utility>
+#include <functional>
+#include <memory>
+
+#include <boost/move/move.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/tree.hpp>
+#include <boost/move/move.hpp>
+#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+#include <boost/container/detail/preprocessor.hpp>
+#endif
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+// Forward declarations of operators < and ==, needed for friend declaration.
+template <class T, class Pred, class Alloc>
+inline bool operator==(const set<T,Pred,Alloc>& x, 
+                       const set<T,Pred,Alloc>& y);
+
+template <class T, class Pred, class Alloc>
+inline bool operator<(const set<T,Pred,Alloc>& x, 
+                      const set<T,Pred,Alloc>& y);
+/// @endcond
+
+//! A set is a kind of associative container that supports unique keys (contains at 
+//! most one of each key value) and provides for fast retrieval of the keys themselves. 
+//! Class set supports bidirectional iterators. 
+//! 
+//! A set satisfies all of the requirements of a container and of a reversible container 
+//! , and of an associative container. A set also provides most operations described in 
+//! for unique keys.
+template <class T, class Pred, class Alloc>
+class set 
+{
+   /// @cond
+   private:
+   typedef containers_detail::rbtree<T, T, 
+                     containers_detail::identity<T>, Pred, Alloc> tree_t;
+   tree_t m_tree;  // red-black tree representing set
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(set)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef Pred                                    key_compare;
+   typedef Pred                                    value_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+
+   //! <b>Effects</b>: Constructs an empty set using the specified comparison object 
+   //! and allocator.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit set(const Pred& comp = Pred(),
+                const allocator_type& a = allocator_type())
+      : m_tree(comp, a)
+   {}
+
+   //! <b>Effects</b>: Constructs an empty set 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>
+   set(InputIterator first, InputIterator last, const Pred& comp = Pred(),
+         const allocator_type& a = allocator_type())
+      : m_tree(first, last, comp, a, true) 
+   {}
+
+   //! <b>Effects</b>: Copy constructs a set.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   set(const set& x) 
+      : m_tree(x.m_tree)
+   {}
+
+   //! <b>Effects</b>: Move constructs a set. Constructs *this using x's resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
+   set(BOOST_RV_REF(set) x) 
+      : m_tree(boost::move(x.m_tree))
+   {}
+
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   set<T,Pred,Alloc>& operator=(const set<T, Pred, Alloc>& x)
+   {  m_tree = x.m_tree;   return *this;  }
+
+   //! <b>Effects</b>: this->swap(x.get()).
+   //! 
+   //! <b>Complexity</b>: Constant.
+   set& operator=(BOOST_RV_REF(set) x)
+   {  m_tree = boost::move(x.m_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_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_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_tree.get_allocator(); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   { return m_tree.get_stored_allocator(); }
+
+   stored_allocator_type &get_stored_allocator()
+   { return m_tree.get_stored_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_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_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_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_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_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_tree.rbegin(); } 
+
+   //! <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_tree.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_tree.rend(); }
+
+   //! <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 cbegin() const 
+   { return m_tree.cbegin(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend() const 
+   { return m_tree.cend(); }
+
+   //! <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 crbegin() const 
+   { return m_tree.crbegin(); } 
+
+   //! <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 crend() const 
+   { return m_tree.crend(); }
+
+   //! <b>Effects</b>: Returns true if the container contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   bool empty() const 
+   { return m_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_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_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(set& x)
+   { m_tree.swap(x.m_tree); }
+
+   //! <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.
+   std::pair<iterator,bool> insert(const value_type& x) 
+   {  return m_tree.insert_unique(x);  }
+
+   //! <b>Effects</b>: Move constructs a new value from 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.
+   std::pair<iterator,bool> insert(BOOST_RV_REF(value_type) x) 
+   {  return m_tree.insert_unique(boost::move(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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(const_iterator p, const value_type& x) 
+   {  return m_tree.insert_unique(p, 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.
+   iterator insert(const_iterator p, BOOST_RV_REF(value_type) x) 
+   {  return m_tree.insert_unique(p, boost::move(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)
+   template <class InputIterator>
+   void insert(InputIterator first, InputIterator last) 
+   {  m_tree.insert_unique(first, last);  }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>:  Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... if and only if there is 
+   //!   no element in the container with equivalent value.
+   //!   and returns the iterator pointing to the
+   //!   newly inserted element. 
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return m_tree.emplace_unique(boost::forward<Args>(args)...); }
+
+   //! <b>Effects</b>:  Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... if and only if there is 
+   //!   no element in the container with equivalent value.
+   //!   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.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {  return m_tree.emplace_hint_unique(hint, boost::forward<Args>(args)...); }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return m_tree.emplace_unique(); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return m_tree.emplace_hint_unique(hint); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                       \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                               \
+   {  return m_tree.emplace_unique(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }          \
+                                                                                                         \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))     \
+   {  return m_tree.emplace_hint_unique(hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));}\
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <b>Effects</b>: Erases the element pointed to by p.
+   //!
+   //! <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>: Amortized constant time
+   iterator erase(const_iterator p) 
+   {  return m_tree.erase(p); }
+
+   //! <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>: log(size()) + count(k)
+   size_type erase(const key_type& x) 
+   {  return m_tree.erase(x); }
+
+   //! <b>Effects</b>: Erases all the elements in the range [first, last).
+   //!
+   //! <b>Returns</b>: Returns last.
+   //!
+   //! <b>Complexity</b>: log(size())+N where N is the distance from first to last.
+   iterator erase(const_iterator first, const_iterator last) 
+   {  return m_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_tree.clear(); }
+
+   //! <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_tree.find(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.
+   const_iterator find(const key_type& x) const 
+   { return m_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_tree.find(x) == m_tree.end() ? 0 : 1;  }
+
+   //! <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_tree.lower_bound(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_tree.lower_bound(x); }
+
+   //! <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_tree.upper_bound(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_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<iterator,iterator> 
+      equal_range(const key_type& x) 
+   {  return m_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<const_iterator, const_iterator> 
+      equal_range(const key_type& x) const 
+   {  return m_tree.equal_range(x); }
+
+   /// @cond
+   template <class K1, class C1, class A1>
+   friend bool operator== (const set<K1,C1,A1>&, const set<K1,C1,A1>&);
+
+   template <class K1, class C1, class A1>
+   friend bool operator< (const set<K1,C1,A1>&, const set<K1,C1,A1>&);
+   /// @endcond
+};
+
+template <class T, class Pred, class Alloc>
+inline bool operator==(const set<T,Pred,Alloc>& x, 
+                       const set<T,Pred,Alloc>& y) 
+{  return x.m_tree == y.m_tree;  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<(const set<T,Pred,Alloc>& x, 
+                      const set<T,Pred,Alloc>& y) 
+{  return x.m_tree < y.m_tree;   }
+
+template <class T, class Pred, class Alloc>
+inline bool operator!=(const set<T,Pred,Alloc>& x, 
+                       const set<T,Pred,Alloc>& y) 
+{  return !(x == y);   }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>(const set<T,Pred,Alloc>& x, 
+                      const set<T,Pred,Alloc>& y) 
+{  return y < x; }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<=(const set<T,Pred,Alloc>& x, 
+                       const set<T,Pred,Alloc>& y) 
+{  return !(y < x); }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>=(const set<T,Pred,Alloc>& x, 
+                       const set<T,Pred,Alloc>& y) 
+{  return !(x < y);  }
+
+template <class T, class Pred, class Alloc>
+inline void swap(set<T,Pred,Alloc>& x, set<T,Pred,Alloc>& y) 
+{  x.swap(y);  }
+
+/// @cond
+
+}  //namespace container {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class C, class A>
+struct has_trivial_destructor_after_move<boost::container::set<T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+namespace container {
+
+// Forward declaration of operators < and ==, needed for friend declaration.
+
+template <class T, class Pred, class Alloc>
+inline bool operator==(const multiset<T,Pred,Alloc>& x, 
+                       const multiset<T,Pred,Alloc>& y);
+
+template <class T, class Pred, class Alloc>
+inline bool operator<(const multiset<T,Pred,Alloc>& x, 
+                      const multiset<T,Pred,Alloc>& y);
+/// @endcond
+
+//! A multiset is a kind of associative container that supports equivalent keys 
+//! (possibly contains multiple copies of the same key value) and provides for 
+//! fast retrieval of the keys themselves. Class multiset supports bidirectional iterators.
+//! 
+//! A multiset satisfies all of the requirements of a container and of a reversible 
+//! container, and of an associative container). multiset also provides most operations 
+//! described for duplicate keys.
+template <class T, class Pred, class Alloc>
+class multiset 
+{
+   /// @cond
+   private:
+   typedef containers_detail::rbtree<T, T, 
+                     containers_detail::identity<T>, Pred, Alloc> tree_t;
+   tree_t m_tree;  // red-black tree representing multiset
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(multiset)
+
+   // typedefs:
+   typedef typename tree_t::key_type               key_type;
+   typedef typename tree_t::value_type             value_type;
+   typedef typename tree_t::pointer                pointer;
+   typedef typename tree_t::const_pointer          const_pointer;
+   typedef typename tree_t::reference              reference;
+   typedef typename tree_t::const_reference        const_reference;
+   typedef Pred                                    key_compare;
+   typedef Pred                                    value_compare;
+   typedef typename tree_t::iterator               iterator;
+   typedef typename tree_t::const_iterator         const_iterator;
+   typedef typename tree_t::reverse_iterator       reverse_iterator;
+   typedef typename tree_t::const_reverse_iterator const_reverse_iterator;
+   typedef typename tree_t::size_type              size_type;
+   typedef typename tree_t::difference_type        difference_type;
+   typedef typename tree_t::allocator_type         allocator_type;
+   typedef typename tree_t::stored_allocator_type  stored_allocator_type;
+
+   //! <b>Effects</b>: Constructs an empty multiset using the specified comparison
+   //!   object and allocator.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit multiset(const Pred& comp = Pred(),
+                     const allocator_type& a = allocator_type())
+      : m_tree(comp, a)
+   {}
+
+   //! <b>Effects</b>: Constructs an empty multiset 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>
+   multiset(InputIterator first, InputIterator last,
+            const Pred& comp = Pred(),
+            const allocator_type& a = allocator_type())
+      : m_tree(first, last, comp, a, false) 
+   {}
+
+   //! <b>Effects</b>: Copy constructs a multiset.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   multiset(const multiset& x) 
+      : m_tree(x.m_tree)
+   {}
+
+   //! <b>Effects</b>: Move constructs a multiset. Constructs *this using x's resources.
+   //! 
+   //! <b>Complexity</b>: Construct.
+   //! 
+   //! <b>Postcondition</b>: x is emptied.
+   multiset(BOOST_RV_REF(multiset) x) 
+      : m_tree(boost::move(x.m_tree))
+   {}
+
+   //! <b>Effects</b>: Makes *this a copy of x.
+   //! 
+   //! <b>Complexity</b>: Linear in x.size().
+   multiset<T,Pred,Alloc>& operator=(const multiset& x) 
+   {  m_tree = x.m_tree;   return *this;  }
+
+   //! <b>Effects</b>: this->swap(x.get()).
+   //! 
+   //! <b>Complexity</b>: Constant.
+   multiset& operator=(BOOST_RV_REF(multiset) x) 
+   {  m_tree = boost::move(x.m_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_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_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_tree.get_allocator(); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   { return m_tree.get_stored_allocator(); }
+
+   stored_allocator_type &get_stored_allocator()
+   { return m_tree.get_stored_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_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_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_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_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_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_tree.rbegin(); } 
+
+   //! <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_tree.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_tree.rend(); }
+
+   //! <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 cbegin() const 
+   { return m_tree.cbegin(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend() const 
+   { return m_tree.cend(); }
+
+   //! <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 crbegin() const 
+   { return m_tree.crbegin(); } 
+
+   //! <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 crend() const 
+   { return m_tree.crend(); }
+
+   //! <b>Effects</b>: Returns true if the container contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   bool empty() const 
+   { return m_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_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_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(multiset& x)
+   { m_tree.swap(x.m_tree); }
+
+   //! <b>Effects</b>: Inserts x and returns the iterator pointing to the
+   //!   newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   iterator insert(const value_type& x) 
+   {  return m_tree.insert_equal(x);   }
+
+   //! <b>Effects</b>: Inserts a copy of x in the container.
+   //!
+   //! <b>Returns</b>: An iterator pointing to the element with key equivalent
+   //!   to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(BOOST_RV_REF(value_type) x) 
+   {  return m_tree.insert_equal(boost::move(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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(const_iterator p, const value_type& x) 
+   {  return m_tree.insert_equal(p, x);  }
+
+   //! <b>Effects</b>: Inserts a 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 in general, but amortized constant if t
+   //!   is inserted right before p.
+   iterator insert(const_iterator p, BOOST_RV_REF(value_type) x) 
+   {  return m_tree.insert_equal(p, boost::move(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)
+   template <class InputIterator>
+   void insert(InputIterator first, InputIterator last) 
+   {  m_tree.insert_equal(first, last);  }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... and returns the iterator pointing to the
+   //!   newly inserted element. 
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   template <class... Args>
+   iterator emplace(Args&&... args)
+   {  return m_tree.emplace_equal(boost::forward<Args>(args)...); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)...
+   //!
+   //! <b>Returns</b>: An iterator pointing to the element with key equivalent
+   //!   to the key of x.
+   //!
+   //! <b>Complexity</b>: Logarithmic in general, but amortized constant if t
+   //!   is inserted right before p.
+   template <class... Args>
+   iterator emplace_hint(const_iterator hint, Args&&... args)
+   {  return m_tree.emplace_hint_equal(hint, boost::forward<Args>(args)...); }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator emplace()
+   {  return m_tree.emplace_equal(); }
+
+   iterator emplace_hint(const_iterator hint)
+   {  return m_tree.emplace_hint_equal(hint); }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                                       \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                               \
+   {  return m_tree.emplace_equal(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }           \
+                                                                                                         \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                            \
+   iterator emplace_hint(const_iterator hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))     \
+   {  return m_tree.emplace_hint_equal(hint, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _)); }\
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <b>Effects</b>: Erases the element pointed to by p.
+   //!
+   //! <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>: Amortized constant time
+   iterator erase(const_iterator p) 
+   {  return m_tree.erase(p); }
+
+   //! <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>: log(size()) + count(k)
+   size_type erase(const key_type& x) 
+   {  return m_tree.erase(x); }
+
+   //! <b>Effects</b>: Erases all the elements in the range [first, last).
+   //!
+   //! <b>Returns</b>: Returns last.
+   //!
+   //! <b>Complexity</b>: log(size())+N where N is the distance from first to last.
+   iterator erase(const_iterator first, const_iterator last)
+   {  return m_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_tree.clear(); }
+
+   //! <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_tree.find(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.
+   const_iterator find(const key_type& x) const 
+   { return m_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_tree.count(x);  }
+
+   //! <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_tree.lower_bound(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_tree.lower_bound(x); }
+
+   //! <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_tree.upper_bound(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_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<iterator,iterator> 
+      equal_range(const key_type& x) 
+   {  return m_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<const_iterator, const_iterator> 
+      equal_range(const key_type& x) const 
+   {  return m_tree.equal_range(x); }
+
+   /// @cond
+   template <class K1, class C1, class A1>
+   friend bool operator== (const multiset<K1,C1,A1>&,
+                           const multiset<K1,C1,A1>&);
+   template <class K1, class C1, class A1>
+   friend bool operator< (const multiset<K1,C1,A1>&,
+                          const multiset<K1,C1,A1>&);
+   /// @endcond
+};
+
+template <class T, class Pred, class Alloc>
+inline bool operator==(const multiset<T,Pred,Alloc>& x, 
+                       const multiset<T,Pred,Alloc>& y) 
+{  return x.m_tree == y.m_tree;  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<(const multiset<T,Pred,Alloc>& x, 
+                      const multiset<T,Pred,Alloc>& y) 
+{  return x.m_tree < y.m_tree;   }
+
+template <class T, class Pred, class Alloc>
+inline bool operator!=(const multiset<T,Pred,Alloc>& x, 
+                       const multiset<T,Pred,Alloc>& y) 
+{  return !(x == y);  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>(const multiset<T,Pred,Alloc>& x, 
+                      const multiset<T,Pred,Alloc>& y) 
+{  return y < x;  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator<=(const multiset<T,Pred,Alloc>& x, 
+                       const multiset<T,Pred,Alloc>& y) 
+{  return !(y < x);  }
+
+template <class T, class Pred, class Alloc>
+inline bool operator>=(const multiset<T,Pred,Alloc>& x, 
+                       const multiset<T,Pred,Alloc>& y) 
+{  return !(x < y);  }
+
+template <class T, class Pred, class Alloc>
+inline void swap(multiset<T,Pred,Alloc>& x, multiset<T,Pred,Alloc>& y) 
+{  x.swap(y);  }
+
+}  //namespace container {
+
+/// @cond
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class C, class A>
+struct has_trivial_destructor_after_move<boost::container::multiset<T, C, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value && has_trivial_destructor<C>::value;
+};
+
+/// @endcond
+
+}
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif /* BOOST_CONTAINERS_SET_HPP */
+
Added: sandbox/move/boost/container/slist.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/slist.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1519 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2004-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_slist.h file. Modified by Ion Gaztanaga 2004-2008
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+/*
+ *
+ * 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.
+ *
+ */
+
+#ifndef BOOST_CONTAINERS_SLIST_HPP
+#define BOOST_CONTAINERS_SLIST_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/containers_fwd.hpp>
+#include <boost/move/move.hpp>
+#include <boost/pointer_to_other.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/container/detail/node_alloc_holder.hpp>
+#include <boost/intrusive/slist.hpp>
+
+
+#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+//Preprocessor library to emulate perfect forwarding
+#include <boost/container/detail/preprocessor.hpp> 
+#endif
+
+#include <iterator>
+#include <utility>
+#include <memory>
+#include <functional>
+#include <algorithm>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+
+namespace containers_detail {
+
+template<class VoidPointer>
+struct slist_hook
+{
+   typedef typename containers_detail::bi::make_slist_base_hook
+      <containers_detail::bi::void_pointer<VoidPointer>, containers_detail::bi::link_mode<containers_detail::bi::normal_link> >::type type;
+};
+
+template <class T, class VoidPointer>
+struct slist_node
+   :  public slist_hook<VoidPointer>::type
+{
+   #ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   slist_node()
+      : m_data()
+   {}
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                           \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   slist_node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                         \
+      : m_data(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _))                     \
+   {}                                                                                        \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #else //#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template<class ...Args>
+   slist_node(Args &&...args)
+      : m_data(boost::forward<Args>(args)...)
+   {}
+   #endif//#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   T m_data;
+};
+
+template<class A>
+struct intrusive_slist_type
+{
+   typedef typename A::value_type               value_type;
+   typedef typename boost::pointer_to_other
+      <typename A::pointer, void>::type         void_pointer;
+   typedef typename containers_detail::slist_node
+         <value_type, void_pointer>             node_type;
+
+   typedef typename containers_detail::bi::make_slist
+      <node_type
+      ,containers_detail::bi::base_hook<typename slist_hook<void_pointer>::type>
+      ,containers_detail::bi::constant_time_size<true>
+      ,containers_detail::bi::size_type<typename A::size_type>
+      >::type                                   container_type;
+   typedef container_type                       type ;
+};
+
+}  //namespace containers_detail {
+
+/// @endcond
+
+//! An slist is a singly linked list: a list where each element is linked to the next 
+//! element, but not to the previous element. That is, it is a Sequence that 
+//! supports forward but not backward traversal, and (amortized) constant time 
+//! insertion and removal of elements. Slists, like lists, have the important 
+//! property that insertion and splicing do not invalidate iterators to list elements, 
+//! and that even removal invalidates only the iterators that point to the elements 
+//! that are removed. The ordering of iterators may be changed (that is, 
+//! slist<T>::iterator might have a different predecessor or successor after a list 
+//! operation than it did before), but the iterators themselves will not be invalidated 
+//! or made to point to different elements unless that invalidation or mutation is explicit.
+//!
+//! The main difference between slist and list is that list's iterators are bidirectional 
+//! iterators, while slist's iterators are forward iterators. This means that slist is 
+//! less versatile than list; frequently, however, bidirectional iterators are 
+//! unnecessary. You should usually use slist unless you actually need the extra 
+//! functionality of list, because singly linked lists are smaller and faster than double 
+//! linked lists. 
+//! 
+//! Important performance note: like every other Sequence, slist defines the member 
+//! functions insert and erase. Using these member functions carelessly, however, can 
+//! result in disastrously slow programs. The problem is that insert's first argument is 
+//! an iterator p, and that it inserts the new element(s) before p. This means that 
+//! insert must find the iterator just before p; this is a constant-time operation 
+//! for list, since list has bidirectional iterators, but for slist it must find that 
+//! iterator by traversing the list from the beginning up to p. In other words: 
+//! insert and erase are slow operations anywhere but near the beginning of the slist.
+//! 
+//! Slist provides the member functions insert_after and erase_after, which are constant 
+//! time operations: you should always use insert_after and erase_after whenever 
+//! possible. If you find that insert_after and erase_after aren't adequate for your 
+//! needs, and that you often need to use insert and erase in the middle of the list, 
+//! then you should probably use list instead of slist.
+template <class T, class A>
+class slist 
+   : protected containers_detail::node_alloc_holder
+      <A, typename containers_detail::intrusive_slist_type<A>::type>
+{
+   /// @cond
+   typedef typename 
+      containers_detail::intrusive_slist_type<A>::type           Icont;
+   typedef containers_detail::node_alloc_holder<A, Icont>        AllocHolder;
+   typedef typename AllocHolder::NodePtr              NodePtr;
+   typedef slist <T, A>                               ThisType;
+   typedef typename AllocHolder::NodeAlloc            NodeAlloc;
+   typedef typename AllocHolder::ValAlloc             ValAlloc;
+   typedef typename AllocHolder::Node                 Node;
+   typedef containers_detail::allocator_destroyer<NodeAlloc>     Destroyer;
+   typedef typename AllocHolder::allocator_v1         allocator_v1;
+   typedef typename AllocHolder::allocator_v2         allocator_v2;
+   typedef typename AllocHolder::alloc_version        alloc_version;
+
+   class equal_to_value
+   {
+      typedef typename AllocHolder::value_type value_type;
+      const value_type &t_;
+
+      public:
+      equal_to_value(const value_type &t)
+         :  t_(t)
+      {}
+
+      bool operator()(const value_type &t)const
+      {  return t_ == t;   }
+   };
+
+   template<class Pred>
+   struct ValueCompareToNodeCompare
+      :  Pred
+   {
+      ValueCompareToNodeCompare(Pred pred)
+         :  Pred(pred)
+      {}
+
+      bool operator()(const Node &a, const Node &b) const
+      {  return static_cast<const Pred&>(*this)(a.m_data, b.m_data);  }
+
+      bool operator()(const Node &a) const
+      {  return static_cast<const Pred&>(*this)(a.m_data);  }
+   };
+   /// @endcond
+   public:
+   //! The type of object, T, stored in the list
+   typedef T                                       value_type;
+   //! Pointer to T
+   typedef typename A::pointer                     pointer;
+   //! Const pointer to T
+   typedef typename A::const_pointer               const_pointer;
+   //! Reference to T
+   typedef typename A::reference                   reference;
+   //! Const reference to T
+   typedef typename A::const_reference             const_reference;
+   //! An unsigned integral type
+   typedef typename A::size_type                   size_type;
+   //! A signed integral type
+   typedef typename A::difference_type             difference_type;
+   //! The allocator type
+   typedef A                                       allocator_type;
+   //! The stored allocator type
+   typedef NodeAlloc                               stored_allocator_type;
+
+   /// @cond
+   private:
+   typedef difference_type                         list_difference_type;
+   typedef pointer                                 list_pointer;
+   typedef const_pointer                           list_const_pointer;
+   typedef reference                               list_reference;
+   typedef const_reference                         list_const_reference;
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(slist)
+
+   //! Const iterator used to iterate through a list. 
+   class const_iterator
+      /// @cond
+      : public std::iterator<std::forward_iterator_tag, 
+                                 value_type,         list_difference_type, 
+                                 list_const_pointer, list_const_reference>
+   {
+
+      protected:
+      typename Icont::iterator m_it;
+      explicit const_iterator(typename Icont::iterator it)  : m_it(it){}
+      void prot_incr(){ ++m_it; }
+
+      private:
+      typename Icont::iterator get()
+      {  return this->m_it;   }
+
+      public:
+      friend class slist<T, A>;
+      typedef list_difference_type        difference_type;
+
+      //Constructors
+      const_iterator()
+         :  m_it()
+      {}
+
+      //Pointer like operators
+      const_reference operator*() const 
+      { return m_it->m_data;  }
+
+      const_pointer   operator->() const 
+      { return  const_pointer(&m_it->m_data); }
+
+      //Increment / Decrement
+      const_iterator& operator++()       
+      { prot_incr();  return *this; }
+
+      const_iterator operator++(int)      
+      { typename Icont::iterator tmp = m_it; ++*this; return const_iterator(tmp);  }
+
+      //Comparison operators
+      bool operator==   (const const_iterator& r)  const
+      {  return m_it == r.m_it;  }
+
+      bool operator!=   (const const_iterator& r)  const
+      {  return m_it != r.m_it;  }
+   }
+      /// @endcond
+   ;
+
+   //! Iterator used to iterate through a list
+   class iterator
+      /// @cond
+   : public const_iterator
+   {
+
+      private:
+      explicit iterator(typename Icont::iterator it)
+         :  const_iterator(it)
+      {}
+   
+      typename Icont::iterator get()
+      {  return this->m_it;   }
+
+      public:
+      friend class slist<T, A>;
+      typedef list_pointer       pointer;
+      typedef list_reference     reference;
+
+      //Constructors
+      iterator(){}
+
+      //Pointer like operators
+      reference operator*()  const {  return  this->m_it->m_data;  }
+      pointer   operator->() const {  return  pointer(&this->m_it->m_data);  }
+
+      //Increment / Decrement
+      iterator& operator++()  
+         { this->prot_incr(); return *this;  }
+
+      iterator operator++(int)
+         { typename Icont::iterator tmp = this->m_it; ++*this; return iterator(tmp); }
+   }
+      /// @endcond
+   ;
+
+   public:
+   //! <b>Effects</b>: Constructs a list taking the allocator as parameter.
+   //! 
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit slist(const allocator_type& a = allocator_type())
+      :  AllocHolder(a)
+   {}
+
+   explicit slist(size_type n)
+      :  AllocHolder(allocator_type())
+   { this->resize(n); }
+
+   //! <b>Effects</b>: Constructs a list that will use a copy of allocator a
+   //!   and inserts n copies of value.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's default or copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Linear to n.
+   explicit slist(size_type n, const value_type& x, const allocator_type& a = allocator_type())
+      :  AllocHolder(a)
+   { this->priv_create_and_insert_nodes(this->before_begin(), n, x); }
+
+   //! <b>Effects</b>: Constructs a list that will use a copy of allocator a
+   //!   and inserts a copy of the range [first, last) in the list.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's constructor taking an dereferenced InIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to the range [first, last).
+   template <class InpIt>
+   slist(InpIt first, InpIt last,
+         const allocator_type& a =  allocator_type()) 
+      : AllocHolder(a)
+   { this->insert_after(this->before_begin(), first, last); }
+
+   //! <b>Effects</b>: Copy constructs a list.
+   //!
+   //! <b>Postcondition</b>: x == *this.
+   //! 
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements x contains.
+   slist(const slist& x) 
+      : AllocHolder(x)
+   { this->insert_after(this->before_begin(), x.begin(), x.end()); }
+
+   //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
+   //!
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   slist(BOOST_RV_REF(slist) x)
+      : AllocHolder(boost::move((AllocHolder&)x))
+   {}
+
+   //! <b>Effects</b>: Makes *this contain the same elements as x.
+   //!
+   //! <b>Postcondition</b>: this->size() == x.size(). *this contains a copy 
+   //! of each of x's elements. 
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in x.
+   slist& operator= (const slist& x)
+   {
+      if (&x != this){
+         this->assign(x.begin(), x.end());
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Makes *this contain the same elements as x.
+   //!
+   //! <b>Postcondition</b>: this->size() == x.size(). *this contains a copy 
+   //! of each of x's elements. 
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in x.
+   slist& operator= (BOOST_RV_REF(slist) mx)
+   {
+      if (&mx != this){
+         this->clear();
+         this->swap(mx);
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Destroys the list. All stored values are destroyed
+   //!   and used memory is deallocated.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements.
+   ~slist() 
+   {} //AllocHolder clears the slist
+
+   //! <b>Effects</b>: Returns a copy of the internal allocator.
+   //! 
+   //! <b>Throws</b>: If allocator's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   allocator_type get_allocator() const
+   {  return allocator_type(this->node_alloc()); }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   {  return this->node_alloc(); }
+
+   stored_allocator_type &get_stored_allocator()
+   {  return this->node_alloc(); }
+
+   public:
+
+   //! <b>Effects</b>: Assigns the n copies of val to *this.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   void assign(size_type n, const T& val)
+   { this->priv_fill_assign(n, val); }
+
+   //! <b>Effects</b>: Assigns the range [first, last) to *this.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's constructor from dereferencing InpIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   template <class InpIt>
+   void assign(InpIt first, InpIt last) 
+   {
+      const bool aux_boolean = containers_detail::is_convertible<InpIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_assign_dispatch(first, last, Result());
+   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator begin() 
+   { return iterator(this->icont().begin()); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator begin() const 
+   {  return this->cbegin();   }
+
+   //! <b>Effects</b>: Returns an iterator to the end of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator end()
+   { return iterator(this->icont().end()); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator end() const
+   {  return this->cend();   }
+
+   //! <b>Effects</b>: Returns a non-dereferenceable iterator that,
+   //! when incremented, yields begin().  This iterator may be used
+   //! as the argument toinsert_after, erase_after, etc.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator before_begin() 
+   {  return iterator(end());  }
+
+   //! <b>Effects</b>: Returns a non-dereferenceable const_iterator 
+   //! that, when incremented, yields begin().  This iterator may be used
+   //! as the argument toinsert_after, erase_after, etc.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator before_begin() const
+   {  return this->cbefore_begin();  }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cbegin() const 
+   {  return const_iterator(this->non_const_icont().begin());   }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend() const
+   {  return const_iterator(this->non_const_icont().end());   }
+
+   //! <b>Effects</b>: Returns a non-dereferenceable const_iterator 
+   //! that, when incremented, yields begin().  This iterator may be used
+   //! as the argument toinsert_after, erase_after, etc.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cbefore_begin() const
+   {  return const_iterator(end());  }
+
+   //! <b>Effects</b>: Returns the number of the elements contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type size() const 
+   {  return this->icont().size(); }
+
+   //! <b>Effects</b>: Returns the largest possible size of the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type max_size() const 
+   {  return AllocHolder::max_size();  }
+
+   //! <b>Effects</b>: Returns true if the list contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   bool empty() const 
+   {  return !this->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>: Linear to the number of elements on *this and x.
+   void swap(slist& x)
+   {  AllocHolder::swap(x);   }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference front() 
+   {  return *this->begin();  }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a const reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference front() const 
+   {  return *this->begin();  }
+
+   //! <b>Effects</b>: Inserts a copy of t in the beginning of the list.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_front(const value_type& x)
+   {  this->icont().push_front(*this->create_node(x));  }
+
+   //! <b>Effects</b>: Constructs a new element in the beginning of the list
+   //!   and moves the resources of t to this new element.
+   //!
+   //! <b>Throws</b>: If memory allocation throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_front(BOOST_RV_REF(T) x)
+   {  this->icont().push_front(*this->create_node(boost::move(x)));  }
+
+   //! <b>Effects</b>: Removes the first element from the list.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void pop_front()
+   {  this->icont().pop_front_and_dispose(Destroyer(this->node_alloc()));      }
+
+   //! <b>Returns</b>: The iterator to the element before i in the sequence. 
+   //!   Returns the end-iterator, if either i is the begin-iterator or the 
+   //!   sequence is empty. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements before i. 
+   iterator previous(iterator p) 
+   {  return iterator(this->icont().previous(p.get())); }
+
+   //! <b>Returns</b>: The const_iterator to the element before i in the sequence. 
+   //!   Returns the end-const_iterator, if either i is the begin-const_iterator or 
+   //!   the sequence is empty. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements before i. 
+   const_iterator previous(const_iterator p) 
+   {  return const_iterator(this->icont().previous(p.get())); }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Inserts a copy of the value after the p pointed
+   //!    by prev_p.
+   //!
+   //! <b>Returns</b>: An iterator to the inserted element.
+   //! 
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Amortized constant time.
+   //!
+   //! <b>Note</b>: Does not affect the validity of iterators and references of
+   //!   previous values.
+   iterator insert_after(const_iterator prev_pos, const value_type& x) 
+   {  return iterator(this->icont().insert_after(prev_pos.get(), *this->create_node(x))); }
+
+   //! <b>Requires</b>: prev_pos must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Inserts a move constructed copy object from the value after the
+   //!    p pointed by prev_pos.
+   //!
+   //! <b>Returns</b>: An iterator to the inserted element.
+   //! 
+   //! <b>Throws</b>: If memory allocation throws.
+   //! 
+   //! <b>Complexity</b>: Amortized constant time.
+   //!
+   //! <b>Note</b>: Does not affect the validity of iterators and references of
+   //!   previous values.
+   iterator insert_after(const_iterator prev_pos, BOOST_RV_REF(value_type) x) 
+   {  return iterator(this->icont().insert_after(prev_pos.get(), *this->create_node(boost::move(x)))); }
+
+   //! <b>Requires</b>: prev_pos must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Inserts n copies of x after prev_pos.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   //!
+   //! <b>Note</b>: Does not affect the validity of iterators and references of
+   //!   previous values.
+   void insert_after(const_iterator prev_pos, size_type n, const value_type& x)
+   {  this->priv_create_and_insert_nodes(prev_pos, n, x); }
+
+   //! <b>Requires</b>: prev_pos must be a valid iterator of *this.
+   //! 
+   //! <b>Effects</b>: Inserts the range pointed by [first, last) 
+   //!   after the p prev_pos.
+   //! 
+   //! <b>Throws</b>: If memory allocation throws, T's constructor from a
+   //!   dereferenced InpIt throws.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements inserted.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references of
+   //!   previous values.
+   template <class InIter>
+   void insert_after(const_iterator prev_pos, InIter first, InIter last) 
+   {
+      const bool aux_boolean = containers_detail::is_convertible<InIter, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_insert_after_range_dispatch(prev_pos, first, last, Result());
+   }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a copy of x before p.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or x's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the elements before p.
+   iterator insert(const_iterator p, const value_type& x) 
+   {  return this->insert_after(previous(p), x); }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a new element before p with mx's resources.
+   //!
+   //! <b>Throws</b>: If memory allocation throws.
+   //!
+   //! <b>Complexity</b>: Linear to the elements before p.
+   iterator insert(const_iterator p, BOOST_RV_REF(value_type) x) 
+   {  return this->insert_after(previous(p), boost::move(x)); }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Inserts n copies of x before p.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to n plus linear to the elements before p.
+   void insert(const_iterator p, size_type n, const value_type& x) 
+   {  return this->insert_after(previous(p), n, x); }
+      
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a copy of the [first, last) range before p.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, T's constructor from a
+   //!   dereferenced InpIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to std::distance [first, last) plus
+   //!    linear to the elements before p.
+   template <class InIter>
+   void insert(const_iterator p, InIter first, InIter last) 
+   {  return this->insert_after(previous(p), first, last); }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... in the front of the list
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   template <class... Args>
+   void emplace_front(Args&&... args)
+   {  this->emplace_after(this->cbefore_begin(), boost::forward<Args>(args)...); }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... before p
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the elements before p
+   template <class... Args>
+   iterator emplace(const_iterator p, Args&&... args)
+   {  return this->emplace_after(this->previous(p), boost::forward<Args>(args)...);  }
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... after prev
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Constant
+   template <class... Args>
+   iterator emplace_after(const_iterator prev, Args&&... args)
+   {
+      typename AllocHolder::Deallocator d(AllocHolder::create_node_and_deallocator());
+      new ((void*)containers_detail::get_pointer(d.get())) Node(boost::forward<Args>(args)...);
+      NodePtr node = d.get();
+      d.release();
+      return iterator(this->icont().insert_after(prev.get(), *node));
+   }
+
+   #else //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //0 args
+   void emplace_front()
+   {  this->emplace_after(this->cbefore_begin());   }
+
+   iterator emplace(const_iterator p)
+   {  return this->emplace_after(this->previous(p));  }
+
+   iterator emplace_after(const_iterator prev)
+   {
+      typename AllocHolder::Deallocator d(AllocHolder::create_node_and_deallocator());
+      new ((void*)containers_detail::get_pointer(d.get())) Node();
+      NodePtr node = d.get();
+      d.release();
+      return iterator(this->icont().insert_after(prev.get(), *node));
+   }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                           \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   void emplace_front(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                 \
+   {                                                                                         \
+      this->emplace                                                                          \
+         (this->cbegin(), BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));         \
+   }                                                                                         \
+                                                                                             \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   iterator emplace                                                                          \
+      (const_iterator p, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))              \
+   {                                                                                         \
+      return this->emplace_after                                                             \
+         (this->previous(p), BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));      \
+   }                                                                                         \
+                                                                                             \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                \
+   iterator emplace_after                                                                    \
+      (const_iterator prev, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))           \
+   {                                                                                         \
+      typename AllocHolder::Deallocator d(AllocHolder::create_node_and_deallocator());       \
+      new ((void*)containers_detail::get_pointer(d.get()))                                              \
+         Node(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                     \
+      NodePtr node = d.get();                                                                \
+      d.release();                                                                           \
+      return iterator(this->icont().insert_after(prev.get(), *node));                        \
+   }                                                                                         \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <b>Effects</b>: Erases the element after the element pointed by prev_pos
+   //!    of the list.
+   //!
+   //! <b>Returns</b>: the first element remaining beyond the removed elements,
+   //!   or end() if no such element exists.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: Does not invalidate iterators or references to non erased elements.
+   iterator erase_after(const_iterator prev_pos)
+   {
+      return iterator(this->icont().erase_after_and_dispose(prev_pos.get(), Destroyer(this->node_alloc())));
+   }
+
+   //! <b>Effects</b>: Erases the range (before_first, last) from
+   //!   the list. 
+   //!
+   //! <b>Returns</b>: the first element remaining beyond the removed elements,
+   //!   or end() if no such element exists.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of erased elements.
+   //! 
+   //! <b>Note</b>: Does not invalidate iterators or references to non erased elements.
+   iterator erase_after(const_iterator before_first, const_iterator last) 
+   {
+      return iterator(this->icont().erase_after_and_dispose(before_first.get(), last.get(), Destroyer(this->node_alloc())));
+   }
+
+   //! <b>Requires</b>: p must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Erases the element at p p.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements before p.
+   iterator erase(const_iterator p) 
+   {  return iterator(this->erase_after(previous(p))); }
+
+   //! <b>Requires</b>: first and last must be valid iterator to elements in *this.
+   //!
+   //! <b>Effects</b>: Erases the elements pointed by [first, last).
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the distance between first and last plus
+   //!   linear to the elements before first.
+   iterator erase(const_iterator first, const_iterator last)
+   {  return iterator(this->erase_after(previous(first), last)); }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are copy constructed from x.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type new_size, const T& x)
+   {
+      typename Icont::iterator end_n(this->icont().end()), cur(this->icont().before_begin()), cur_next;
+      while (++(cur_next = cur) != end_n && new_size > 0){
+         --new_size;
+         cur = cur_next;
+      }
+      if (cur_next != end_n) 
+         this->erase_after(const_iterator(cur), const_iterator(end_n));
+      else
+         this->insert_after(const_iterator(cur), new_size, x);
+   }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are default constructed.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type new_size)
+   {
+      typename Icont::iterator end_n(this->icont().end()), cur(this->icont().before_begin()), cur_next;
+      size_type len = this->size();
+      size_type left = new_size;
+      
+      while (++(cur_next = cur) != end_n && left > 0){
+         --left;
+         cur = cur_next;
+      }
+      if (cur_next != end_n){
+         this->erase_after(const_iterator(cur), const_iterator(end_n));
+      }
+      else{
+         this->priv_create_and_insert_nodes(const_iterator(cur), new_size - len);
+      }
+   }
+
+   //! <b>Effects</b>: Erases all the elements of the list.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in the list.
+   void clear() 
+   {  this->icont().clear_and_dispose(Destroyer(this->node_alloc()));  }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by the list. x != *this
+   //!
+   //! <b>Effects</b>: Transfers all the elements of list x to this list, after the
+   //!   the element pointed by p. No destructors or copy constructors are called.
+   //!
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //!
+   //! <b>Complexity</b>: Linear to the elements in x.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of
+   //!    this list. Iterators of this list and all the references are not invalidated.
+   void splice_after(const_iterator prev_pos, slist& x)
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice_after(prev_pos.get(), x.icont());
+      }
+      else{
+         throw std::runtime_error("slist::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Requires</b>: prev_pos must be a valid iterator of this.
+   //!   i must point to an element contained in list x.
+   //! 
+   //! <b>Effects</b>: Transfers the value pointed by i, from list x to this list, 
+   //!   after the element pointed by prev_pos.
+   //!   If prev_pos == prev or prev_pos == ++prev, this function is a null operation. 
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice_after(const_iterator prev_pos, slist& x, const_iterator prev)
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice_after(prev_pos.get(), x.icont(), prev.get());
+      }
+      else{
+         throw std::runtime_error("slist::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Requires</b>: prev_pos must be a valid iterator of this.
+   //!   before_first and before_last must be valid iterators of x.
+   //!   prev_pos must not be contained in [before_first, before_last) range.
+   //! 
+   //! <b>Effects</b>: Transfers the range [before_first + 1, before_last + 1)
+   //!   from list x to this list, after the element pointed by prev_pos.
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of transferred elements.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice_after(const_iterator prev_pos,      slist& x, 
+      const_iterator before_first,  const_iterator before_last)
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice_after
+            (prev_pos.get(), x.icont(), before_first.get(), before_last.get());
+      }
+      else{
+         throw std::runtime_error("slist::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Requires</b>: prev_pos must be a valid iterator of this.
+   //!   before_first and before_last must be valid iterators of x.
+   //!   prev_pos must not be contained in [before_first, before_last) range.
+   //!   n == std::distance(before_first, before_last)
+   //! 
+   //! <b>Effects</b>: Transfers the range [before_first + 1, before_last + 1)
+   //!   from list x to this list, after the element pointed by prev_pos.
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice_after(const_iterator prev_pos,      slist& x, 
+                     const_iterator before_first,  const_iterator before_last,
+                     size_type n)
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().splice_after
+            (prev_pos.get(), x.icont(), before_first.get(), before_last.get(), n);
+      }
+      else{
+         throw std::runtime_error("slist::splice called with unequal allocators");
+      }
+   }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by the list. x != *this
+   //!
+   //! <b>Effects</b>: Transfers all the elements of list x to this list, before the
+   //!   the element pointed by p. No destructors or copy constructors are called.
+   //!
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //!
+   //! <b>Complexity</b>: Linear in distance(begin(), p), and linear in x.size().
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of
+   //!    this list. Iterators of this list and all the references are not invalidated.
+   void splice(const_iterator p, ThisType& x) 
+   {  this->splice_after(this->previous(p), x);  }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by this list. i must point to an element contained in list x.
+   //! 
+   //! <b>Effects</b>: Transfers the value pointed by i, from list x to this list, 
+   //!   before the the element pointed by p. No destructors or copy constructors are called.
+   //!   If p == i or p == ++i, this function is a null operation. 
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Linear in distance(begin(), p), and in distance(x.begin(), i).
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice(const_iterator p, slist& x, const_iterator i)
+   {  this->splice_after(previous(p), x, i);  }
+
+   //! <b>Requires</b>: p must point to an element contained
+   //!   by this list. first and last must point to elements contained in list x.
+   //! 
+   //! <b>Effects</b>: Transfers the range pointed by first and last from list x to this list, 
+   //!   before the the element pointed by p. No destructors or copy constructors are called.
+   //! 
+   //! <b>Throws</b>: std::runtime_error if this' allocator and x's allocator
+   //!   are not equal.
+   //! 
+   //! <b>Complexity</b>: Linear in distance(begin(), p), in distance(x.begin(), first),
+   //!   and in distance(first, last).
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void splice(const_iterator p, slist& x, const_iterator first, const_iterator last)
+   {  this->splice_after(previous(p), x, previous(first), previous(last));  }
+
+   //! <b>Effects</b>: Reverses the order of elements in the list. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: This function is linear time.
+   //! 
+   //! <b>Note</b>: Iterators and references are not invalidated
+   void reverse() 
+   {  this->icont().reverse();  }
+
+   //! <b>Effects</b>: Removes all the elements that compare equal to value.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear time. It performs exactly size() comparisons for equality.
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   void remove(const T& value)
+   {  remove_if(equal_to_value(value));  }
+
+   //! <b>Effects</b>: Removes all the elements for which a specified
+   //!   predicate is satisfied.
+   //! 
+   //! <b>Throws</b>: If pred throws.
+   //! 
+   //! <b>Complexity</b>: Linear time. It performs exactly size() calls to the predicate.
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   template <class Pred> 
+   void remove_if(Pred pred)
+   {
+      typedef ValueCompareToNodeCompare<Pred> Predicate;
+      this->icont().remove_and_dispose_if(Predicate(pred), Destroyer(this->node_alloc()));
+   }
+
+   //! <b>Effects</b>: Removes adjacent duplicate elements or adjacent 
+   //!   elements that are equal from the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear time (size()-1 comparisons calls to pred()).
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   void unique()
+   {  this->unique(value_equal());  }
+
+   //! <b>Effects</b>: Removes adjacent duplicate elements or adjacent 
+   //!   elements that satisfy some binary predicate from the list.
+   //! 
+   //! <b>Throws</b>: If pred throws.
+   //! 
+   //! <b>Complexity</b>: Linear time (size()-1 comparisons equality comparisons).
+   //! 
+   //! <b>Note</b>: The relative order of elements that are not removed is unchanged,
+   //!   and iterators to elements that are not removed remain valid.
+   template <class Pred> 
+   void unique(Pred pred)
+   {
+      typedef ValueCompareToNodeCompare<Pred> Predicate;
+      this->icont().unique_and_dispose(Predicate(pred), Destroyer(this->node_alloc()));
+   }
+
+   //! <b>Requires</b>: The lists x and *this must be distinct. 
+   //!
+   //! <b>Effects</b>: This function removes all of x's elements and inserts them
+   //!   in order into *this according to std::less<value_type>. The merge is stable; 
+   //!   that is, if an element from *this is equivalent to one from x, then the element 
+   //!   from *this will precede the one from x. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: This function is linear time: it performs at most
+   //!   size() + x.size() - 1 comparisons.
+   void merge(slist & x)
+   {  this->merge(x, value_less()); }
+
+   //! <b>Requires</b>: p must be a comparison function that induces a strict weak
+   //!   ordering and both *this and x must be sorted according to that ordering
+   //!   The lists x and *this must be distinct. 
+   //! 
+   //! <b>Effects</b>: This function removes all of x's elements and inserts them
+   //!   in order into *this. The merge is stable; that is, if an element from *this is 
+   //!   equivalent to one from x, then the element from *this will precede the one from x. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: This function is linear time: it performs at most
+   //!   size() + x.size() - 1 comparisons.
+   //! 
+   //! <b>Note</b>: Iterators and references to *this are not invalidated.
+   template <class StrictWeakOrdering>
+   void merge(slist& x, StrictWeakOrdering comp)
+   {
+      if((NodeAlloc&)*this == (NodeAlloc&)x){
+         this->icont().merge(x.icont(),
+            ValueCompareToNodeCompare<StrictWeakOrdering>(comp));
+      }
+      else{
+         throw std::runtime_error("list::merge called with unequal allocators");
+      }
+   }
+
+   //! <b>Effects</b>: This function sorts the list *this according to std::less<value_type>. 
+   //!   The sort is stable, that is, the relative order of equivalent elements is preserved.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Notes</b>: Iterators and references are not invalidated.
+   //! 
+   //! <b>Complexity</b>: The number of comparisons is approximately N log N, where N
+   //!   is the list's size.
+   void sort()
+   {  this->sort(value_less());  }
+
+   //! <b>Effects</b>: This function sorts the list *this according to std::less<value_type>. 
+   //!   The sort is stable, that is, the relative order of equivalent elements is preserved.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Notes</b>: Iterators and references are not invalidated.
+   //! 
+   //! <b>Complexity</b>: The number of comparisons is approximately N log N, where N
+   //!   is the list's size.
+   template <class StrictWeakOrdering> 
+   void sort(StrictWeakOrdering comp)
+   {
+      // nothing if the slist has length 0 or 1.
+      if (this->size() < 2)
+         return;
+      this->icont().sort(ValueCompareToNodeCompare<StrictWeakOrdering>(comp));
+   }
+
+   /// @cond
+   private:
+
+   //Iterator range version
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator prev, InpIterator beg, InpIterator end)
+   {
+      typedef typename std::iterator_traits<InpIterator>::iterator_category ItCat;
+      priv_create_and_insert_nodes(prev, beg, end, alloc_version(), ItCat());
+   }
+
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator prev, InpIterator beg, InpIterator end, allocator_v1, std::input_iterator_tag)
+   {
+      for (; beg != end; ++beg){
+         this->icont().insert_after(prev.get(), *this->create_node_from_it(beg));
+         ++prev;
+      }
+   }
+
+   template<class InpIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator prev, InpIterator beg, InpIterator end, allocator_v2, std::input_iterator_tag)
+   {  //Just forward to the default one
+      priv_create_and_insert_nodes(prev, beg, end, allocator_v1(), std::input_iterator_tag());
+   }
+
+   class insertion_functor;
+   friend class insertion_functor;
+
+   class insertion_functor
+   {
+      Icont &icont_;
+      typename Icont::const_iterator prev_;
+
+      public:
+      insertion_functor(Icont &icont, typename Icont::const_iterator prev)
+         :  icont_(icont), prev_(prev)
+      {}
+
+      void operator()(Node &n)
+      {  prev_ = this->icont_.insert_after(prev_, n); }
+   };
+
+   template<class FwdIterator>
+   void priv_create_and_insert_nodes
+      (const_iterator prev, FwdIterator beg, FwdIterator end, allocator_v2, std::forward_iterator_tag)
+   {
+      //Optimized allocation and construction
+      this->allocate_many_and_construct
+         (beg, std::distance(beg, end), insertion_functor(this->icont(), prev.get()));
+   }
+
+   //Default constructed version
+   void priv_create_and_insert_nodes(const_iterator prev, size_type n)
+   {
+      typedef default_construct_iterator<value_type, difference_type> default_iterator;
+      this->priv_create_and_insert_nodes(prev, default_iterator(n), default_iterator());
+   }
+
+   //Copy constructed version
+   void priv_create_and_insert_nodes(const_iterator prev, size_type n, const T& x)
+   {
+      typedef constant_iterator<value_type, difference_type> cvalue_iterator;
+      this->priv_create_and_insert_nodes(prev, cvalue_iterator(x, n), cvalue_iterator());
+   }
+
+   //Dispatch to detect iterator range or integer overloads
+   template <class InputIter>
+   void priv_insert_dispatch(const_iterator prev,
+                             InputIter first, InputIter last,
+                             containers_detail::false_)
+   {  this->priv_create_and_insert_nodes(prev, first, last);   }
+
+   template<class Integer>
+   void priv_insert_dispatch(const_iterator prev, Integer n, Integer x, containers_detail::true_) 
+   {  this->priv_create_and_insert_nodes(prev, n, x);  }
+
+   void priv_fill_assign(size_type n, const T& val) 
+   {
+      iterator end_n(this->end());
+      iterator prev(this->before_begin());
+      iterator node(this->begin());
+      for ( ; node != end_n && n > 0 ; --n){
+         *node = val;
+         prev = node;
+         ++node;
+      }
+      if (n > 0)
+         this->priv_create_and_insert_nodes(prev, n, val);
+      else
+         this->erase_after(prev, end_n);
+   }
+
+   template <class Int>
+   void priv_assign_dispatch(Int n, Int val, containers_detail::true_)
+   {  this->priv_fill_assign((size_type) n, (T)val); }
+
+   template <class InpIt>
+   void priv_assign_dispatch(InpIt first, InpIt last, containers_detail::false_)
+   {
+      iterator end_n(this->end());
+      iterator prev(this->before_begin());
+      iterator node(this->begin());
+      while (node != end_n && first != last){
+         *node = *first;
+         prev = node;
+         ++node;
+         ++first;
+      }
+      if (first != last)
+         this->priv_create_and_insert_nodes(prev, first, last);
+      else
+         this->erase_after(prev, end_n);
+   }
+
+   template <class Int>
+   void priv_insert_after_range_dispatch(const_iterator prev_pos, Int n, Int x, containers_detail::true_) 
+   {  this->priv_create_and_insert_nodes(prev_pos, n, x);  }
+
+   template <class InIter>
+   void priv_insert_after_range_dispatch(const_iterator prev_pos, InIter first, InIter last, containers_detail::false_) 
+   {  this->priv_create_and_insert_nodes(prev_pos, first, last); }
+
+   //Functors for member algorithm defaults
+   struct value_less
+   {
+      bool operator()(const value_type &a, const value_type &b) const
+         {  return a < b;  }
+   };
+
+   struct value_equal
+   {
+      bool operator()(const value_type &a, const value_type &b) const
+         {  return a == b;  }
+   };
+
+   struct value_equal_to_this
+   {
+      explicit value_equal_to_this(const value_type &ref)
+         : m_ref(ref){}
+
+      bool operator()(const value_type &val) const
+         {  return m_ref == val;  }
+
+      const value_type &m_ref;
+   };
+   /// @endcond
+};
+
+template <class T, class A>
+inline bool 
+operator==(const slist<T,A>& x, const slist<T,A>& y)
+{
+   if(x.size() != y.size()){
+      return false;
+   }
+   typedef typename slist<T,A>::const_iterator const_iterator;
+   const_iterator end1 = x.end();
+
+   const_iterator i1 = x.begin();
+   const_iterator i2 = y.begin();
+   while (i1 != end1 && *i1 == *i2){
+      ++i1;
+      ++i2;
+   }
+   return i1 == end1;
+}
+
+template <class T, class A>
+inline bool
+operator<(const slist<T,A>& sL1, const slist<T,A>& sL2)
+{
+   return std::lexicographical_compare
+      (sL1.begin(), sL1.end(), sL2.begin(), sL2.end());
+}
+
+template <class T, class A>
+inline bool 
+operator!=(const slist<T,A>& sL1, const slist<T,A>& sL2) 
+   {  return !(sL1 == sL2);   }
+
+template <class T, class A>
+inline bool 
+operator>(const slist<T,A>& sL1, const slist<T,A>& sL2) 
+   {  return sL2 < sL1; }
+
+template <class T, class A>
+inline bool 
+operator<=(const slist<T,A>& sL1, const slist<T,A>& sL2)
+   {  return !(sL2 < sL1); }
+
+template <class T, class A>
+inline bool 
+operator>=(const slist<T,A>& sL1, const slist<T,A>& sL2)
+   {  return !(sL1 < sL2); }
+
+template <class T, class A>
+inline void swap(slist<T,A>& x, slist<T,A>& y) 
+   {  x.swap(y);  }
+
+}}
+
+/// @cond
+
+namespace boost {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class A>
+struct has_trivial_destructor_after_move<boost::container::slist<T, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value;
+};
+
+}  //namespace boost{  
+
+/// @endcond
+
+// Specialization of insert_iterator so that insertions will be constant
+// time rather than linear time.
+
+///@cond
+
+//Ummm, I don't like to define things in namespace std, but 
+//there is no other way
+namespace std {
+
+template <class T, class A>
+class insert_iterator<boost::container::slist<T, A> > 
+{
+ protected:
+   typedef boost::container::slist<T, A> Container;
+   Container* container;
+   typename Container::iterator iter;
+   public:
+   typedef Container           container_type;
+   typedef output_iterator_tag iterator_category;
+   typedef void                value_type;
+   typedef void                difference_type;
+   typedef void                pointer;
+   typedef void                reference;
+
+   insert_iterator(Container& x, 
+                   typename Container::iterator i, 
+                   bool is_previous = false) 
+      : container(&x), iter(is_previous ? i : x.previous(i)){ }
+
+   insert_iterator<Container>& 
+      operator=(const typename Container::value_type& value) 
+   { 
+      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; }
+};
+
+}  //namespace std;
+
+///@endcond
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif /* BOOST_CONTAINERS_SLIST_HPP */
Added: sandbox/move/boost/container/stable_vector.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/stable_vector.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1352 @@
+/* Stable vector.
+ *
+ * Copyright 2008 Joaquin M Lopez Munoz.
+ * 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)
+ */
+
+#ifndef STABLE_VECTOR_HPP_3A7EB5C0_55BF_11DD_AE16_0800200C9A66
+#define STABLE_VECTOR_HPP_3A7EB5C0_55BF_11DD_AE16_0800200C9A66
+
+#include <algorithm>
+#include <stdexcept>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/container/detail/version_type.hpp>
+#include <boost/container/detail/multiallocation_chain.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/algorithms.hpp>
+#include <boost/pointer_to_other.hpp>
+#include <boost/get_pointer.hpp>
+
+#define STABLE_VECTOR_USE_CONTAINERS_VECTOR
+
+#if defined (STABLE_VECTOR_USE_CONTAINERS_VECTOR)
+#include <boost/container/vector.hpp>
+#else
+#include <vector>
+#endif   //STABLE_VECTOR_USE_CONTAINERS_VECTOR
+
+//#define STABLE_VECTOR_ENABLE_INVARIANT_CHECKING
+
+#if defined(STABLE_VECTOR_ENABLE_INVARIANT_CHECKING)
+#include <boost/assert.hpp>
+#endif
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+
+namespace stable_vector_detail{
+
+template<class SmartPtr>
+struct smart_ptr_type
+{
+   typedef typename SmartPtr::value_type value_type;
+   typedef value_type *pointer;
+   static pointer get (const SmartPtr &smartptr)
+   {  return smartptr.get();}
+};
+
+template<class T>
+struct smart_ptr_type<T*>
+{
+   typedef T value_type;
+   typedef value_type *pointer;
+   static pointer get (pointer ptr)
+   {  return ptr;}
+};
+
+template<class Ptr>
+inline typename smart_ptr_type<Ptr>::pointer get_pointer(const Ptr &ptr)
+{  return smart_ptr_type<Ptr>::get(ptr);   }
+
+template <class C>
+class clear_on_destroy
+{
+   public:
+   clear_on_destroy(C &c)
+      :  c_(c), do_clear_(true)
+   {}
+
+   void release()
+   {  do_clear_ = false; }
+
+   ~clear_on_destroy()
+   {
+      if(do_clear_){
+         c_.clear();
+         c_.clear_pool();  
+      }
+   }
+
+   private:
+   C &c_;
+   bool do_clear_;
+};
+
+template <class T, class Difference = std::ptrdiff_t>
+class constant_iterator
+  : public std::iterator
+      <std::random_access_iterator_tag, T, Difference, const T*, const T &>
+{
+   typedef  constant_iterator<T, Difference> this_type;
+
+   public:
+   explicit constant_iterator(const T &ref, Difference range_size)
+      :  m_ptr(&ref), m_num(range_size){}
+
+   //Constructors
+   constant_iterator()
+      :  m_ptr(0), m_num(0){}
+
+   constant_iterator& operator++() 
+   { increment();   return *this;   }
+   
+   constant_iterator operator++(int)
+   {
+      constant_iterator result (*this);
+      increment();
+      return result;
+   }
+
+   friend bool operator== (const constant_iterator& i, const constant_iterator& i2)
+   { return i.equal(i2); }
+
+   friend bool operator!= (const constant_iterator& i, const constant_iterator& i2)
+   { return !(i == i2); }
+
+   friend bool operator< (const constant_iterator& i, const constant_iterator& i2)
+   { return i.less(i2); }
+
+   friend bool operator> (const constant_iterator& i, const constant_iterator& i2)
+   { return i2 < i; }
+
+   friend bool operator<= (const constant_iterator& i, const constant_iterator& i2)
+   { return !(i > i2); }
+
+   friend bool operator>= (const constant_iterator& i, const constant_iterator& i2)
+   { return !(i < i2); }
+
+   friend Difference operator- (const constant_iterator& i, const constant_iterator& i2)
+   { return i2.distance_to(i); }
+
+   //Arithmetic
+   constant_iterator& operator+=(Difference off)
+   {  this->advance(off); return *this;   }
+
+   constant_iterator operator+(Difference off) const
+   {
+      constant_iterator other(*this);
+      other.advance(off);
+      return other;
+   }
+
+   friend constant_iterator operator+(Difference off, const constant_iterator& right)
+   {  return right + off; }
+
+   constant_iterator& operator-=(Difference off)
+   {  this->advance(-off); return *this;   }
+
+   constant_iterator operator-(Difference off) const
+   {  return *this + (-off);  }
+
+   const T& operator*() const
+   { return dereference(); }
+
+   const T* operator->() const
+   { return &(dereference()); }
+
+   private:
+   const T *   m_ptr;
+   Difference  m_num;
+
+   void increment()
+   { --m_num; }
+
+   void decrement()
+   { ++m_num; }
+
+   bool equal(const this_type &other) const
+   {  return m_num == other.m_num;   }
+
+   bool less(const this_type &other) const
+   {  return other.m_num < m_num;   }
+
+   const T & dereference() const
+   { return *m_ptr; }
+
+   void advance(Difference n)
+   {  m_num -= n; }
+
+   Difference distance_to(const this_type &other)const
+   {  return m_num - other.m_num;   }
+};
+
+template<class VoidPtr>
+struct node_type_base
+{/*
+   node_type_base(VoidPtr p)
+      : up(p)
+   {}*/
+   node_type_base()
+   {}
+   void set_pointer(VoidPtr p)
+   {  up = p; }
+
+   VoidPtr up;
+};
+
+template<typename VoidPointer, typename T>
+struct node_type
+   : public node_type_base<VoidPointer>
+{
+   #ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   node_type()
+      : value()
+   {}
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                      \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                           \
+   node_type(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))       \
+      : value(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _))   \
+   {}                                                                   \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #else //#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   template<class ...Args>
+   node_type(Args &&...args)
+      : value(boost::forward<Args>(args)...)
+   {}
+   #endif//#ifndef BOOST_CONTAINERS_PERFECT_FORWARDING
+   
+   void set_pointer(VoidPointer p)
+   {  node_type_base<VoidPointer>::set_pointer(p); }
+
+   T value;
+};
+
+template<typename T, typename Value, typename Pointer>
+class iterator
+   : public std::iterator< std::random_access_iterator_tag
+                         , const typename std::iterator_traits<Pointer>::value_type
+                         , typename std::iterator_traits<Pointer>::difference_type
+                         , Pointer
+                         , Value &>
+{
+
+   typedef typename boost::pointer_to_other
+      <Pointer, void>::type                  void_ptr;
+   typedef node_type<void_ptr, T>            node_type_t;
+   typedef typename boost::pointer_to_other
+      <void_ptr, node_type_t>::type          node_type_ptr_t;
+   typedef typename boost::pointer_to_other
+      <void_ptr, void_ptr>::type             void_ptr_ptr;
+
+   friend class iterator<T, const T, typename boost::pointer_to_other<Pointer, T>::type>;
+
+   public:
+	typedef std::random_access_iterator_tag   iterator_category;
+	typedef Value                             value_type;
+	typedef typename std::iterator_traits
+      <Pointer>::difference_type             difference_type;
+	typedef Pointer                           pointer;
+	typedef Value &                           reference;
+
+   iterator()
+   {}
+
+   explicit iterator(node_type_ptr_t pn)
+      : pn(pn)
+   {}
+
+   iterator(const iterator<T, T, typename boost::pointer_to_other<Pointer, T>::type >& x)
+      : pn(x.pn)
+   {}
+   
+   private:
+   static node_type_ptr_t node_ptr_cast(void_ptr p)
+   {
+      using boost::get_pointer;
+      return node_type_ptr_t(static_cast<node_type_t*>(stable_vector_detail::get_pointer(p)));
+   }
+
+   static void_ptr_ptr void_ptr_ptr_cast(void_ptr p)
+   {
+      using boost::get_pointer;
+      return void_ptr_ptr(static_cast<void_ptr*>(stable_vector_detail::get_pointer(p)));
+   }
+
+   Value& dereference() const
+   {  return pn->value; }
+   bool equal(const iterator& x) const
+   {  return pn==x.pn;  }
+   void increment()
+   {  pn = node_ptr_cast(*(void_ptr_ptr_cast(pn->up)+1)); }
+   void decrement()
+   {  pn = node_ptr_cast(*(void_ptr_ptr_cast(pn->up)-1)); }
+   void advance(std::ptrdiff_t n)
+   {  pn = node_ptr_cast(*(void_ptr_ptr_cast(pn->up)+n)); }
+   std::ptrdiff_t distance_to(const iterator& x)const
+   {  return void_ptr_ptr_cast(x.pn->up) - void_ptr_ptr_cast(pn->up);   }
+
+   public:
+   //Pointer like operators
+   reference operator*()  const {  return  this->dereference();  }
+   pointer   operator->() const {  return  pointer(&this->dereference());  }
+
+   //Increment / Decrement
+   iterator& operator++()  
+   {  this->increment(); return *this;  }
+
+   iterator operator++(int)
+   {  iterator tmp(*this);  ++*this; return iterator(tmp); }
+
+   iterator& operator--()
+   {  this->decrement(); return *this;  }
+
+   iterator operator--(int)
+   {  iterator tmp(*this);  --*this; return iterator(tmp);  }
+
+   reference operator[](difference_type off) const
+   {
+      iterator tmp(*this);
+      tmp += off;
+      return *tmp;
+   }
+
+   iterator& operator+=(difference_type off)
+   {
+      pn = node_ptr_cast(*(void_ptr_ptr_cast(pn->up)+off));
+      return *this;
+   }
+
+   iterator operator+(difference_type off) const
+   {
+      iterator tmp(*this);
+      tmp += off;
+      return tmp;
+   }
+
+   friend iterator operator+(difference_type off, const iterator& right)
+   {
+      iterator tmp(right);
+      tmp += off;
+      return tmp;
+   }
+
+   iterator& operator-=(difference_type off)
+   {  *this += -off; return *this;   }
+
+   iterator operator-(difference_type off) const
+   {
+      iterator tmp(*this);
+      tmp -= off;
+      return tmp;
+   }
+
+   difference_type operator-(const iterator& right) const
+   {
+      void_ptr_ptr p1 = void_ptr_ptr_cast(this->pn->up);
+      void_ptr_ptr p2 = void_ptr_ptr_cast(right.pn->up);
+      return p1 - p2;
+   }
+
+   //Comparison operators
+   bool operator==   (const iterator& r)  const
+   {  return pn == r.pn;  }
+
+   bool operator!=   (const iterator& r)  const
+   {  return pn != r.pn;  }
+
+   bool operator<    (const iterator& r)  const
+   {  return void_ptr_ptr_cast(pn->up) < void_ptr_ptr_cast(r.pn->up);  }
+
+   bool operator<=   (const iterator& r)  const
+   {  return void_ptr_ptr_cast(pn->up) <= void_ptr_ptr_cast(r.pn->up);  }
+
+   bool operator>    (const iterator& r)  const
+   {  return void_ptr_ptr_cast(pn->up) > void_ptr_ptr_cast(r.pn->up);  }
+
+   bool operator>=   (const iterator& r)  const
+   {  return void_ptr_ptr_cast(pn->up) >= void_ptr_ptr_cast(r.pn->up);  }
+
+   node_type_ptr_t pn;
+};
+
+/*
+class node_access
+{
+   public:
+   template<typename T, typename Value, typename VoidPointer>
+   static typename iterator<T, Value, VoidPointer>::node_type_t* get(const iterator<T,Value,VoidPointer>& it)
+   {
+      return stable_vector_detail::get_pointer(it.pn);
+   }
+};
+*/
+
+template<class Allocator, unsigned int Version>
+struct select_multiallocation_chain
+{
+   typedef typename Allocator::multiallocation_chain type;
+};
+
+template<class Allocator>
+struct select_multiallocation_chain<Allocator, 1>
+{
+   typedef typename Allocator::template
+      rebind<void>::other::pointer                    void_ptr;
+   typedef containers_detail::basic_multiallocation_cached_slist<void_ptr>   multialloc_cached;
+   typedef containers_detail::basic_multiallocation_cached_counted_slist
+      <multialloc_cached>                                         multialloc_cached_counted;
+   typedef boost::container::containers_detail::transform_multiallocation_chain
+      <multialloc_cached_counted, typename Allocator::value_type>   type;
+};
+
+} //namespace stable_vector_detail
+
+#if defined(STABLE_VECTOR_ENABLE_INVARIANT_CHECKING)
+
+#define STABLE_VECTOR_CHECK_INVARIANT \
+invariant_checker BOOST_JOIN(check_invariant_,__LINE__)(*this); \
+BOOST_JOIN(check_invariant_,__LINE__).touch();
+#else
+
+#define STABLE_VECTOR_CHECK_INVARIANT
+
+#endif   //#if defined(STABLE_VECTOR_ENABLE_INVARIANT_CHECKING)
+
+/// @endcond
+
+template<typename T,typename Allocator=std::allocator<T> >
+class stable_vector
+{
+   typedef typename Allocator::template
+      rebind<void>::other::pointer                    void_ptr;
+   typedef typename Allocator::template
+      rebind<void_ptr>::other::pointer                void_ptr_ptr;
+   typedef stable_vector_detail::node_type
+      <void_ptr, T>                                   node_type_t;
+   typedef typename Allocator::template
+      rebind<node_type_t>::other::pointer             node_type_ptr_t;
+   typedef stable_vector_detail::node_type_base
+      <void_ptr>                                      node_type_base_t;
+   typedef typename Allocator::template
+      rebind<node_type_base_t>::other::pointer        node_type_base_ptr_t;
+   typedef 
+   #if defined (STABLE_VECTOR_USE_CONTAINERS_VECTOR)
+   ::boost::container::
+   #else
+   ::std::
+   #endif   //STABLE_VECTOR_USE_CONTAINERS_VECTOR
+   vector<void_ptr,
+      typename Allocator::
+      template rebind<void_ptr>::other
+   >                                                  impl_type;
+   typedef typename impl_type::iterator               impl_iterator;
+   typedef typename impl_type::const_iterator         const_impl_iterator;
+
+   typedef ::boost::container::containers_detail::
+      integral_constant<unsigned, 1>                  allocator_v1;
+   typedef ::boost::container::containers_detail::
+      integral_constant<unsigned, 2>                  allocator_v2;
+   typedef ::boost::container::containers_detail::integral_constant 
+      <unsigned, boost::container::containers_detail::
+      version<Allocator>::value>                      alloc_version;
+   typedef typename Allocator::
+      template rebind<node_type_t>::other             node_allocator_type;
+
+   node_type_ptr_t allocate_one()
+   {  return this->allocate_one(alloc_version());   }
+
+   node_type_ptr_t allocate_one(allocator_v1)
+   {  return get_al().allocate(1);   }
+
+   node_type_ptr_t allocate_one(allocator_v2)
+   {  return get_al().allocate_one();   }
+
+   void deallocate_one(node_type_ptr_t p)
+   {  return this->deallocate_one(p, alloc_version());   }
+
+   void deallocate_one(node_type_ptr_t p, allocator_v1)
+   {  get_al().deallocate(p, 1);   }
+
+   void deallocate_one(node_type_ptr_t p, allocator_v2)
+   {  get_al().deallocate_one(p);   }
+
+   friend class stable_vector_detail::clear_on_destroy<stable_vector>;
+
+   public:
+   // types:
+
+   typedef typename Allocator::reference              reference;
+   typedef typename Allocator::const_reference        const_reference;
+   typedef typename Allocator::pointer                pointer;
+   typedef typename Allocator::const_pointer          const_pointer;
+   typedef stable_vector_detail::iterator
+      <T,T, pointer>                                  iterator;
+   typedef stable_vector_detail::iterator
+      <T,const T, const_pointer>                      const_iterator;
+   typedef typename impl_type::size_type              size_type;
+   typedef typename iterator::difference_type         difference_type;
+   typedef T                                          value_type;
+   typedef Allocator                                  allocator_type;
+   typedef std::reverse_iterator<iterator>            reverse_iterator;
+   typedef std::reverse_iterator<const_iterator>      const_reverse_iterator;
+
+   private:
+   static const size_type ExtraPointers = 3;
+   typedef typename stable_vector_detail::
+      select_multiallocation_chain
+      < node_allocator_type
+      , alloc_version::value
+      >::type                                         multiallocation_chain;
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(stable_vector)
+
+   // construct/copy/destroy:
+   explicit stable_vector(const Allocator& al=Allocator())
+   : internal_data(al),impl(al)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+   }
+
+   stable_vector(size_type n,const T& t=T(),const Allocator& al=Allocator())
+   : internal_data(al),impl(al)
+   {
+      stable_vector_detail::clear_on_destroy<stable_vector> cod(*this);
+      this->insert(this->cbegin(), n, t);
+      STABLE_VECTOR_CHECK_INVARIANT;
+      cod.release();
+   }
+
+   template <class InputIterator>
+   stable_vector(InputIterator first,InputIterator last,const Allocator& al=Allocator())
+      : internal_data(al),impl(al)
+   {
+      stable_vector_detail::clear_on_destroy<stable_vector> cod(*this);
+      this->insert(this->cbegin(), first, last);
+      STABLE_VECTOR_CHECK_INVARIANT;
+      cod.release();
+   }
+
+   stable_vector(const stable_vector& x)
+      : internal_data(x.get_al()),impl(x.get_al())
+   {
+      stable_vector_detail::clear_on_destroy<stable_vector> cod(*this);
+      this->insert(this->cbegin(), x.begin(), x.end());
+      STABLE_VECTOR_CHECK_INVARIANT;
+      cod.release();
+   }
+
+   stable_vector(BOOST_RV_REF(stable_vector) x) 
+      : internal_data(x.get_al()),impl(x.get_al())
+   {  this->swap(x);   }
+
+   ~stable_vector()
+   {
+      this->clear();
+      clear_pool();  
+   }
+
+   stable_vector& operator=(const stable_vector &x)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      if (this != &x) {
+         this->assign(x.begin(), x.end());
+      }
+      return *this;
+   }
+
+   stable_vector& operator=(BOOST_RV_REF(stable_vector) x)
+   {
+      if (&x != this){
+         this->swap(x);
+         x.clear();
+      }
+      return *this;
+   }
+
+   template<typename InputIterator>
+   void assign(InputIterator first,InputIterator last)
+   {
+      assign_dispatch(first, last, boost::is_integral<InputIterator>());
+   }
+
+   void assign(size_type n,const T& t)
+   {
+      typedef stable_vector_detail::constant_iterator<value_type, difference_type> cvalue_iterator;
+      return assign_dispatch(cvalue_iterator(t, n), cvalue_iterator(), boost::mpl::false_());
+   }
+
+   allocator_type get_allocator()const  {return get_al();}
+
+   // iterators:
+
+   iterator  begin()
+   {   return (impl.empty()) ? end(): iterator(node_ptr_cast(impl.front())) ;   }
+
+   const_iterator  begin()const
+   {   return (impl.empty()) ? cend() : const_iterator(node_ptr_cast(impl.front())) ;   }
+
+   iterator        end()                {return iterator(get_end_node());}
+   const_iterator  end()const           {return const_iterator(get_end_node());}
+
+   reverse_iterator       rbegin()      {return reverse_iterator(this->end());}
+   const_reverse_iterator rbegin()const {return const_reverse_iterator(this->end());}
+   reverse_iterator       rend()        {return reverse_iterator(this->begin());}
+   const_reverse_iterator rend()const   {return const_reverse_iterator(this->begin());}
+
+   const_iterator         cbegin()const {return this->begin();}
+   const_iterator         cend()const   {return this->end();}
+   const_reverse_iterator crbegin()const{return this->rbegin();}
+   const_reverse_iterator crend()const  {return this->rend();}
+
+   // capacity:
+   size_type size() const
+   {  return impl.empty() ? 0 : (impl.size() - ExtraPointers);   }
+
+   size_type max_size() const
+   {  return impl.max_size() - ExtraPointers;  }
+
+   size_type capacity() const
+   {
+      if(!impl.capacity()){
+         return 0;
+      }
+      else{
+         const size_type num_nodes = this->impl.size() + this->internal_data.pool_size;
+         const size_type num_buck  = this->impl.capacity();
+         return (num_nodes < num_buck) ? num_nodes : num_buck;
+      }
+   }
+
+   bool empty() const
+   {  return impl.empty() || impl.size() == ExtraPointers;  }
+
+   void resize(size_type n, const T& t)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      if(n > size())
+         this->insert(this->cend(), n - this->size(), t);
+      else if(n < this->size())
+         this->erase(this->cbegin() + n, this->cend());
+   }
+
+   void resize(size_type n)
+   {
+      typedef default_construct_iterator<value_type, difference_type> default_iterator;
+      STABLE_VECTOR_CHECK_INVARIANT;
+      if(n > size())
+         this->insert(this->cend(), default_iterator(n - this->size()), default_iterator());
+      else if(n < this->size())
+         this->erase(this->cbegin() + n, this->cend());
+   }
+
+   void reserve(size_type n)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      if(n > this->max_size())
+         throw std::bad_alloc();
+
+      size_type size = this->size();   
+      size_type old_capacity = this->capacity();
+      if(n > old_capacity){
+         this->initialize_end_node(n);
+         const void * old_ptr = &impl[0];
+         impl.reserve(n + ExtraPointers);
+         bool realloced = &impl[0] != old_ptr;
+         //Fix the pointers for the newly allocated buffer
+         if(realloced){
+            this->align_nodes(impl.begin(), impl.begin()+size+1);
+         }
+         //Now fill pool if data is not enough
+         if((n - size) > this->internal_data.pool_size){
+            this->add_to_pool((n - size) - this->internal_data.pool_size, alloc_version());
+         }
+      }
+   }
+
+   template<class AllocatorVersion>
+   void clear_pool(AllocatorVersion,
+                  typename boost::container::containers_detail::enable_if_c
+                     <boost::container::containers_detail::is_same<AllocatorVersion, allocator_v1>
+                        ::value>::type * = 0)
+   {
+      if(!impl.empty() && impl.back()){
+         void_ptr &p1 = *(impl.end()-2);
+         void_ptr &p2 = impl.back();
+
+         multiallocation_chain holder(p1, p2, this->internal_data.pool_size);
+         while(!holder.empty()){
+            node_type_ptr_t n = holder.front();
+            holder.pop_front();
+            this->deallocate_one(n);
+         }
+         p1 = p2 = 0;
+         this->internal_data.pool_size = 0;
+      }
+   }
+
+   template<class AllocatorVersion>
+   void clear_pool(AllocatorVersion,
+      typename boost::container::containers_detail::enable_if_c
+         <boost::container::containers_detail::is_same<AllocatorVersion, allocator_v2>
+            ::value>::type * = 0)
+   {
+
+      if(!impl.empty() && impl.back()){
+         void_ptr &p1 = *(impl.end()-2);
+         void_ptr &p2 = impl.back();
+         multiallocation_chain holder(p1, p2, this->internal_data.pool_size);
+         get_al().deallocate_individual(boost::move(holder));
+         p1 = p2 = 0;
+         this->internal_data.pool_size = 0;
+      }
+   }
+
+   void clear_pool()
+   {
+      this->clear_pool(alloc_version());
+   }
+
+   template<class AllocatorVersion>
+   void add_to_pool(size_type n, AllocatorVersion,
+      typename boost::container::containers_detail::enable_if_c
+         <boost::container::containers_detail::is_same<AllocatorVersion, allocator_v1>
+            ::value>::type * = 0)
+   {
+      size_type remaining = n;
+      while(remaining--){
+         this->put_in_pool(this->allocate_one());
+      }
+   }
+
+   template<class AllocatorVersion>
+   void add_to_pool(size_type n, AllocatorVersion,
+      typename boost::container::containers_detail::enable_if_c
+         <boost::container::containers_detail::is_same<AllocatorVersion, allocator_v2>
+            ::value>::type * = 0)
+   {
+      void_ptr &p1 = *(impl.end()-2);
+      void_ptr &p2 = impl.back();
+      multiallocation_chain holder(p1, p2, this->internal_data.pool_size);
+      BOOST_STATIC_ASSERT((boost::is_movable<multiallocation_chain>::value == true));
+      multiallocation_chain m (get_al().allocate_individual(n));
+      holder.splice_after(holder.before_begin(), m, m.before_begin(), m.last(), n);
+      this->internal_data.pool_size += n;
+      std::pair<void_ptr, void_ptr> data(holder.extract_data());
+      p1 = data.first;
+      p2 = data.second;
+   }
+
+   void put_in_pool(node_type_ptr_t p)
+   {
+      void_ptr &p1 = *(impl.end()-2);
+      void_ptr &p2 = impl.back();
+      multiallocation_chain holder(p1, p2, internal_data.pool_size);
+      holder.push_front(p);
+      ++this->internal_data.pool_size;
+      std::pair<void_ptr, void_ptr> ret(holder.extract_data());
+      p1 = ret.first;
+      p2 = ret.second;
+   }
+
+   node_type_ptr_t get_from_pool()
+   {
+      if(!impl.back()){
+         return node_type_ptr_t(0);
+      }
+      else{
+         void_ptr &p1 = *(impl.end()-2);
+         void_ptr &p2 = impl.back();
+         multiallocation_chain holder(p1, p2, internal_data.pool_size);
+         node_type_ptr_t ret = holder.front();
+         holder.pop_front();
+         std::pair<void_ptr, void_ptr> data(holder.extract_data());
+         p1 = data.first;
+         p2 = data.second;
+         --this->internal_data.pool_size;
+         return ret;
+      }
+   }
+
+   // element access:
+
+   reference operator[](size_type n){return value(impl[n]);}
+   const_reference operator[](size_type n)const{return value(impl[n]);}
+
+   const_reference at(size_type n)const
+   {
+      if(n>=size())
+         throw std::out_of_range("invalid subscript at stable_vector::at");
+      return operator[](n);
+   }
+
+   reference at(size_type n)
+   {
+      if(n>=size())
+         throw std::out_of_range("invalid subscript at stable_vector::at");
+      return operator[](n);
+   }
+
+   reference front()
+   {  return value(impl.front());   }
+
+   const_reference front()const
+   {  return value(impl.front());   }
+
+   reference back()
+   {  return value(*(&impl.back() - ExtraPointers)); }
+
+   const_reference back()const
+   {  return value(*(&impl.back() - ExtraPointers)); }
+
+   // modifiers:
+
+   void push_back(const T& t)
+   {  this->insert(end(), t);  }
+
+   void push_back(BOOST_RV_REF(T) t) 
+   {  this->insert(end(), boost::move(t));  }
+
+   void pop_back()
+   {  this->erase(this->end()-1);   }
+
+   iterator insert(const_iterator position, const T& t)
+   {
+      typedef stable_vector_detail::constant_iterator<value_type, difference_type> cvalue_iterator;
+      return this->insert_iter(position, cvalue_iterator(t, 1), cvalue_iterator(), std::forward_iterator_tag());
+   }
+
+   iterator insert(const_iterator position, BOOST_RV_REF(T) x) 
+   {
+      typedef repeat_iterator<T, difference_type>           repeat_it;
+      typedef boost::move_iterator<repeat_it> repeat_move_it;
+      //Just call more general insert(pos, size, value) and return iterator
+      size_type pos_n = position - cbegin();
+      this->insert(position
+         ,repeat_move_it(repeat_it(x, 1))
+         ,repeat_move_it(repeat_it()));
+      return iterator(this->begin() + pos_n);
+   }
+
+   void insert(const_iterator position, size_type n, const T& t)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      this->insert_not_iter(position, n, t);
+   }
+
+   template <class InputIterator>
+   void insert(const_iterator position,InputIterator first, InputIterator last)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      this->insert_iter(position,first,last,
+                        boost::mpl::not_<boost::is_integral<InputIterator> >());
+   }
+
+   #ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... in the end of the vector.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or the in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   template<class ...Args>
+   void emplace_back(Args &&...args)
+   {
+      typedef emplace_functor<node_type_t, Args...>         EmplaceFunctor;
+      typedef emplace_iterator<node_type_t, EmplaceFunctor> EmplaceIterator;
+      EmplaceFunctor ef(boost::forward<Args>(args)...);
+      this->insert(this->cend(), EmplaceIterator(ef), EmplaceIterator());
+   }
+
+   //! <b>Requires</b>: position must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... before position
+   //!
+   //! <b>Throws</b>: If memory allocation throws or the in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: If position is end(), amortized constant time
+   //!   Linear time otherwise.
+   template<class ...Args>
+   iterator emplace(const_iterator position, Args && ...args)
+   {
+      //Just call more general insert(pos, size, value) and return iterator
+      size_type pos_n = position - cbegin();
+      typedef emplace_functor<node_type_t, Args...>         EmplaceFunctor;
+      typedef emplace_iterator<node_type_t, EmplaceFunctor> EmplaceIterator;
+      EmplaceFunctor ef(boost::forward<Args>(args)...);
+      this->insert(position, EmplaceIterator(ef), EmplaceIterator());
+      return iterator(this->begin() + pos_n);
+   }
+
+   #else
+
+   void emplace_back()
+   {
+      typedef emplace_functor<node_type_t>                   EmplaceFunctor;
+      typedef emplace_iterator<node_type_t, EmplaceFunctor>  EmplaceIterator;
+      EmplaceFunctor ef;
+      this->insert(this->cend(), EmplaceIterator(ef), EmplaceIterator());
+   }
+
+   iterator emplace(const_iterator position)
+   {
+      typedef emplace_functor<node_type_t>                   EmplaceFunctor;
+      typedef emplace_iterator<node_type_t, EmplaceFunctor>  EmplaceIterator;
+      EmplaceFunctor ef;
+      size_type pos_n = position - this->cbegin();
+      this->insert(position, EmplaceIterator(ef), EmplaceIterator());
+      return iterator(this->begin() + pos_n);
+   }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                              \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                   \
+   void emplace_back(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                       \
+   {                                                                                            \
+      typedef BOOST_PP_CAT(BOOST_PP_CAT(emplace_functor, n), arg)                               \
+         <node_type_t, BOOST_PP_ENUM_PARAMS(n, P)>           EmplaceFunctor;                    \
+      typedef emplace_iterator<node_type_t, EmplaceFunctor>  EmplaceIterator;                   \
+      EmplaceFunctor ef(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                \
+      this->insert(this->cend(), EmplaceIterator(ef), EmplaceIterator());                       \
+   }                                                                                            \
+                                                                                                \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                   \
+   iterator emplace(const_iterator pos, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))    \
+   {                                                                                            \
+      typedef BOOST_PP_CAT(BOOST_PP_CAT(emplace_functor, n), arg)                               \
+         <node_type_t, BOOST_PP_ENUM_PARAMS(n, P)>           EmplaceFunctor;                    \
+      typedef emplace_iterator<node_type_t, EmplaceFunctor>  EmplaceIterator;                   \
+      EmplaceFunctor ef(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                \
+      size_type pos_n = pos - this->cbegin();                                                   \
+      this->insert(pos, EmplaceIterator(ef), EmplaceIterator());                                \
+      return iterator(this->begin() + pos_n);                                                   \
+   }                                                                                            \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+
+   iterator erase(const_iterator position)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      difference_type d=position-this->cbegin();
+      impl_iterator   it=impl.begin()+d;
+      this->delete_node(*it);
+      impl.erase(it);
+      this->align_nodes(impl.begin()+d,get_last_align());
+      return this->begin()+d;
+   }
+
+   iterator erase(const_iterator first, const_iterator last)
+   {   return priv_erase(first, last, alloc_version());  }
+
+   void swap(stable_vector & x)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      this->swap_impl(*this,x);
+   }
+
+   void clear()
+   {   this->erase(this->cbegin(),this->cend()); }
+
+   /// @cond
+   private:
+
+   void insert_iter_prolog(size_type n, difference_type d)
+   {
+      initialize_end_node(n);
+      const void* old_ptr = &impl[0];
+      //size_type old_capacity = capacity();
+      //size_type old_size = size();
+      impl.insert(impl.begin()+d, n, 0);
+      bool realloced = &impl[0] != old_ptr;
+      //Fix the pointers for the newly allocated buffer
+      if(realloced){
+         align_nodes(impl.begin(), impl.begin()+d);
+      }
+   }
+
+   template<typename InputIterator>
+   void assign_dispatch(InputIterator first, InputIterator last, boost::mpl::false_)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      iterator first1   = this->begin();
+      iterator last1    = this->end();
+      for ( ; first1 != last1 && first != last; ++first1, ++first)
+         *first1 = *first;
+      if (first == last){
+         this->erase(first1, last1);
+      }
+      else{
+         this->insert(last1, first, last);
+      }
+   }
+
+   template<typename Integer>
+   void assign_dispatch(Integer n, Integer t, boost::mpl::true_)
+   {
+      typedef stable_vector_detail::constant_iterator<value_type, difference_type> cvalue_iterator;
+      this->assign_dispatch(cvalue_iterator(t, n), cvalue_iterator(), boost::mpl::false_());
+   }
+
+   iterator priv_erase(const_iterator first, const_iterator last, allocator_v1)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      difference_type d1 = first - this->cbegin(), d2 = last - this->cbegin();
+      if(d1 != d2){
+         impl_iterator it1(impl.begin() + d1), it2(impl.begin() + d2);
+         for(impl_iterator it = it1; it != it2; ++it)
+            this->delete_node(*it);
+         impl.erase(it1, it2);
+         this->align_nodes(impl.begin() + d1, get_last_align());
+      }
+      return iterator(this->begin() + d1);
+   }
+
+   impl_iterator get_last_align()
+   {
+      return impl.end() - (ExtraPointers - 1);
+   }
+
+   const_impl_iterator get_last_align() const
+   {
+      return impl.cend() - (ExtraPointers - 1);
+   }
+
+   template<class AllocatorVersion>
+   iterator priv_erase(const_iterator first, const_iterator last, AllocatorVersion,
+      typename boost::container::containers_detail::enable_if_c
+         <boost::container::containers_detail::is_same<AllocatorVersion, allocator_v2>
+            ::value>::type * = 0)
+   {
+      STABLE_VECTOR_CHECK_INVARIANT;
+      return priv_erase(first, last, allocator_v1());
+   }
+
+   static node_type_ptr_t node_ptr_cast(void_ptr p)
+   {
+      using boost::get_pointer;
+      return node_type_ptr_t(static_cast<node_type_t*>(stable_vector_detail::get_pointer(p)));
+   }
+
+   static node_type_base_ptr_t node_base_ptr_cast(void_ptr p)
+   {
+      using boost::get_pointer;
+      return node_type_base_ptr_t(static_cast<node_type_base_t*>(stable_vector_detail::get_pointer(p)));
+   }
+
+   static value_type& value(void_ptr p)
+   {
+      return node_ptr_cast(p)->value;
+   }
+
+   void initialize_end_node(size_type impl_capacity = 0)
+   {
+      if(impl.empty()){
+         impl.reserve(impl_capacity + ExtraPointers);
+         impl.resize (ExtraPointers, void_ptr(0));
+         impl[0] = &this->internal_data.end_node;
+         this->internal_data.end_node.up = &impl[0];
+      }
+   }
+
+   void readjust_end_node()
+   {
+      if(!this->impl.empty()){
+         void_ptr &end_node_ref = *(this->get_last_align()-1);
+         end_node_ref = this->get_end_node();
+         this->internal_data.end_node.up = &end_node_ref;
+      }
+      else{
+         this->internal_data.end_node.up = void_ptr(&this->internal_data.end_node.up);
+      }
+   }
+
+   node_type_ptr_t get_end_node() const
+   {
+      const node_type_base_t* cp = &this->internal_data.end_node;
+      node_type_base_t* p = const_cast<node_type_base_t*>(cp);
+      return node_ptr_cast(p);
+   }
+
+   template<class Iter>
+   void_ptr new_node(void_ptr up, Iter it)
+   {
+      node_type_ptr_t p = this->allocate_one();
+      try{
+         boost::container::construct_in_place(&*p, it);
+         p->set_pointer(up);
+      }
+      catch(...){
+         this->deallocate_one(p);
+         throw;
+      }
+      return p;
+   }
+
+   void delete_node(void_ptr p)
+   {
+      node_type_ptr_t n(node_ptr_cast(p));
+      n->~node_type_t();
+      this->put_in_pool(n);
+   }
+
+   static void align_nodes(impl_iterator first,impl_iterator last)
+   {
+      while(first!=last){
+         node_ptr_cast(*first)->up = void_ptr(&*first);
+         ++first;
+      }
+   }
+
+   void insert_not_iter(const_iterator position, size_type n, const T& t)
+   {
+      typedef stable_vector_detail::constant_iterator<value_type, difference_type> cvalue_iterator;
+      this->insert_iter(position, cvalue_iterator(t, n), cvalue_iterator(), std::forward_iterator_tag());
+   }
+
+   template <class InputIterator>
+   void insert_iter(const_iterator position,InputIterator first,InputIterator last, boost::mpl::true_)
+   {
+      typedef typename std::iterator_traits<InputIterator>::iterator_category category;
+      this->insert_iter(position, first, last, category());
+   }
+
+   template <class InputIterator>
+   void insert_iter(const_iterator position,InputIterator first,InputIterator last,std::input_iterator_tag)
+   {
+      for(; first!=last; ++first){
+         this->insert(position, *first);
+      }    
+   }
+
+   template <class InputIterator>
+   iterator insert_iter(const_iterator position, InputIterator first, InputIterator last, std::forward_iterator_tag)
+   {
+      size_type       n = (size_type)std::distance(first,last);
+      difference_type d = position-this->cbegin();
+      if(n){
+         this->insert_iter_prolog(n, d);
+         const impl_iterator it(impl.begin() + d);
+         this->insert_iter_fwd(it, first, last, n);
+         //Fix the pointers for the newly allocated buffer
+         this->align_nodes(it + n, get_last_align());
+      }
+      return this->begin() + d;
+   }
+
+   template <class FwdIterator>
+   void insert_iter_fwd_alloc(const impl_iterator it, FwdIterator first, FwdIterator last, difference_type n, allocator_v1)
+   {
+      size_type i=0;
+      try{
+         while(first!=last){
+            *(it + i) = this->new_node(void_ptr((void*)(&*(it + i))), first);
+            ++first;
+            ++i;
+         }
+      }
+      catch(...){
+         impl.erase(it + i, it + n);
+         this->align_nodes(it + i, get_last_align());
+         throw;
+      }
+   }
+
+   template <class FwdIterator>
+   void insert_iter_fwd_alloc(const impl_iterator it, FwdIterator first, FwdIterator last, difference_type n, allocator_v2)
+   {
+      multiallocation_chain mem(get_al().allocate_individual(n));
+
+      size_type i = 0;
+      node_type_ptr_t p = 0;
+      try{
+         while(first != last){
+            p = mem.front();
+            mem.pop_front();
+            //This can throw
+            boost::container::construct_in_place(&*p, first);
+            p->set_pointer(void_ptr((void*)(&*(it + i))));
+            ++first;
+            *(it + i) = p;
+            ++i;
+         }
+      }
+      catch(...){
+         get_al().deallocate_one(p);
+         get_al().deallocate_many(boost::move(mem));
+         impl.erase(it+i, it+n);
+         this->align_nodes(it+i,get_last_align());
+         throw;
+      }
+   }
+
+   template <class FwdIterator>
+   void insert_iter_fwd(const impl_iterator it, FwdIterator first, FwdIterator last, difference_type n)
+   {
+      size_type i = 0;
+      node_type_ptr_t p = 0;
+      try{
+         while(first != last){
+            p = get_from_pool();
+            if(!p){
+               insert_iter_fwd_alloc(it+i, first, last, n-i, alloc_version());
+               break;
+            }
+            //This can throw
+            boost::container::construct_in_place(&*p, first);
+            p->set_pointer(void_ptr(&*(it+i)));
+            ++first;
+            *(it+i)=p;
+            ++i;
+         }
+      }
+      catch(...){
+         put_in_pool(p);
+         impl.erase(it+i,it+n);
+         this->align_nodes(it+i,get_last_align());
+         throw;
+      }
+   }
+
+   template <class InputIterator>
+   void insert_iter(const_iterator position,InputIterator first,InputIterator last, boost::mpl::false_)
+   {
+      this->insert_not_iter(position,first,last);
+   }
+
+   static void swap_impl(stable_vector& x,stable_vector& y)
+   {
+      using std::swap;
+      swap(x.get_al(),y.get_al());
+      swap(x.impl,y.impl);
+      swap(x.internal_data.pool_size, y.internal_data.pool_size);
+      x.readjust_end_node();
+      y.readjust_end_node();
+   }
+
+   #if defined(STABLE_VECTOR_ENABLE_INVARIANT_CHECKING)
+   bool invariant()const
+   {
+      if(impl.empty())
+         return !capacity() && !size();
+      if(get_end_node() != *(impl.end() - ExtraPointers)){
+         return false;
+      }
+      for(const_impl_iterator it=impl.begin(),it_end=get_last_align();it!=it_end;++it){
+         if(node_ptr_cast(*it)->up != &*it)
+         return false;
+      }
+      size_type n = capacity()-size();
+      const void_ptr &pool_head = impl.back();
+      size_type num_pool = 0;
+      node_type_ptr_t p = node_ptr_cast(pool_head);
+      while(p){
+         ++num_pool;
+         p = p->up;
+      }
+      return n >= num_pool;
+   }
+
+   class invariant_checker:private boost::noncopyable
+   {
+      const stable_vector* p;
+      public:
+      invariant_checker(const stable_vector& v):p(&v){}
+      ~invariant_checker(){BOOST_ASSERT(p->invariant());}
+      void touch(){}
+   };
+   #endif
+
+   struct ebo_holder
+      : node_allocator_type
+   {
+      ebo_holder(const allocator_type &a)
+         : node_allocator_type(a), pool_size(0), end_node()
+      {
+         end_node.set_pointer(void_ptr(&end_node.up));
+      }
+      size_type pool_size;
+      node_type_base_t end_node;
+   } internal_data;
+
+   node_allocator_type &get_al()              { return internal_data;  }
+   const node_allocator_type &get_al() const  { return internal_data;  }
+
+   impl_type                           impl;
+   /// @endcond
+};
+
+template <typename T,typename Allocator>
+bool operator==(const stable_vector<T,Allocator>& x,const stable_vector<T,Allocator>& y)
+{
+   return x.size()==y.size()&&std::equal(x.begin(),x.end(),y.begin());
+}
+
+template <typename T,typename Allocator>
+bool operator< (const stable_vector<T,Allocator>& x,const stable_vector<T,Allocator>& y)
+{
+   return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end());
+}
+
+template <typename T,typename Allocator>
+bool operator!=(const stable_vector<T,Allocator>& x,const stable_vector<T,Allocator>& y)
+{
+   return !(x==y);
+}
+
+template <typename T,typename Allocator>
+bool operator> (const stable_vector<T,Allocator>& x,const stable_vector<T,Allocator>& y)
+{
+   return y<x;
+}
+
+template <typename T,typename Allocator>
+bool operator>=(const stable_vector<T,Allocator>& x,const stable_vector<T,Allocator>& y)
+{
+   return !(x<y);
+}
+
+template <typename T,typename Allocator>
+bool operator<=(const stable_vector<T,Allocator>& x,const stable_vector<T,Allocator>& y)
+{
+   return !(x>y);
+}
+
+// specialized algorithms:
+
+template <typename T, typename Allocator>
+void swap(stable_vector<T,Allocator>& x,stable_vector<T,Allocator>& y)
+{
+   x.swap(y);
+}
+
+/// @cond
+
+#undef STABLE_VECTOR_CHECK_INVARIANT
+
+/// @endcond
+
+}}
+
+#endif
Added: sandbox/move/boost/container/string.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/string.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,2319 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's string file. Modified by Ion Gaztanaga 2004-2008
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+// 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.
+
+#ifndef BOOST_CONTAINERS_STRING_HPP
+#define BOOST_CONTAINERS_STRING_HPP
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/containers_fwd.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/iterators.hpp>
+#include <boost/container/detail/algorithms.hpp>
+#include <boost/container/detail/version_type.hpp>
+#include <boost/container/detail/allocation_type.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/move/move.hpp>
+#include <boost/static_assert.hpp>
+
+#include <functional>
+#include <string>
+#include <stdexcept>      
+#include <utility>  
+#include <iterator>
+#include <memory>
+#include <algorithm>
+#include <iosfwd>
+#include <istream>
+#include <ostream>
+#include <ios>
+#include <locale>
+#include <cstddef>
+#include <climits>
+#include <boost/container/detail/type_traits.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+namespace containers_detail {
+// ------------------------------------------------------------
+// Class basic_string_base.  
+
+// basic_string_base is a helper class that makes it it easier to write
+// an exception-safe version of basic_string.  The constructor allocates,
+// but does not initialize, a block of memory.  The destructor
+// deallocates, but does not destroy elements within, a block of
+// memory.  The destructor assumes that the memory either is the internal buffer, 
+// or else points to a block of memory that was allocated using _String_base's 
+// allocator and whose size is this->m_storage.
+template <class A>
+class basic_string_base
+{
+   basic_string_base();
+   basic_string_base(basic_string_base&);
+   basic_string_base & operator=(basic_string_base&);
+
+ public:
+   BOOST_ENABLE_MOVE_EMULATION(basic_string_base)
+
+   typedef A allocator_type;
+   //! The stored allocator type
+   typedef allocator_type                          stored_allocator_type;
+   typedef typename A::pointer     pointer;
+   typedef typename A::value_type  value_type;
+   typedef typename A::size_type   size_type;
+
+   basic_string_base(const allocator_type& a)
+      : members_(a)
+   {  init(); }
+
+   basic_string_base(const allocator_type& a, std::size_t n)
+      : members_(a)
+   {  
+      this->init(); 
+      this->allocate_initial_block(n);
+   }
+
+   basic_string_base(BOOST_RV_REF(basic_string_base) b)
+      :  members_(b.members_)
+   {  
+      init();
+      this->swap(b); 
+   }
+
+   ~basic_string_base() 
+   {  
+      this->deallocate_block(); 
+      if(!this->is_short()){
+         static_cast<long_t*>(static_cast<void*>(&this->members_.m_repr.r))->~long_t();
+      }
+   }
+
+   private:
+
+   //This is the structure controlling a long string 
+   struct long_t
+   {
+      size_type      is_short  : 1;
+      size_type      length    : (sizeof(size_type)*CHAR_BIT - 1);
+      size_type      storage;
+      pointer        start;
+
+      long_t()
+      {}
+
+      long_t(const long_t &other)
+      {
+         this->is_short = other.is_short;
+         length   = other.length;
+         storage  = other.storage;
+         start    = other.start;
+      }
+
+      long_t &operator =(const long_t &other)
+      {
+         this->is_short = other.is_short;
+         length   = other.length;
+         storage  = other.storage;
+         start    = other.start;
+         return *this;
+      }
+   };
+
+   //This basic type should have the same alignment as long_t
+//iG   typedef typename type_with_alignment<containers_detail::alignment_of<long_t>::value>::type
+//      long_alignment_type;
+   typedef void *long_alignment_type;
+   BOOST_STATIC_ASSERT((containers_detail::alignment_of<long_alignment_type>::value % 
+                        containers_detail::alignment_of<long_t>::value) == 0);
+
+
+   //This type is the first part of the structure controlling a short string
+   //The "data" member stores
+   struct short_header
+   {
+      unsigned char  is_short  : 1;
+      unsigned char  length    : (CHAR_BIT - 1);
+   };
+
+   //This type has the same alignment and size as long_t but it's POD
+   //so, unlike long_t, it can be placed in a union
+   struct long_raw_t
+   {
+      long_alignment_type  a;
+      unsigned char        b[sizeof(long_t) - sizeof(long_alignment_type)];
+   };
+
+   protected:
+   static const size_type  MinInternalBufferChars = 8;
+   static const size_type  AlignmentOfValueType =
+      alignment_of<value_type>::value;
+   static const size_type  ShortDataOffset =
+      containers_detail::ct_rounded_size<sizeof(short_header),  AlignmentOfValueType>::value;
+   static const size_type  ZeroCostInternalBufferChars =
+      (sizeof(long_t) - ShortDataOffset)/sizeof(value_type);
+   static const size_type  UnalignedFinalInternalBufferChars = 
+      (ZeroCostInternalBufferChars > MinInternalBufferChars) ?
+                ZeroCostInternalBufferChars : MinInternalBufferChars;
+
+   struct short_t
+   {
+      short_header   h; 
+      value_type     data[UnalignedFinalInternalBufferChars];
+   };
+
+   union repr_t
+   {
+      long_raw_t  r;
+      short_t     s;
+
+      short_t &short_repr() const
+      {  return *const_cast<short_t *>(&s);  }
+
+      long_t &long_repr() const
+      {  return *static_cast<long_t*>(const_cast<void*>(static_cast<const void*>(&r)));  }
+   };
+
+   struct members_holder
+      :  public A
+   {
+      members_holder(const A &a)
+         :  A(a)
+      {}
+
+      repr_t m_repr;
+   } members_;
+
+   const A &alloc() const
+   {  return members_;  }
+
+   A &alloc()
+   {  return members_;  }
+
+   static const size_type InternalBufferChars = (sizeof(repr_t) - ShortDataOffset)/sizeof(value_type);
+
+   private:
+
+   static const size_type MinAllocation = InternalBufferChars*2;
+
+   protected:
+   bool is_short() const
+   {  return static_cast<bool>(this->members_.m_repr.s.h.is_short != 0);  }
+
+   void is_short(bool yes)
+   {  
+      if(yes && !this->is_short()){
+         static_cast<long_t*>(static_cast<void*>(&this->members_.m_repr.r))->~long_t();
+      }
+      else{
+         new(static_cast<void*>(&this->members_.m_repr.r))long_t();
+      }
+      this->members_.m_repr.s.h.is_short = yes;
+   }
+
+   private:
+   void init()
+   {
+      this->members_.m_repr.s.h.is_short = 1;
+      this->members_.m_repr.s.h.length   = 0;
+   }
+
+   protected:
+
+   typedef containers_detail::integral_constant<unsigned, 1>      allocator_v1;
+   typedef containers_detail::integral_constant<unsigned, 2>      allocator_v2;
+   typedef containers_detail::integral_constant<unsigned,
+      boost::container::containers_detail::version<A>::value> alloc_version;
+
+   std::pair<pointer, bool>
+      allocation_command(allocation_type command,
+                         size_type limit_size, 
+                         size_type preferred_size,
+                         size_type &received_size, pointer reuse = 0)
+   {
+      if(this->is_short() && (command & (expand_fwd | expand_bwd)) ){
+         reuse = pointer(0);
+         command &= ~(expand_fwd | expand_bwd);
+      }
+      return this->allocation_command
+         (command, limit_size, preferred_size, received_size, reuse, alloc_version());
+   }
+
+   std::pair<pointer, bool>
+      allocation_command(allocation_type command,
+                         size_type limit_size, 
+                         size_type preferred_size,
+                         size_type &received_size,
+                         const pointer &reuse,
+                         allocator_v1)
+   {
+      (void)limit_size;
+      (void)reuse;
+      if(!(command & allocate_new))
+         return std::pair<pointer, bool>(pointer(0), 0);
+      received_size = preferred_size;
+      return std::make_pair(this->alloc().allocate(received_size), false);
+   }
+
+   std::pair<pointer, bool>
+      allocation_command(allocation_type command,
+                         size_type limit_size, 
+                         size_type preferred_size,
+                         size_type &received_size,
+                         pointer reuse,
+                         allocator_v2)
+   {
+      return this->alloc().allocation_command(command, limit_size, preferred_size, 
+                                              received_size, reuse);
+   }
+
+   size_type next_capacity(size_type additional_objects) const
+   {  return get_next_capacity(this->alloc().max_size(), this->priv_storage(), additional_objects);  }
+
+   void deallocate(pointer p, std::size_t n) 
+   {  
+      if (p && (n > InternalBufferChars))
+         this->alloc().deallocate(p, n);
+   }
+
+   void construct(pointer p, const value_type &value = value_type())
+   {  new((void*)containers_detail::get_pointer(p)) value_type(value);   }
+
+   void destroy(pointer p, size_type n)
+   {
+      for(; n--; ++p)
+         containers_detail::get_pointer(p)->~value_type();
+   }
+
+   void destroy(pointer p)
+   {  containers_detail::get_pointer(p)->~value_type(); }
+
+   void allocate_initial_block(std::size_t n)
+   {
+      if (n <= this->max_size()) {
+         if(n > InternalBufferChars){
+            size_type new_cap = this->next_capacity(n);
+            pointer p = this->allocation_command(allocate_new, n, new_cap, new_cap).first;
+            this->is_short(false);
+            this->priv_addr(p);
+            this->priv_size(0);
+            this->priv_storage(new_cap);
+         }
+      }
+      else
+         throw_length_error();
+   }
+
+   void deallocate_block() 
+   {  this->deallocate(this->priv_addr(), this->priv_storage());  }
+      
+   std::size_t max_size() const
+   {  return this->alloc().max_size() - 1; }
+
+   // Helper functions for exception handling.
+   void throw_length_error() const
+   {  throw(std::length_error("basic_string"));  }
+
+   void throw_out_of_range() const
+   {  throw(std::out_of_range("basic_string"));  }
+
+   protected:
+   size_type priv_capacity() const
+   { return this->priv_storage() - 1; }
+
+   pointer priv_addr() const
+   {  return this->is_short() ? pointer(&this->members_.m_repr.short_repr().data[0]) : this->members_.m_repr.long_repr().start;  }
+
+   void priv_addr(pointer addr)
+   {  this->members_.m_repr.long_repr().start = addr;  }
+
+   size_type priv_storage() const
+   {  return this->is_short() ? InternalBufferChars : this->members_.m_repr.long_repr().storage;  }
+
+   void priv_storage(size_type storage)
+   {  
+      if(!this->is_short())
+         this->members_.m_repr.long_repr().storage = storage;
+   }
+
+   size_type priv_size() const
+   {  return this->is_short() ? this->members_.m_repr.short_repr().h.length : this->members_.m_repr.long_repr().length;  }
+
+   void priv_size(size_type sz)
+   {  
+      if(this->is_short())
+         this->members_.m_repr.s.h.length = (unsigned char)sz;
+      else
+         this->members_.m_repr.long_repr().length = static_cast<typename A::size_type>(sz);
+   }
+
+   void swap(basic_string_base& other)
+   {
+      if(this->is_short()){
+         if(other.is_short()){
+            std::swap(this->members_.m_repr, other.members_.m_repr);
+         }
+         else{
+            repr_t copied(this->members_.m_repr);
+            this->members_.m_repr.long_repr() = other.members_.m_repr.long_repr();
+            other.members_.m_repr = copied;
+         }
+      }
+      else{
+         if(other.is_short()){
+            repr_t copied(other.members_.m_repr);
+            other.members_.m_repr.long_repr() = this->members_.m_repr.long_repr();
+            this->members_.m_repr = copied;
+         }
+         else{
+            std::swap(this->members_.m_repr.long_repr(), other.members_.m_repr.long_repr());
+         }
+      }
+
+      allocator_type & this_al = this->alloc(), &other_al = other.alloc();
+      if(this_al != other_al){
+         containers_detail::do_swap(this_al, other_al);
+      }
+   }
+};
+
+}  //namespace containers_detail {
+
+/// @endcond
+
+//! The basic_string class represents a Sequence of characters. It contains all the 
+//! usual operations of a Sequence, and, additionally, it contains standard string 
+//! operations such as search and concatenation.
+//!
+//! The basic_string class is parameterized by character type, and by that type's 
+//! Character Traits.
+//! 
+//! This class has performance characteristics very much like vector<>, meaning, 
+//! for example, that it does not perform reference-count or copy-on-write, and that
+//! concatenation of two strings is an O(N) operation. 
+//! 
+//! Some of basic_string's member functions use an unusual method of specifying positions 
+//! and ranges. In addition to the conventional method using iterators, many of 
+//! basic_string's member functions use a single value pos of type size_type to represent a 
+//! position (in which case the position is begin() + pos, and many of basic_string's 
+//! member functions use two values, pos and n, to represent a range. In that case pos is 
+//! the beginning of the range and n is its size. That is, the range is 
+//! [begin() + pos, begin() + pos + n). 
+//! 
+//! Note that the C++ standard does not specify the complexity of basic_string operations. 
+//! In this implementation, basic_string has performance characteristics very similar to 
+//! those of vector: access to a single character is O(1), while copy and concatenation 
+//! are O(N).
+//! 
+//! In this implementation, begin(), 
+//! end(), rbegin(), rend(), operator[], c_str(), and data() do not invalidate iterators.
+//! In this implementation, iterators are only invalidated by member functions that
+//! explicitly change the string's contents. 
+template <class CharT, class Traits, class A> 
+class basic_string
+   :  private containers_detail::basic_string_base<A> 
+{
+   /// @cond
+   private:
+   typedef containers_detail::basic_string_base<A> base_t;
+   static const typename base_t::size_type InternalBufferChars = base_t::InternalBufferChars;
+
+   protected:
+   // A helper class to use a char_traits as a function object.
+
+   template <class Tr>
+   struct Eq_traits
+      : public std::binary_function<typename Tr::char_type,
+                                    typename Tr::char_type,
+                                    bool>
+   {
+      bool operator()(const typename Tr::char_type& x,
+                      const typename Tr::char_type& y) const
+         { return Tr::eq(x, y); }
+   };
+
+   template <class Tr>
+   struct Not_within_traits
+      : public std::unary_function<typename Tr::char_type, bool>
+   {
+      typedef const typename Tr::char_type* Pointer;
+      const Pointer m_first;
+      const Pointer m_last;
+
+      Not_within_traits(Pointer f, Pointer l) 
+         : m_first(f), m_last(l) {}
+
+      bool operator()(const typename Tr::char_type& x) const 
+      {
+         return std::find_if(m_first, m_last, 
+                        std::bind1st(Eq_traits<Tr>(), x)) == m_last;
+      }
+   };
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(basic_string)
+
+   //! The allocator type
+   typedef A                                       allocator_type;
+   //! The stored allocator type
+   typedef allocator_type                          stored_allocator_type;
+   //! The type of object, CharT, stored in the string
+   typedef CharT                                   value_type;
+   //! The second template parameter Traits
+   typedef Traits                                  traits_type;
+   //! Pointer to CharT
+   typedef typename A::pointer                     pointer;
+   //! Const pointer to CharT 
+   typedef typename A::const_pointer               const_pointer;
+   //! Reference to CharT 
+   typedef typename A::reference                   reference;
+   //! Const reference to CharT 
+   typedef typename A::const_reference             const_reference;
+   //! An unsigned integral type
+   typedef typename A::size_type                   size_type;
+   //! A signed integral type
+   typedef typename A::difference_type             difference_type;
+   //! Iterator used to iterate through a string. It's a Random Access Iterator
+   typedef pointer                                 iterator;
+   //! Const iterator used to iterate through a string. It's a Random Access Iterator
+   typedef const_pointer                           const_iterator;
+   //! Iterator used to iterate backwards through a string
+   typedef std::reverse_iterator<iterator>       reverse_iterator;
+   //! Const iterator used to iterate backwards through a string
+   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+   //! The largest possible value of type size_type. That is, size_type(-1). 
+   static const size_type npos;
+
+   /// @cond
+   private:
+   typedef constant_iterator<CharT, difference_type> cvalue_iterator;
+   /// @endcond
+
+   public:                         // Constructor, destructor, assignment.
+   /// @cond
+   struct reserve_t {};
+   /// @endcond
+
+   basic_string(reserve_t, std::size_t n,
+               const allocator_type& a = allocator_type())
+      : base_t(a, n + 1)
+   { this->priv_terminate_string(); }
+
+   //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter.
+   //! 
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   explicit basic_string(const allocator_type& a = allocator_type())
+      : base_t(a, InternalBufferChars)
+   { this->priv_terminate_string(); }
+
+   //! <b>Effects</b>: Copy constructs a basic_string.
+   //!
+   //! <b>Postcondition</b>: x == *this.
+   //! 
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor throws.
+   basic_string(const basic_string& s) 
+      : base_t(s.alloc()) 
+   { this->priv_range_initialize(s.begin(), s.end()); }
+
+   //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
+   //!
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   basic_string(BOOST_RV_REF(basic_string) s) 
+      : base_t(boost::move((base_t&)s))
+   {}
+
+   //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
+   //!   and is initialized by a specific number of characters of the s string. 
+   basic_string(const basic_string& s, size_type pos, size_type n = npos,
+               const allocator_type& a = allocator_type()) 
+      : base_t(a) 
+   {
+      if (pos > s.size())
+         this->throw_out_of_range();
+      else
+         this->priv_range_initialize
+            (s.begin() + pos, s.begin() + pos + containers_detail::min_value(n, s.size() - pos));
+   }
+
+   //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
+   //!   and is initialized by a specific number of characters of the s c-string.
+   basic_string(const CharT* s, size_type n,
+               const allocator_type& a = allocator_type()) 
+      : base_t(a) 
+   { this->priv_range_initialize(s, s + n); }
+
+   //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
+   //!   and is initialized by the null-terminated s c-string.
+   basic_string(const CharT* s,
+                const allocator_type& a = allocator_type())
+      : base_t(a) 
+   { this->priv_range_initialize(s, s + Traits::length(s)); }
+
+   //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
+   //!   and is initialized by n copies of c.
+   basic_string(size_type n, CharT c,
+                const allocator_type& a = allocator_type())
+      : base_t(a)
+   {  
+      this->priv_range_initialize(cvalue_iterator(c, n),
+                                  cvalue_iterator());
+   }
+
+   //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
+   //!   and a range of iterators.
+   template <class InputIterator>
+   basic_string(InputIterator f, InputIterator l,
+               const allocator_type& a = allocator_type())
+      : base_t(a)
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InputIterator, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_initialize_dispatch(f, l, Result());
+   }
+
+   //! <b>Effects</b>: Destroys the basic_string. All used memory is deallocated.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Constant.
+   ~basic_string() 
+   {}
+      
+   //! <b>Effects</b>: Copy constructs a string.
+   //!
+   //! <b>Postcondition</b>: x == *this.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements x contains.
+   basic_string& operator=(const basic_string& s)
+   {
+      if (&s != this) 
+         this->assign(s.begin(), s.end());
+      return *this;
+   }
+
+   //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
+   //!
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   basic_string& operator=(BOOST_RV_REF(basic_string) ms)
+   {
+      basic_string &s = ms;
+      if (&s != this){
+         this->swap(s);
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Assignment from a null-terminated c-string.
+   basic_string& operator=(const CharT* s) 
+   { return this->assign(s, s + Traits::length(s)); }
+
+   //! <b>Effects</b>: Assignment from character.
+   basic_string& operator=(CharT c)
+   { return this->assign(static_cast<size_type>(1), c); }
+
+   //! <b>Effects</b>: Returns an iterator to the first element contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator begin()
+   { return this->priv_addr(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator begin() const
+   { return this->priv_addr(); }
+
+   //! <b>Effects</b>: Returns an iterator to the end of the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator end()
+   { return this->priv_addr() + this->priv_size(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator end() const 
+   { return this->priv_addr() + this->priv_size(); }  
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning 
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rbegin()             
+   { return reverse_iterator(this->priv_addr() + this->priv_size()); }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning 
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rbegin() const 
+   { return const_reverse_iterator(this->priv_addr() + this->priv_size()); }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rend()               
+   { return reverse_iterator(this->priv_addr()); }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rend()   const 
+   { return const_reverse_iterator(this->priv_addr()); }
+
+   //! <b>Effects</b>: Returns a copy of the internal allocator.
+   //! 
+   //! <b>Throws</b>: If allocator's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   allocator_type get_allocator() const 
+   { return this->alloc(); }
+
+   //! <b>Effects</b>: Returns the number of the elements contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type size() const    
+   { return this->priv_size(); }
+
+   //! <b>Effects</b>: Returns the number of the elements contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type length() const
+   { return this->size(); }
+
+   //! <b>Effects</b>: Returns the largest possible size of the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type max_size() const
+   { return base_t::max_size(); }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are copy constructed from x.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type n, CharT c)
+   {
+      if (n <= size())
+         this->erase(this->begin() + n, this->end());
+      else
+         this->append(n - this->size(), c);
+   }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are default constructed.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type n)
+   { resize(n, this->priv_null()); }
+
+   //! <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.
+   void reserve(size_type res_arg)
+   {
+      if (res_arg > this->max_size())
+         this->throw_length_error();
+
+      if (this->capacity() < res_arg){
+         size_type n = containers_detail::max_value(res_arg, this->size()) + 1;
+         size_type new_cap = this->next_capacity(n);
+         pointer new_start = this->allocation_command
+            (allocate_new, n, new_cap, new_cap).first;
+         size_type new_length = 0;
+
+         new_length += priv_uninitialized_copy
+            (this->priv_addr(), this->priv_addr() + this->priv_size(), new_start);
+         this->priv_construct_null(new_start + new_length);
+         this->deallocate_block();
+         this->is_short(false);
+         this->priv_addr(new_start);
+         this->priv_size(new_length);
+         this->priv_storage(new_cap);
+      }
+   }
+
+   //! <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 this->priv_capacity(); }
+
+   //! <b>Effects</b>: Erases all the elements of the vector.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in the vector.
+   void clear()
+   {
+      if (!empty()) {
+         Traits::assign(*this->priv_addr(), this->priv_null());
+         this->priv_size(0);
+      }
+   } 
+
+   //! <b>Effects</b>: Returns true if the vector contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   bool empty() const
+   { return !this->priv_size(); }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference operator[](size_type n)
+      { return *(this->priv_addr() + n); }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a const reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference operator[](size_type n) const
+      { return *(this->priv_addr() + n); }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: std::range_error if n >= size()
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference at(size_type n) {
+      if (n >= size())
+      this->throw_out_of_range();
+      return *(this->priv_addr() + n);
+   }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a const reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: std::range_error if n >= size()
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference at(size_type n) const {
+      if (n >= size())
+         this->throw_out_of_range();
+      return *(this->priv_addr() + n);
+   }
+
+   //! <b>Effects</b>: Appends string s to *this.
+   basic_string& operator+=(const basic_string& s)
+   {  return this->append(s); }
+
+   //! <b>Effects</b>: Appends c-string s to *this.
+   basic_string& operator+=(const CharT* s)
+   {  return this->append(s); }
+
+   //! <b>Effects</b>: Appends character c to *this.
+   basic_string& operator+=(CharT c)
+   {  this->push_back(c); return *this;   }
+
+   //! <b>Effects</b>: Appends string s to *this.
+   basic_string& append(const basic_string& s) 
+   {  return this->append(s.begin(), s.end());  }
+
+   //! <b>Effects</b>: Appends the range [pos, pos + n) from string s to *this.
+   basic_string& append(const basic_string& s, size_type pos, size_type n)
+   {
+      if (pos > s.size())
+      this->throw_out_of_range();
+      return this->append(s.begin() + pos,
+                          s.begin() + pos + containers_detail::min_value(n, s.size() - pos));
+   }
+
+   //! <b>Effects</b>: Appends the range [s, s + n) from c-string s to *this.
+   basic_string& append(const CharT* s, size_type n) 
+   {  return this->append(s, s + n);  }
+
+   //! <b>Effects</b>: Appends the c-string s to *this.
+   basic_string& append(const CharT* s) 
+   {  return this->append(s, s + Traits::length(s));  }
+
+   //! <b>Effects</b>: Appends the n times the character c to *this.
+   basic_string& append(size_type n, CharT c)
+   {  return this->append(cvalue_iterator(c, n), cvalue_iterator()); }
+
+   //! <b>Effects</b>: Appends the range [first, last) *this.
+   template <class InputIter>
+   basic_string& append(InputIter first, InputIter last)
+   {  this->insert(this->end(), first, last);   return *this;  }
+
+   //! <b>Effects</b>: Inserts a copy of c at the end of the vector.
+   void push_back(CharT c)
+   {
+      if (this->priv_size() < this->capacity()){
+         this->priv_construct_null(this->priv_addr() + (this->priv_size() + 1));
+         Traits::assign(this->priv_addr()[this->priv_size()], c);
+         this->priv_size(this->priv_size()+1);
+      }
+      else{
+         //No enough memory, insert a new object at the end
+         this->append((size_type)1, c);
+      }
+   }
+
+   //! <b>Effects</b>: Removes the last element from the vector.
+   void pop_back()
+   {
+      Traits::assign(this->priv_addr()[this->priv_size()-1], this->priv_null());
+      this->priv_size(this->priv_size()-1);;
+   }
+
+   //! <b>Effects</b>: Assigns the value s to *this.
+   basic_string& assign(const basic_string& s) 
+   {  return this->operator=(s); }
+
+   //! <b>Effects</b>: Moves the resources from ms *this.
+   basic_string& assign(BOOST_RV_REF(basic_string) ms) 
+   {  return this->operator=(ms);}
+
+   //! <b>Effects</b>: Assigns the range [pos, pos + n) from s to *this.
+   basic_string& assign(const basic_string& s, 
+                        size_type pos, size_type n) {
+      if (pos > s.size())
+      this->throw_out_of_range();
+      return this->assign(s.begin() + pos, 
+                          s.begin() + pos + containers_detail::min_value(n, s.size() - pos));
+   }
+
+   //! <b>Effects</b>: Assigns the range [s, s + n) from s to *this.
+   basic_string& assign(const CharT* s, size_type n)
+   {  return this->assign(s, s + n);   }
+
+   //! <b>Effects</b>: Assigns the c-string s to *this.
+   basic_string& assign(const CharT* s)
+   { return this->assign(s, s + Traits::length(s)); }
+
+   //! <b>Effects</b>: Assigns the character c n-times to *this.
+   basic_string& assign(size_type n, CharT c)
+   {  return this->assign(cvalue_iterator(c, n), cvalue_iterator()); }
+
+   //! <b>Effects</b>: Assigns the range [first, last) to *this.
+   template <class InputIter>
+   basic_string& assign(InputIter first, InputIter last) 
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InputIter, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      return this->priv_assign_dispatch(first, last, Result());
+   }
+
+   //! <b>Effects</b>: Assigns the range [f, l) to *this.
+   basic_string& assign(const CharT* f, const CharT* l)
+   {
+      const std::ptrdiff_t n = l - f;
+      if (static_cast<size_type>(n) <= size()) {
+         Traits::copy(containers_detail::get_pointer(this->priv_addr()), f, n);
+         this->erase(this->priv_addr() + n, this->priv_addr() + this->priv_size());
+      }
+      else {
+         Traits::copy(containers_detail::get_pointer(this->priv_addr()), f, this->priv_size());
+         this->append(f + this->priv_size(), l);
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Inserts the string s before pos.
+   basic_string& insert(size_type pos, const basic_string& s) 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      if (this->size() > this->max_size() - s.size())
+         this->throw_length_error();
+      this->insert(this->priv_addr() + pos, s.begin(), s.end());
+      return *this;
+   }
+
+   //! <b>Effects</b>: Inserts the range [pos, pos + n) from string s before pos.
+   basic_string& insert(size_type pos, const basic_string& s,
+                        size_type beg, size_type n) 
+   {
+      if (pos > this->size() || beg > s.size())
+         this->throw_out_of_range();
+      size_type len = containers_detail::min_value(n, s.size() - beg);
+      if (this->size() > this->max_size() - len)
+         this->throw_length_error();
+      const CharT *beg_ptr = containers_detail::get_pointer(s.begin()) + beg;
+      const CharT *end_ptr = beg_ptr + len;
+      this->insert(this->priv_addr() + pos, beg_ptr, end_ptr);
+      return *this;
+   }
+
+   //! <b>Effects</b>: Inserts the range [s, s + n) before pos.
+   basic_string& insert(size_type pos, const CharT* s, size_type n) 
+   {
+      if (pos > this->size())
+         this->throw_out_of_range();
+      if (this->size() > this->max_size() - n)
+         this->throw_length_error();
+      this->insert(this->priv_addr() + pos, s, s + n);
+      return *this;
+   }
+
+   //! <b>Effects</b>: Inserts the c-string s before pos.
+   basic_string& insert(size_type pos, const CharT* s) 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      size_type len = Traits::length(s);
+      if (this->size() > this->max_size() - len)
+         this->throw_length_error();
+      this->insert(this->priv_addr() + pos, s, s + len);
+      return *this;
+   }
+
+   //! <b>Effects</b>: Inserts the character c n-times before pos.
+   basic_string& insert(size_type pos, size_type n, CharT c) 
+   {
+      if (pos > this->size())
+         this->throw_out_of_range();
+      if (this->size() > this->max_size() - n)
+         this->throw_length_error();
+      this->insert(this->priv_addr() + pos, n, c);
+      return *this;
+   }
+
+   //! <b>Effects</b>: Inserts the character c before position.
+   iterator insert(iterator position, CharT c) 
+   {
+      size_type new_offset = position - this->priv_addr() + 1;
+      this->insert(position, cvalue_iterator(c, 1),
+                             cvalue_iterator());
+      return this->priv_addr() + new_offset;
+   }
+
+   //! <b>Effects</b>: Inserts the character c n-times before position.
+   void insert(iterator position, std::size_t n, CharT c)
+   {
+      this->insert(position, cvalue_iterator(c, n),
+                             cvalue_iterator());
+   }
+
+   //! <b>Effects</b>: Inserts the range [first, last) before position.
+   template <class InputIter>
+   void insert(iterator p, InputIter first, InputIter last) 
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InputIter, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_insert_dispatch(p, first, last, Result());
+   }
+
+   //! <b>Effects</b>: Inserts the range [pos, pos + n).
+   basic_string& erase(size_type pos = 0, size_type n = npos) 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      erase(this->priv_addr() + pos, this->priv_addr() + pos + containers_detail::min_value(n, size() - pos));
+      return *this;
+   }  
+
+   //! <b>Effects</b>: Erases the character pointed by position.
+   iterator erase(iterator position) 
+   {
+      // The move includes the terminating null.
+      Traits::move(containers_detail::get_pointer(position), 
+                   containers_detail::get_pointer(position + 1), 
+                   this->priv_size() - (position - this->priv_addr()));
+      this->priv_size(this->priv_size()-1);
+      return position;
+   }
+
+   //! <b>Effects</b>: Erases the range [first, last).
+   iterator erase(iterator first, iterator last)
+   {
+      if (first != last) { // The move includes the terminating null.
+         size_type num_erased = last - first;
+         Traits::move(containers_detail::get_pointer(first), 
+                      containers_detail::get_pointer(last), 
+                      (this->priv_size() + 1)-(last - this->priv_addr()));
+         size_type new_length = this->priv_size() - num_erased;
+         this->priv_size(new_length);
+      }
+      return first;
+   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with the string s.
+   basic_string& replace(size_type pos, size_type n, 
+                         const basic_string& s) 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      const size_type len = containers_detail::min_value(n, size() - pos);
+      if (this->size() - len >= this->max_size() - s.size())
+         this->throw_length_error();
+      return this->replace(this->priv_addr() + pos, this->priv_addr() + pos + len, 
+                           s.begin(), s.end());
+   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with a substring of s.
+   basic_string& replace(size_type pos1, size_type n1,
+                         const basic_string& s,
+                         size_type pos2, size_type n2) 
+   {
+      if (pos1 > size() || pos2 > s.size())
+         this->throw_out_of_range();
+      const size_type len1 = containers_detail::min_value(n1, size() - pos1);
+      const size_type len2 = containers_detail::min_value(n2, s.size() - pos2);
+      if (this->size() - len1 >= this->max_size() - len2)
+         this->throw_length_error();
+      return this->replace(this->priv_addr() + pos1, this->priv_addr() + pos1 + len1,
+                     s.priv_addr() + pos2, s.priv_addr() + pos2 + len2);
+   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with the first n1 characters of s.
+   basic_string& replace(size_type pos, size_type n1,
+                        const CharT* s, size_type n2) 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      const size_type len = containers_detail::min_value(n1, size() - pos);
+      if (n2 > this->max_size() || size() - len >= this->max_size() - n2)
+         this->throw_length_error();
+      return this->replace(this->priv_addr() + pos, this->priv_addr() + pos + len,
+                     s, s + n2);
+   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with a null-terminated character array.
+   basic_string& replace(size_type pos, size_type n1,
+                        const CharT* s) 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      const size_type len = containers_detail::min_value(n1, size() - pos);
+      const size_type n2 = Traits::length(s);
+      if (n2 > this->max_size() || size() - len >= this->max_size() - n2)
+         this->throw_length_error();
+      return this->replace(this->priv_addr() + pos, this->priv_addr() + pos + len,
+                     s, s + Traits::length(s));
+   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with n1 copies of c.
+   basic_string& replace(size_type pos, size_type n1,
+                        size_type n2, CharT c) 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      const size_type len = containers_detail::min_value(n1, size() - pos);
+      if (n2 > this->max_size() || size() - len >= this->max_size() - n2)
+         this->throw_length_error();
+      return this->replace(this->priv_addr() + pos, this->priv_addr() + pos + len, n2, c);
+   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with the string s. 
+   basic_string& replace(iterator first, iterator last, 
+                        const basic_string& s) 
+   { return this->replace(first, last, s.begin(), s.end()); }
+
+   //! <b>Effects</b>: Replaces a substring of *this with the first n characters of s.
+   basic_string& replace(iterator first, iterator last,
+                        const CharT* s, size_type n) 
+   { return this->replace(first, last, s, s + n); }
+
+   //! <b>Effects</b>: Replaces a substring of *this with a null-terminated character array.
+   basic_string& replace(iterator first, iterator last,
+                        const CharT* s) 
+   {  return this->replace(first, last, s, s + Traits::length(s));   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with n copies of c. 
+   basic_string& replace(iterator first, iterator last, 
+                         size_type n, CharT c)
+   {
+      const size_type len = static_cast<size_type>(last - first);
+      if (len >= n) {
+         Traits::assign(containers_detail::get_pointer(first), n, c);
+         erase(first + n, last);
+      }
+      else {
+         Traits::assign(containers_detail::get_pointer(first), len, c);
+         insert(last, n - len, c);
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Replaces a substring of *this with the range [f, l)
+   template <class InputIter>
+   basic_string& replace(iterator first, iterator last,
+                        InputIter f, InputIter l) 
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InputIter, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      return this->priv_replace_dispatch(first, last, f, l,  Result());
+   }
+
+   //! <b>Effects</b>: Copies a substring of *this to a buffer.
+   size_type copy(CharT* s, size_type n, size_type pos = 0) const 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      const size_type len = containers_detail::min_value(n, size() - pos);
+      Traits::copy(s, containers_detail::get_pointer(this->priv_addr() + pos), len);
+      return len;
+   }
+
+   //! <b>Effects</b>: Swaps the contents of two strings. 
+   void swap(basic_string& x)
+   {  base_t::swap(x);  }
+
+   //! <b>Returns</b>: Returns a pointer to a null-terminated array of characters 
+   //!   representing the string's contents. For any string s it is guaranteed 
+   //!   that the first s.size() characters in the array pointed to by s.c_str() 
+   //!   are equal to the character in s, and that s.c_str()[s.size()] is a null 
+   //!   character. Note, however, that it not necessarily the first null character. 
+   //!   Characters within a string are permitted to be null. 
+   const CharT* c_str() const 
+   {  return containers_detail::get_pointer(this->priv_addr()); }
+
+   //! <b>Returns</b>: Returns a pointer to an array of characters, not necessarily
+   //!   null-terminated, representing the string's contents. data() is permitted,
+   //!   but not required, to be identical to c_str(). The first size() characters
+   //!   of that array are guaranteed to be identical to the characters in *this.
+   //!   The return value of data() is never a null pointer, even if size() is zero.
+   const CharT* data()  const 
+   {  return containers_detail::get_pointer(this->priv_addr()); }
+
+   //! <b>Effects</b>: Searches for s as a substring of *this, beginning at 
+   //!   character pos of *this.
+   size_type find(const basic_string& s, size_type pos = 0) const 
+   { return find(s.c_str(), pos, s.size()); }
+
+   //! <b>Effects</b>: Searches for a null-terminated character array as a
+   //!   substring of *this, beginning at character pos of *this.
+   size_type find(const CharT* s, size_type pos = 0) const 
+   { return find(s, pos, Traits::length(s)); }
+
+   //! <b>Effects</b>: Searches for the first n characters of s as a substring
+   //!   of *this, beginning at character pos of *this.
+   size_type find(const CharT* s, size_type pos, size_type n) const
+   {
+      if (pos + n > size())
+         return npos;
+      else {
+         pointer finish = this->priv_addr() + this->priv_size();
+         const const_iterator result =
+            std::search(containers_detail::get_pointer(this->priv_addr() + pos), 
+                   containers_detail::get_pointer(finish),
+                   s, s + n, Eq_traits<Traits>());
+         return result != finish ? result - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches for the character c, beginning at character
+   //!   position pos. 
+   size_type find(CharT c, size_type pos = 0) const
+   {
+      if (pos >= size())
+         return npos;
+      else {
+         pointer finish = this->priv_addr() + this->priv_size();
+         const const_iterator result =
+            std::find_if(this->priv_addr() + pos, finish,
+                  std::bind2nd(Eq_traits<Traits>(), c));
+         return result != finish ? result - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches backward for s as a substring of *this,
+   //!   beginning at character position min(pos, size())
+   size_type rfind(const basic_string& s, size_type pos = npos) const 
+      { return rfind(s.c_str(), pos, s.size()); }
+
+   //! <b>Effects</b>: Searches backward for a null-terminated character array
+   //!   as a substring of *this, beginning at character min(pos, size())
+   size_type rfind(const CharT* s, size_type pos = npos) const 
+      { return rfind(s, pos, Traits::length(s)); }
+
+   //! <b>Effects</b>: Searches backward for the first n characters of s as a
+   //!   substring of *this, beginning at character position min(pos, size()).
+   size_type rfind(const CharT* s, size_type pos, size_type n) const
+   {
+      const std::size_t len = size();
+
+      if (n > len)
+         return npos;
+      else if (n == 0)
+         return containers_detail::min_value(len, pos);
+      else {
+         const const_iterator last = begin() + containers_detail::min_value(len - n, pos) + n;
+         const const_iterator result = find_end(begin(), last,
+                                                s, s + n,
+                                                Eq_traits<Traits>());
+         return result != last ? result - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches backward for a null-terminated character array
+   //!   as a substring of *this, beginning at character min(pos, size()).
+   size_type rfind(CharT c, size_type pos = npos) const
+   {
+      const size_type len = size();
+
+      if (len < 1)
+         return npos;
+      else {
+         const const_iterator last = begin() + containers_detail::min_value(len - 1, pos) + 1;
+         const_reverse_iterator rresult =
+            std::find_if(const_reverse_iterator(last), rend(),
+                  std::bind2nd(Eq_traits<Traits>(), c));
+         return rresult != rend() ? (rresult.base() - 1) - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is equal to any character within s. 
+   size_type find_first_of(const basic_string& s, size_type pos = 0) const 
+      { return find_first_of(s.c_str(), pos, s.size()); }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is equal to any character within s. 
+   size_type find_first_of(const CharT* s, size_type pos = 0) const 
+      { return find_first_of(s, pos, Traits::length(s)); }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is equal to any character within the first n characters of s. 
+   size_type find_first_of(const CharT* s, size_type pos, 
+                           size_type n) const
+   {
+      if (pos >= size())
+         return npos;
+      else {
+         pointer finish = this->priv_addr() + this->priv_size();
+         const_iterator result = std::find_first_of(this->priv_addr() + pos, finish,
+                                                    s, s + n,
+                                                    Eq_traits<Traits>());
+         return result != finish ? result - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is equal to c. 
+  size_type find_first_of(CharT c, size_type pos = 0) const 
+    { return find(c, pos); }
+
+   //! <b>Effects</b>: Searches backward within *this, beginning at min(pos, size()),
+   //!   for the first character that is equal to any character within s.
+   size_type find_last_of(const basic_string& s,
+                           size_type pos = npos) const
+      { return find_last_of(s.c_str(), pos, s.size()); }
+
+   //! <b>Effects</b>: Searches backward *this, beginning at min(pos, size()), for
+   //!   the first character that is equal to any character within s. 
+   size_type find_last_of(const CharT* s, size_type pos = npos) const 
+      { return find_last_of(s, pos, Traits::length(s)); }
+
+   //! <b>Effects</b>: Searches backward within *this, beginning at min(pos, size()),
+   //!   for the first character that is equal to any character within the first n
+   //!   characters of s. 
+   size_type find_last_of(const CharT* s, size_type pos, size_type n) const
+   {
+      const size_type len = size();
+
+      if (len < 1)
+         return npos;
+      else {
+         const const_iterator last = this->priv_addr() + containers_detail::min_value(len - 1, pos) + 1;
+         const const_reverse_iterator rresult =
+            std::find_first_of(const_reverse_iterator(last), rend(),
+                               s, s + n,
+                               Eq_traits<Traits>());
+         return rresult != rend() ? (rresult.base() - 1) - this->priv_addr() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches backward *this, beginning at min(pos, size()), for
+   //!   the first character that is equal to c. 
+   size_type find_last_of(CharT c, size_type pos = npos) const 
+      {  return rfind(c, pos);   }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is not equal to any character within s. 
+   size_type find_first_not_of(const basic_string& s, 
+                              size_type pos = 0) const 
+      { return find_first_not_of(s.c_str(), pos, s.size()); }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is not equal to any character within s. 
+   size_type find_first_not_of(const CharT* s, size_type pos = 0) const 
+      { return find_first_not_of(s, pos, Traits::length(s)); }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is not equal to any character within the first n
+   //!   characters of s. 
+   size_type find_first_not_of(const CharT* s, size_type pos,
+                              size_type n) const
+   {
+      if (pos > size())
+         return npos;
+      else {
+         pointer finish = this->priv_addr() + this->priv_size();
+         const_iterator result = std::find_if(this->priv_addr() + pos, finish,
+                                    Not_within_traits<Traits>(s, s + n));
+         return result != finish ? result - this->priv_addr() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches within *this, beginning at pos, for the first
+   //!   character that is not equal to c.
+   size_type find_first_not_of(CharT c, size_type pos = 0) const
+   {
+      if (pos > size())
+         return npos;
+      else {
+         pointer finish = this->priv_addr() + this->priv_size();
+         const_iterator result
+            = std::find_if(this->priv_addr() + pos, finish,
+                     std::not1(std::bind2nd(Eq_traits<Traits>(), c)));
+         return result != finish ? result - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches backward within *this, beginning at min(pos, size()),
+   //!   for the first character that is not equal to any character within s. 
+   size_type find_last_not_of(const basic_string& s, 
+                              size_type pos = npos) const
+      { return find_last_not_of(s.c_str(), pos, s.size()); }
+
+   //! <b>Effects</b>: Searches backward *this, beginning at min(pos, size()),
+   //!   for the first character that is not equal to any character within s. 
+   size_type find_last_not_of(const CharT* s, size_type pos = npos) const
+      { return find_last_not_of(s, pos, Traits::length(s)); }
+
+   //! <b>Effects</b>: Searches backward within *this, beginning at min(pos, size()),
+   //!   for the first character that is not equal to any character within the first
+   //!   n characters of s. 
+   size_type find_last_not_of(const CharT* s, size_type pos, size_type n) const
+   {
+      const size_type len = size();
+
+      if (len < 1)
+         return npos;
+      else {
+         const const_iterator last = begin() + containers_detail::min_value(len - 1, pos) + 1;
+         const const_reverse_iterator rresult =
+            std::find_if(const_reverse_iterator(last), rend(),
+                    Not_within_traits<Traits>(s, s + n));
+         return rresult != rend() ? (rresult.base() - 1) - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Searches backward *this, beginning at min(pos, size()),
+   //!   for the first character that is not equal to c. 
+   size_type find_last_not_of(CharT c, size_type pos = npos) const
+   {
+      const size_type len = size();
+
+      if (len < 1)
+         return npos;
+      else {
+         const const_iterator last = begin() + containers_detail::min_value(len - 1, pos) + 1;
+         const_reverse_iterator rresult =
+            std::find_if(const_reverse_iterator(last), rend(),
+                  std::not1(std::bind2nd(Eq_traits<Traits>(), c)));
+         return rresult != rend() ? (rresult.base() - 1) - begin() : npos;
+      }
+   }
+
+   //! <b>Effects</b>: Returns a substring of *this.
+   basic_string substr(size_type pos = 0, size_type n = npos) const 
+   {
+      if (pos > size())
+         this->throw_out_of_range();
+      return basic_string(this->priv_addr() + pos, 
+                          this->priv_addr() + pos + containers_detail::min_value(n, size() - pos), this->alloc());
+   }
+
+   //! <b>Effects</b>: Three-way lexicographical comparison of s and *this.
+   int compare(const basic_string& s) const 
+   { return s_compare(this->priv_addr(), this->priv_addr() + this->priv_size(), s.priv_addr(), s.priv_addr() + s.priv_size()); }
+
+   //! <b>Effects</b>: Three-way lexicographical comparison of s and a substring
+   //!   of *this. 
+   int compare(size_type pos1, size_type n1, const basic_string& s) const 
+   {
+      if (pos1 > size())
+         this->throw_out_of_range();
+      return s_compare(this->priv_addr() + pos1, 
+                        this->priv_addr() + pos1 + containers_detail::min_value(n1, size() - pos1),
+                        s.priv_addr(), s.priv_addr() + s.priv_size());
+   }
+
+   //! <b>Effects</b>: Three-way lexicographical comparison of a substring of s
+   //!   and a substring of *this. 
+   int compare(size_type pos1, size_type n1,
+               const basic_string& s,
+               size_type pos2, size_type n2) const {
+      if (pos1 > size() || pos2 > s.size())
+      this->throw_out_of_range();
+      return s_compare(this->priv_addr() + pos1, 
+                        this->priv_addr() + pos1 + containers_detail::min_value(n1, size() - pos1),
+                        s.priv_addr() + pos2, 
+                        s.priv_addr() + pos2 + containers_detail::min_value(n2, size() - pos2));
+   }
+
+   //! <b>Effects</b>: Three-way lexicographical comparison of s and *this.
+   int compare(const CharT* s) const 
+   {  return s_compare(this->priv_addr(), this->priv_addr() + this->priv_size(), s, s + Traits::length(s));   }
+
+
+   //! <b>Effects</b>: Three-way lexicographical comparison of the first
+   //!   min(len, traits::length(s) characters of s and a substring of *this.
+   int compare(size_type pos1, size_type n1, const CharT* s,
+               size_type n2 = npos) const 
+   {
+      if (pos1 > size())
+         this->throw_out_of_range();
+      return s_compare(this->priv_addr() + pos1, 
+                        this->priv_addr() + pos1 + containers_detail::min_value(n1, size() - pos1),
+                        s, s + n2);
+   }
+
+   /// @cond
+   private:
+   static int s_compare(const_pointer f1, const_pointer l1,
+                        const_pointer f2, const_pointer l2) 
+   {
+      const std::ptrdiff_t n1 = l1 - f1;
+      const std::ptrdiff_t n2 = l2 - f2;
+      const int cmp = Traits::compare(containers_detail::get_pointer(f1), 
+                                      containers_detail::get_pointer(f2), 
+                                      containers_detail::min_value(n1, n2));
+      return cmp != 0 ? cmp : (n1 < n2 ? -1 : (n1 > n2 ? 1 : 0));
+   }
+
+   void priv_construct_null(pointer p)
+   {  this->construct(p, 0);  }
+
+   static CharT priv_null()
+   {  return (CharT) 0; }
+
+   // Helper functions used by constructors.  It is a severe error for
+   // any of them to be called anywhere except from within constructors.
+   void priv_terminate_string() 
+   {  this->priv_construct_null(this->priv_addr() + this->priv_size());  }
+
+   template <class InputIter>
+   void priv_range_initialize(InputIter f, InputIter l,
+                              std::input_iterator_tag)
+   {
+      this->allocate_initial_block(InternalBufferChars);
+      this->priv_construct_null(this->priv_addr() + this->priv_size());
+      this->append(f, l);
+   }
+
+   template <class ForwardIter>
+   void priv_range_initialize(ForwardIter f, ForwardIter l, 
+                              std::forward_iterator_tag)
+   {
+      difference_type n = std::distance(f, l);
+      this->allocate_initial_block(containers_detail::max_value<difference_type>(n+1, InternalBufferChars));
+      priv_uninitialized_copy(f, l, this->priv_addr());
+      this->priv_size(n);
+      this->priv_terminate_string();
+   }
+
+   template <class InputIter>
+   void priv_range_initialize(InputIter f, InputIter l)
+   {
+      typedef typename std::iterator_traits<InputIter>::iterator_category Category;
+      this->priv_range_initialize(f, l, Category());
+   }
+
+   template <class Integer>
+   void priv_initialize_dispatch(Integer n, Integer x, containers_detail::true_)
+   {
+      this->allocate_initial_block(containers_detail::max_value<difference_type>(n+1, InternalBufferChars));
+      priv_uninitialized_fill_n(this->priv_addr(), n, x);
+      this->priv_size(n);
+      this->priv_terminate_string();
+   }
+
+   template <class InputIter>
+   void priv_initialize_dispatch(InputIter f, InputIter l, containers_detail::false_)
+   {  this->priv_range_initialize(f, l);  }
+ 
+   template<class FwdIt, class Count> inline
+   void priv_uninitialized_fill_n(FwdIt first, Count count, const CharT val)
+   {
+      //Save initial position
+      FwdIt init = first;
+
+      BOOST_TRY{
+         //Construct objects
+         for (; count--; ++first){
+            this->construct(first, val);
+         }
+      }
+      BOOST_CATCH(...){
+         //Call destructors
+         for (; init != first; ++init){
+            this->destroy(init);
+         }
+         BOOST_RETHROW
+      }
+      BOOST_CATCH_END
+   }
+
+   template<class InpIt, class FwdIt> inline
+   size_type priv_uninitialized_copy(InpIt first, InpIt last, FwdIt dest)
+   {
+      //Save initial destination position
+      FwdIt dest_init = dest;
+      size_type constructed = 0;
+
+      BOOST_TRY{
+         //Try to build objects
+         for (; first != last; ++dest, ++first, ++constructed){
+            this->construct(dest, *first);
+         }
+      }
+      BOOST_CATCH(...){
+         //Call destructors
+         for (; constructed--; ++dest_init){
+            this->destroy(dest_init);
+         }
+         BOOST_RETHROW
+      }
+      BOOST_CATCH_END
+      return (constructed);
+   }
+
+   template <class Integer>
+   basic_string& priv_assign_dispatch(Integer n, Integer x, containers_detail::true_) 
+   {  return this->assign((size_type) n, (CharT) x);   }
+
+   template <class InputIter>
+   basic_string& priv_assign_dispatch(InputIter f, InputIter l,
+                                      containers_detail::false_)
+   {
+      size_type cur = 0;
+      CharT *ptr = containers_detail::get_pointer(this->priv_addr());
+      while (f != l && cur != this->priv_size()) {
+         Traits::assign(*ptr, *f);
+         ++f;
+         ++cur;
+         ++ptr;
+      }
+      if (f == l)
+         this->erase(this->priv_addr() + cur, this->priv_addr() + this->priv_size());
+      else
+         this->append(f, l);
+      return *this;
+   }
+
+   template <class InputIter>
+   void priv_insert(iterator p, InputIter first, InputIter last, std::input_iterator_tag)
+   {
+      for ( ; first != last; ++first, ++p) {
+         p = this->insert(p, *first);
+      }
+   }
+
+   template <class ForwardIter>
+   void priv_insert(iterator position, ForwardIter first, 
+                    ForwardIter last,  std::forward_iterator_tag)
+   {
+      if (first != last) {
+         size_type n = std::distance(first, last);
+         size_type remaining = this->capacity() - this->priv_size();
+         const size_type old_size = this->size();
+         pointer old_start = this->priv_addr();
+         bool enough_capacity = false;
+         std::pair<pointer, bool> allocation_ret;
+         size_type new_cap = 0;
+
+         //Check if we have enough capacity
+         if (remaining >= n){
+            enough_capacity = true;            
+         }
+         else {
+            //Otherwise expand current buffer or allocate new storage
+            new_cap  = this->next_capacity(n);
+            allocation_ret = this->allocation_command
+                  (allocate_new | expand_fwd | expand_bwd, old_size + n + 1, 
+                     new_cap, new_cap, old_start);
+
+            //Check forward expansion
+            if(old_start == allocation_ret.first){
+               enough_capacity = true;
+               this->priv_storage(new_cap);
+            }
+         }
+
+         //Reuse same buffer
+         if(enough_capacity){
+            const size_type elems_after =
+               this->priv_size() - (position - this->priv_addr());
+            size_type old_length = this->priv_size();
+            if (elems_after >= n) {
+               pointer pointer_past_last = this->priv_addr() + this->priv_size() + 1;
+               priv_uninitialized_copy(this->priv_addr() + (this->priv_size() - n + 1),
+                                       pointer_past_last, pointer_past_last);
+
+               this->priv_size(this->priv_size()+n);
+               Traits::move(containers_detail::get_pointer(position + n),
+                           containers_detail::get_pointer(position),
+                           (elems_after - n) + 1);
+               this->priv_copy(first, last, position);
+            }
+            else {
+               ForwardIter mid = first;
+               std::advance(mid, elems_after + 1);
+
+               priv_uninitialized_copy(mid, last, this->priv_addr() + this->priv_size() + 1);
+               this->priv_size(this->priv_size() + (n - elems_after));
+               priv_uninitialized_copy
+                  (position, this->priv_addr() + old_length + 1, 
+                  this->priv_addr() + this->priv_size());
+               this->priv_size(this->priv_size() + elems_after);
+               this->priv_copy(first, mid, position);
+            }
+         }
+         else{
+            pointer new_start = allocation_ret.first;
+            if(!allocation_ret.second){
+               //Copy data to new buffer
+               size_type new_length = 0;
+               //This can't throw, since characters are POD
+               new_length += priv_uninitialized_copy
+                              (this->priv_addr(), position, new_start);
+               new_length += priv_uninitialized_copy
+                              (first, last, new_start + new_length);
+               new_length += priv_uninitialized_copy
+                              (position, this->priv_addr() + this->priv_size(), 
+                              new_start + new_length);
+               this->priv_construct_null(new_start + new_length);
+
+               this->deallocate_block();
+               this->is_short(false);
+               this->priv_addr(new_start);
+               this->priv_size(new_length);
+               this->priv_storage(new_cap);
+            }
+            else{
+               //value_type is POD, so backwards expansion is much easier 
+               //than with vector<T>
+               value_type *oldbuf = containers_detail::get_pointer(old_start);
+               value_type *newbuf = containers_detail::get_pointer(new_start);
+               value_type *pos    = containers_detail::get_pointer(position);
+               size_type  before  = pos - oldbuf;
+
+               //First move old data
+               Traits::move(newbuf, oldbuf, before);
+               Traits::move(newbuf + before + n, pos, old_size - before);
+               //Now initialize the new data
+               priv_uninitialized_copy(first, last, new_start + before);
+               this->priv_construct_null(new_start + (old_size + n));
+               this->is_short(false);
+               this->priv_addr(new_start);
+               this->priv_size(old_size + n);
+               this->priv_storage(new_cap);
+            }
+         }
+      }
+   }
+
+   template <class Integer>
+   void priv_insert_dispatch(iterator p, Integer n, Integer x,
+                           containers_detail::true_) 
+   {  insert(p, (size_type) n, (CharT) x);   }
+
+   template <class InputIter>
+   void priv_insert_dispatch(iterator p, InputIter first, InputIter last,
+                           containers_detail::false_) 
+   {
+      typedef typename std::iterator_traits<InputIter>::iterator_category Category;
+      priv_insert(p, first, last, Category());
+   }
+
+   template <class InputIterator>
+   void priv_copy(InputIterator first, InputIterator last, iterator result)
+   {
+      for ( ; first != last; ++first, ++result)
+         Traits::assign(*result, *first);
+   }
+
+   void priv_copy(const CharT* first, const CharT* last, CharT* result) 
+   {  Traits::copy(result, first, last - first);  }
+
+   template <class Integer>
+   basic_string& priv_replace_dispatch(iterator first, iterator last,
+                                       Integer n, Integer x,
+                                       containers_detail::true_) 
+   {  return this->replace(first, last, (size_type) n, (CharT) x);   }
+
+   template <class InputIter>
+   basic_string& priv_replace_dispatch(iterator first, iterator last,
+                                       InputIter f, InputIter l,
+                                       containers_detail::false_) 
+   {
+      typedef typename std::iterator_traits<InputIter>::iterator_category Category;
+      return this->priv_replace(first, last, f, l, Category());
+   }
+
+
+   template <class InputIter>
+   basic_string& priv_replace(iterator first, iterator last,
+                              InputIter f, InputIter l, std::input_iterator_tag)
+   {
+      for ( ; first != last && f != l; ++first, ++f)
+         Traits::assign(*first, *f);
+
+      if (f == l)
+         this->erase(first, last);
+      else
+         this->insert(last, f, l);
+      return *this;
+   }
+
+   template <class ForwardIter>
+   basic_string& priv_replace(iterator first, iterator last,
+                              ForwardIter f, ForwardIter l, 
+                              std::forward_iterator_tag)
+   {
+      difference_type n = std::distance(f, l);
+      const difference_type len = last - first;
+      if (len >= n) {
+         this->priv_copy(f, l, first);
+        this->erase(first + n, last);
+      }
+      else {
+         ForwardIter m = f;
+         std::advance(m, len);
+         this->priv_copy(f, m, first);
+         this->insert(last, m, l);
+      }
+      return *this;
+   }
+   /// @endcond
+};
+
+/// @cond
+
+template <class CharT, class Traits, class A> 
+const typename basic_string<CharT,Traits,A>::size_type 
+basic_string<CharT,Traits,A>::npos 
+  = (typename basic_string<CharT,Traits,A>::size_type) -1;
+
+/// @endcond
+
+// ------------------------------------------------------------
+// Non-member functions.
+
+// Operator+
+
+template <class CharT, class Traits, class A>
+inline basic_string<CharT,Traits,A>
+operator+(const basic_string<CharT,Traits,A>& x,
+          const basic_string<CharT,Traits,A>& y)
+{
+   typedef basic_string<CharT,Traits,A> str_t;
+   typedef typename str_t::reserve_t reserve_t;
+   reserve_t reserve;
+   str_t result(reserve, x.size() + y.size(), x.alloc());
+   result.append(x);
+   result.append(y);
+   return result;
+}
+
+template <class CharT, class Traits, class A> inline
+BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A)
+   operator+(
+   BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A) mx
+   , const basic_string<CharT,Traits,A>& y)
+{
+   mx += y;
+   return boost::move(mx);
+}
+
+template <class CharT, class Traits, class A> inline
+BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A)
+   operator+(const basic_string<CharT,Traits,A>& x,
+         BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A) my)
+{
+   typedef typename basic_string<CharT,Traits,A>::size_type size_type;
+   return my.replace(size_type(0), size_type(0), x);
+}
+
+template <class CharT, class Traits, class A>
+inline basic_string<CharT,Traits,A>
+operator+(const CharT* s, const basic_string<CharT,Traits,A>& y) 
+{
+   typedef basic_string<CharT,Traits,A> str_t;
+   typedef typename str_t::reserve_t reserve_t;
+   reserve_t reserve;
+   const std::size_t n = Traits::length(s);
+   str_t result(reserve, n + y.size());
+   result.append(s, s + n);
+   result.append(y);
+   return result;
+}
+
+template <class CharT, class Traits, class A> inline
+BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A)
+operator+(const CharT* s,
+         BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A) my)
+{
+   typedef typename basic_string<CharT,Traits,A>::size_type size_type;
+   return boost::move(my.get().replace(size_type(0), size_type(0), s));
+}
+
+template <class CharT, class Traits, class A>
+inline basic_string<CharT,Traits,A>
+operator+(CharT c, const basic_string<CharT,Traits,A>& y) 
+{
+   typedef basic_string<CharT,Traits,A> str_t;
+   typedef typename str_t::reserve_t reserve_t;
+   reserve_t reserve;
+   str_t result(reserve, 1 + y.size());
+   result.push_back(c);
+   result.append(y);
+   return result;
+}
+
+template <class CharT, class Traits, class A> inline
+BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A)
+operator+(CharT c,
+         BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A) my)
+{
+   typedef typename basic_string<CharT,Traits,A>::size_type size_type;
+   return my.replace(size_type(0), size_type(0), &c, &c + 1);
+}
+
+template <class CharT, class Traits, class A>
+inline basic_string<CharT,Traits,A>
+operator+(const basic_string<CharT,Traits,A>& x, const CharT* s) 
+{
+   typedef basic_string<CharT,Traits,A> str_t;
+   typedef typename str_t::reserve_t reserve_t;
+   reserve_t reserve;
+   const std::size_t n = Traits::length(s);
+   str_t result(reserve, x.size() + n, x.alloc());
+   result.append(x);
+   result.append(s, s + n);
+   return result;
+}
+
+template <class CharT, class Traits, class A>
+BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A)
+operator+(BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A) mx
+         , const CharT* s)
+{
+   mx += s;
+   return boost::move(mx);
+}
+
+template <class CharT, class Traits, class A>
+inline basic_string<CharT,Traits,A>
+operator+(const basic_string<CharT,Traits,A>& x, const CharT c) 
+{
+  typedef basic_string<CharT,Traits,A> str_t;
+  typedef typename str_t::reserve_t reserve_t;
+   reserve_t reserve;
+   str_t result(reserve, x.size() + 1, x.alloc());
+   result.append(x);
+   result.push_back(c);
+   return result;
+}
+
+template <class CharT, class Traits, class A>
+BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A)
+operator+( BOOST_RV_REF_3_TEMPL_ARGS(basic_string, CharT, Traits, A) mx
+         , const CharT c)
+{
+   mx += c;
+   return boost::move(mx);
+}
+
+// Operator== and operator!=
+
+template <class CharT, class Traits, class A>
+inline bool
+operator==(const basic_string<CharT,Traits,A>& x,
+           const basic_string<CharT,Traits,A>& y) 
+{
+   return x.size() == y.size() &&
+          Traits::compare(x.data(), y.data(), x.size()) == 0;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator==(const CharT* s, const basic_string<CharT,Traits,A>& y) 
+{
+   std::size_t n = Traits::length(s);
+   return n == y.size() && Traits::compare(s, y.data(), n) == 0;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator==(const basic_string<CharT,Traits,A>& x, const CharT* s) 
+{
+   std::size_t n = Traits::length(s);
+   return x.size() == n && Traits::compare(x.data(), s, n) == 0;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator!=(const basic_string<CharT,Traits,A>& x,
+           const basic_string<CharT,Traits,A>& y) 
+   {  return !(x == y);  }
+
+template <class CharT, class Traits, class A>
+inline bool
+operator!=(const CharT* s, const basic_string<CharT,Traits,A>& y) 
+   {  return !(s == y); }
+
+template <class CharT, class Traits, class A>
+inline bool
+operator!=(const basic_string<CharT,Traits,A>& x, const CharT* s) 
+   {  return !(x == s);   }
+
+
+// Operator< (and also >, <=, and >=).
+
+template <class CharT, class Traits, class A>
+inline bool
+operator<(const basic_string<CharT,Traits,A>& x, const basic_string<CharT,Traits,A>& y) 
+{
+   return x.compare(y) < 0;
+//   return basic_string<CharT,Traits,A>
+//      ::s_compare(x.begin(), x.end(), y.begin(), y.end()) < 0;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator<(const CharT* s, const basic_string<CharT,Traits,A>& y) 
+{
+   return y.compare(s) > 0;
+//   std::size_t n = Traits::length(s);
+//   return basic_string<CharT,Traits,A>
+//          ::s_compare(s, s + n, y.begin(), y.end()) < 0;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator<(const basic_string<CharT,Traits,A>& x,
+          const CharT* s) 
+{
+   return x.compare(s) < 0;
+//   std::size_t n = Traits::length(s);
+//   return basic_string<CharT,Traits,A>
+//      ::s_compare(x.begin(), x.end(), s, s + n) < 0;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator>(const basic_string<CharT,Traits,A>& x,
+          const basic_string<CharT,Traits,A>& y) {
+   return y < x;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator>(const CharT* s, const basic_string<CharT,Traits,A>& y) {
+   return y < s;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator>(const basic_string<CharT,Traits,A>& x, const CharT* s) 
+{
+   return s < x;
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator<=(const basic_string<CharT,Traits,A>& x,
+           const basic_string<CharT,Traits,A>& y) 
+{
+  return !(y < x);
+}
+
+template <class CharT, class Traits, class A>
+inline bool
+operator<=(const CharT* s, const basic_string<CharT,Traits,A>& y) 
+   {  return !(y < s);  }
+
+template <class CharT, class Traits, class A>
+inline bool
+operator<=(const basic_string<CharT,Traits,A>& x, const CharT* s) 
+   {  return !(s < x);  }
+
+template <class CharT, class Traits, class A>
+inline bool
+operator>=(const basic_string<CharT,Traits,A>& x,
+           const basic_string<CharT,Traits,A>& y) 
+   {  return !(x < y);  }
+
+template <class CharT, class Traits, class A>
+inline bool
+operator>=(const CharT* s, const basic_string<CharT,Traits,A>& y) 
+   {  return !(s < y);  }
+
+template <class CharT, class Traits, class A>
+inline bool
+operator>=(const basic_string<CharT,Traits,A>& x, const CharT* s) 
+   {  return !(x < s);  }
+
+// Swap.
+template <class CharT, class Traits, class A>
+inline void swap(basic_string<CharT,Traits,A>& x, basic_string<CharT,Traits,A>& y) 
+{  x.swap(y);  }
+
+/// @cond
+// I/O.  
+namespace containers_detail {
+
+template <class CharT, class Traits>
+inline bool
+string_fill(std::basic_ostream<CharT, Traits>& os,
+                  std::basic_streambuf<CharT, Traits>* buf,
+                  std::size_t n)
+{
+   CharT f = os.fill();
+   std::size_t i;
+   bool ok = true;
+
+   for (i = 0; i < n; i++)
+      ok = ok && !Traits::eq_int_type(buf->sputc(f), Traits::eof());
+   return ok;
+}
+
+}  //namespace containers_detail {
+/// @endcond
+
+template <class CharT, class Traits, class A>
+std::basic_ostream<CharT, Traits>&
+operator<<(std::basic_ostream<CharT, Traits>& os, const basic_string<CharT,Traits,A>& s)
+{
+   typename std::basic_ostream<CharT, Traits>::sentry sentry(os);
+   bool ok = false;
+
+   if (sentry) {
+      ok = true;
+      std::size_t n = s.size();
+      std::size_t pad_len = 0;
+      const bool left = (os.flags() & std::ios::left) != 0;
+      const std::size_t w = os.width(0);
+      std::basic_streambuf<CharT, Traits>* buf = os.rdbuf();
+
+      if (w != 0 && n < w)
+         pad_len = w - n;
+       
+      if (!left)
+         ok = containers_detail::string_fill(os, buf, pad_len);    
+
+      ok = ok && 
+            buf->sputn(s.data(), std::streamsize(n)) == std::streamsize(n);
+
+      if (left)
+         ok = ok && containers_detail::string_fill(os, buf, pad_len);
+   }
+
+   if (!ok)
+      os.setstate(std::ios_base::failbit);
+
+   return os;
+}
+
+
+template <class CharT, class Traits, class A>
+std::basic_istream<CharT, Traits>& 
+operator>>(std::basic_istream<CharT, Traits>& is, basic_string<CharT,Traits,A>& s)
+{
+   typename std::basic_istream<CharT, Traits>::sentry sentry(is);
+
+   if (sentry) {
+      std::basic_streambuf<CharT, Traits>* buf = is.rdbuf();
+      const std::ctype<CharT>& ctype = std::use_facet<std::ctype<CharT> >(is.getloc());
+
+      s.clear();
+      std::size_t n = is.width(0);
+      if (n == 0)
+         n = static_cast<std::size_t>(-1);
+      else
+         s.reserve(n);
+
+      while (n-- > 0) {
+         typename Traits::int_type c1 = buf->sbumpc();
+
+         if (Traits::eq_int_type(c1, Traits::eof())) {
+            is.setstate(std::ios_base::eofbit);
+            break;
+         }
+         else {
+            CharT c = Traits::to_char_type(c1);
+
+            if (ctype.is(std::ctype<CharT>::space, c)) {
+               if (Traits::eq_int_type(buf->sputbackc(c), Traits::eof()))
+                  is.setstate(std::ios_base::failbit);
+               break;
+            }
+            else
+               s.push_back(c);
+         }
+      }
+      
+      // If we have read no characters, then set failbit.
+      if (s.size() == 0)
+         is.setstate(std::ios_base::failbit);
+   }
+   else
+      is.setstate(std::ios_base::failbit);
+
+   return is;
+}
+
+template <class CharT, class Traits, class A>    
+std::basic_istream<CharT, Traits>& 
+getline(std::istream& is, basic_string<CharT,Traits,A>& s,CharT delim)
+{
+   std::size_t nread = 0;
+   typename std::basic_istream<CharT, Traits>::sentry sentry(is, true);
+   if (sentry) {
+      std::basic_streambuf<CharT, Traits>* buf = is.rdbuf();
+      s.clear();
+
+      int c1;
+      while (nread < s.max_size()) {
+         int c1 = buf->sbumpc();
+         if (Traits::eq_int_type(c1, Traits::eof())) {
+            is.setstate(std::ios_base::eofbit);
+            break;
+         }
+         else {
+            ++nread;
+            CharT c = Traits::to_char_type(c1);
+            if (!Traits::eq(c, delim)) 
+               s.push_back(c);
+            else
+               break;              // Character is extracted but not appended.
+         }
+      }
+   }
+   if (nread == 0 || nread >= s.max_size())
+      is.setstate(std::ios_base::failbit);
+
+   return is;
+}
+
+template <class CharT, class Traits, class A>    
+inline std::basic_istream<CharT, Traits>& 
+getline(std::basic_istream<CharT, Traits>& is, basic_string<CharT,Traits,A>& s)
+{
+   return getline(is, s, '\n');
+}
+
+template <class Ch, class A>
+inline std::size_t hash_value(basic_string<Ch, std::char_traits<Ch>, A> const& v)
+{
+   return hash_range(v.begin(), v.end());
+}
+
+}}
+
+/// @cond
+
+namespace boost {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class C, class T, class A>
+struct has_trivial_destructor_after_move<boost::container::basic_string<C, T, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value;
+};
+
+}
+
+/// @endcond
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif // BOOST_CONTAINERS_STRING_HPP
Added: sandbox/move/boost/container/vector.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/container/vector.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,1932 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2005-2008. 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/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This file comes from SGI's stl_vector.h file. Modified by Ion Gaztanaga.
+// Renaming, isolating and porting to generic algorithms. Pointer typedef 
+// set to allocator::pointer to allow placing it in shared memory.
+//
+///////////////////////////////////////////////////////////////////////////////
+// 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.
+
+#ifndef BOOST_CONTAINERS_CONTAINERS_VECTOR_HPP
+#define BOOST_CONTAINERS_CONTAINERS_VECTOR_HPP
+
+#if (defined _MSC_VER) && (_MSC_VER >= 1200)
+#  pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <cstddef>
+#include <memory>
+#include <algorithm>
+#include <stdexcept>
+#include <iterator>
+#include <utility>
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/has_trivial_assign.hpp>
+#include <boost/type_traits/has_nothrow_copy.hpp>
+#include <boost/type_traits/has_nothrow_assign.hpp>
+#include <boost/container/detail/version_type.hpp>
+#include <boost/container/detail/allocation_type.hpp>
+#include <boost/container/detail/utilities.hpp>
+#include <boost/container/detail/iterators.hpp>
+#include <boost/container/detail/algorithms.hpp>
+#include <boost/container/detail/destroyers.hpp>
+#include <boost/container/containers_fwd.hpp>
+#include <boost/move/move.hpp>
+#include <boost/pointer_to_other.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/advanced_insert_int.hpp>
+
+#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+namespace boost {
+namespace container {
+#else
+namespace boost {
+namespace container {
+#endif
+
+/// @cond
+
+namespace containers_detail {
+
+//! Const vector_iterator used to iterate through a vector. 
+template <class Pointer>
+class vector_const_iterator
+   : public std::iterator<std::random_access_iterator_tag
+                          ,const typename std::iterator_traits<Pointer>::value_type
+                          ,typename std::iterator_traits<Pointer>::difference_type
+                          ,typename boost::pointer_to_other
+                              <Pointer
+                              ,const typename std::iterator_traits<Pointer>::value_type
+                              >::type
+                          ,const typename std::iterator_traits<Pointer>::value_type &>
+{
+   public:
+   typedef const typename std::iterator_traits<Pointer>::value_type  value_type;
+   typedef typename std::iterator_traits<Pointer>::difference_type   difference_type;
+   typedef typename boost::pointer_to_other<Pointer, value_type>::type      pointer;
+   typedef value_type&                                               reference;
+
+   /// @cond
+   protected:
+   Pointer m_ptr;
+
+   public:
+   Pointer get_ptr() const    {  return   m_ptr;  }
+   explicit vector_const_iterator(Pointer ptr)  : m_ptr(ptr){}
+   /// @endcond
+
+   public:
+
+   //Constructors
+   vector_const_iterator() : m_ptr(0){}
+
+   //Pointer like operators
+   reference operator*()   const  
+   {  return *m_ptr;  }
+
+   const value_type * operator->()  const  
+   {  return  containers_detail::get_pointer(m_ptr);  }
+
+   reference operator[](difference_type off) const
+   {  return m_ptr[off];   }
+
+   //Increment / Decrement
+   vector_const_iterator& operator++()       
+   { ++m_ptr;  return *this; }
+
+   vector_const_iterator operator++(int)      
+   {  Pointer tmp = m_ptr; ++*this; return vector_const_iterator(tmp);  }
+
+   vector_const_iterator& operator--()
+   {  --m_ptr; return *this;  }
+
+   vector_const_iterator operator--(int)
+   {  Pointer tmp = m_ptr; --*this; return vector_const_iterator(tmp); }
+
+   //Arithmetic
+   vector_const_iterator& operator+=(difference_type off)
+   {  m_ptr += off; return *this;   }
+
+   vector_const_iterator operator+(difference_type off) const
+   {  return vector_const_iterator(m_ptr+off);  }
+
+   friend vector_const_iterator operator+(difference_type off, const vector_const_iterator& right)
+   {  return vector_const_iterator(off + right.m_ptr); }
+
+   vector_const_iterator& operator-=(difference_type off)
+   {  m_ptr -= off; return *this;   }
+
+   vector_const_iterator operator-(difference_type off) const
+   {  return vector_const_iterator(m_ptr-off);  }
+
+   difference_type operator-(const vector_const_iterator& right) const
+   {  return m_ptr - right.m_ptr;   }
+
+   //Comparison operators
+   bool operator==   (const vector_const_iterator& r)  const
+   {  return m_ptr == r.m_ptr;  }
+
+   bool operator!=   (const vector_const_iterator& r)  const
+   {  return m_ptr != r.m_ptr;  }
+
+   bool operator<    (const vector_const_iterator& r)  const
+   {  return m_ptr < r.m_ptr;  }
+
+   bool operator<=   (const vector_const_iterator& r)  const
+   {  return m_ptr <= r.m_ptr;  }
+
+   bool operator>    (const vector_const_iterator& r)  const
+   {  return m_ptr > r.m_ptr;  }
+
+   bool operator>=   (const vector_const_iterator& r)  const
+   {  return m_ptr >= r.m_ptr;  }
+};
+
+//! Iterator used to iterate through a vector
+template <class Pointer>
+class vector_iterator
+   :  public vector_const_iterator<Pointer>
+{
+   public:
+   explicit vector_iterator(Pointer ptr)
+      : vector_const_iterator<Pointer>(ptr)
+   {}
+
+   public:
+   typedef typename std::iterator_traits<Pointer>::value_type        value_type;
+   typedef typename vector_const_iterator<Pointer>::difference_type  difference_type;
+   typedef Pointer                                                   pointer;
+   typedef value_type&                                               reference;
+
+   //Constructors
+   vector_iterator()
+   {}
+
+   //Pointer like operators
+   reference operator*()  const  
+   {  return *this->m_ptr;  }
+
+   value_type* operator->() const  
+   {  return  containers_detail::get_pointer(this->m_ptr);  }
+
+   reference operator[](difference_type off) const 
+   {  return this->m_ptr[off];   }
+
+   //Increment / Decrement
+   vector_iterator& operator++()  
+   {  ++this->m_ptr; return *this;  }
+
+   vector_iterator operator++(int)
+   {  pointer tmp = this->m_ptr; ++*this; return vector_iterator(tmp);  }
+   
+   vector_iterator& operator--()
+   {  --this->m_ptr; return *this;  }
+
+   vector_iterator operator--(int)
+   {  vector_iterator tmp = *this; --*this; return vector_iterator(tmp); }
+
+   // Arithmetic
+   vector_iterator& operator+=(difference_type off)
+   {  this->m_ptr += off;  return *this;  }
+
+   vector_iterator operator+(difference_type off) const
+   {  return vector_iterator(this->m_ptr+off);  }
+
+   friend vector_iterator operator+(difference_type off, const vector_iterator& right)
+   {  return vector_iterator(off + right.m_ptr); }
+
+   vector_iterator& operator-=(difference_type off)
+   {  this->m_ptr -= off; return *this;   }
+
+   vector_iterator operator-(difference_type off) const
+   {  return vector_iterator(this->m_ptr-off);  }
+
+   difference_type operator-(const vector_const_iterator<Pointer>& right) const
+   {  return static_cast<const vector_const_iterator<Pointer>&>(*this) - right;   }
+};
+
+template <class T, class A>
+struct vector_value_traits
+{
+   typedef T value_type;
+   typedef A allocator_type;
+   static const bool trivial_dctr = boost::has_trivial_destructor<value_type>::value;
+   static const bool trivial_dctr_after_move = 
+      boost::has_trivial_destructor_after_move<value_type>::value || trivial_dctr;
+   static const bool trivial_copy = has_trivial_copy<value_type>::value;
+   static const bool nothrow_copy = has_nothrow_copy<value_type>::value;
+   static const bool trivial_assign = has_trivial_assign<value_type>::value;
+   static const bool nothrow_assign = has_nothrow_assign<value_type>::value;
+
+   //This is the anti-exception array destructor
+   //to deallocate values already constructed
+   typedef typename containers_detail::if_c
+      <trivial_dctr
+      ,containers_detail::null_scoped_destructor_n<allocator_type>
+      ,containers_detail::scoped_destructor_n<allocator_type>
+      >::type   OldArrayDestructor;
+   //This is the anti-exception array destructor
+   //to destroy objects created with copy construction
+   typedef typename containers_detail::if_c
+      <nothrow_copy
+      ,containers_detail::null_scoped_destructor_n<allocator_type>
+      ,containers_detail::scoped_destructor_n<allocator_type>
+      >::type   UCopiedArrayDestructor;
+   //This is the anti-exception array deallocator
+   typedef typename containers_detail::if_c
+      <nothrow_copy
+      ,containers_detail::null_scoped_array_deallocator<allocator_type>
+      ,containers_detail::scoped_array_deallocator<allocator_type>
+      >::type   UCopiedArrayDeallocator;
+};
+
+//!This struct deallocates and allocated memory
+template <class A>
+struct vector_alloc_holder 
+{
+   typedef typename A::pointer      pointer;
+   typedef typename A::size_type    size_type;
+   typedef typename A::value_type   value_type;
+   typedef vector_value_traits<value_type, A> value_traits;
+
+   //Constructor, does not throw
+   vector_alloc_holder(const A &a)
+      : members_(a)
+   {}
+
+   //Constructor, does not throw
+   vector_alloc_holder(const vector_alloc_holder<A> &h)
+      : members_(h.alloc())
+   {}
+
+   //Destructor
+   ~vector_alloc_holder()
+   {
+      this->prot_destroy_all();
+      this->prot_deallocate();
+   }
+
+   typedef containers_detail::integral_constant<unsigned, 1>      allocator_v1;
+   typedef containers_detail::integral_constant<unsigned, 2>      allocator_v2;
+   typedef containers_detail::integral_constant<unsigned,
+      boost::container::containers_detail::version<A>::value> alloc_version;
+   std::pair<pointer, bool>
+      allocation_command(allocation_type command,
+                         size_type limit_size, 
+                         size_type preferred_size,
+                         size_type &received_size, const pointer &reuse = 0)
+   {
+      return allocation_command(command, limit_size, preferred_size,
+                               received_size, reuse, alloc_version());
+   }
+
+   std::pair<pointer, bool>
+      allocation_command(allocation_type command,
+                         size_type limit_size, 
+                         size_type preferred_size,
+                         size_type &received_size,
+                         const pointer &reuse,
+                         allocator_v1)
+   {
+      (void)limit_size;
+      (void)reuse;
+      if(!(command & allocate_new))
+         return std::pair<pointer, bool>(pointer(0), 0);
+      received_size = preferred_size;
+      return std::make_pair(this->alloc().allocate(received_size), false);
+   }
+
+   std::pair<pointer, bool>
+      allocation_command(allocation_type command,
+                         size_type limit_size, 
+                         size_type preferred_size,
+                         size_type &received_size,
+                         const pointer &reuse,
+                         allocator_v2)
+   {
+      return this->alloc().allocation_command
+         (command, limit_size, preferred_size, received_size, reuse);
+   }
+
+   size_type next_capacity(size_type additional_objects) const
+   {  return get_next_capacity(this->alloc().max_size(), this->members_.m_capacity, additional_objects);  }
+
+   struct members_holder
+      : public A
+   {
+      private:
+      members_holder(const members_holder&);
+
+      public:
+      members_holder(const A &alloc)
+         :  A(alloc), m_start(0), m_size(0), m_capacity(0)
+      {}
+
+      pointer     m_start;
+      size_type   m_size;
+      size_type   m_capacity;
+   } members_;
+
+   protected:
+   void prot_deallocate()
+   {
+      if(!this->members_.m_capacity)   return;
+      this->alloc().deallocate(this->members_.m_start, this->members_.m_capacity);
+      this->members_.m_start     = 0;
+      this->members_.m_size      = 0;
+      this->members_.m_capacity  = 0;
+   }
+
+   void destroy(value_type* p)
+   {
+      if(!value_traits::trivial_dctr)
+         containers_detail::get_pointer(p)->~value_type();
+   }
+
+   void destroy_n(value_type* p, size_type n)
+   {
+      if(!value_traits::trivial_dctr)
+         for(; n--; ++p)   p->~value_type();
+   }
+
+   void prot_destroy_all()
+   {
+      this->destroy_n(containers_detail::get_pointer(this->members_.m_start), this->members_.m_size);
+      this->members_.m_size = 0;
+   }
+
+   A &alloc()
+   {  return members_;  }
+
+   const A &alloc() const
+   {  return members_;  }
+};
+
+}  //namespace containers_detail {
+/// @endcond
+
+//! \class vector
+//! A vector is a sequence that supports random access to elements, constant 
+//! time insertion and removal of elements at the end, and linear time insertion 
+//! and removal of elements at the beginning or in the middle. The number of 
+//! elements in a vector may vary dynamically; memory management is automatic.
+//! boost::container::vector is similar to std::vector but it's compatible
+//! with shared memory and memory mapped files.
+template <class T, class A>
+class vector : private containers_detail::vector_alloc_holder<A>
+{
+   /// @cond
+   typedef vector<T, A>                   self_t;
+   typedef containers_detail::vector_alloc_holder<A> base_t;
+   /// @endcond
+   public:
+   //! The type of object, T, stored in the vector
+   typedef T                                       value_type;
+   //! Pointer to T
+   typedef typename A::pointer                     pointer;
+   //! Const pointer to T
+   typedef typename A::const_pointer               const_pointer;
+   //! Reference to T
+   typedef typename A::reference                   reference;
+   //! Const reference to T
+   typedef typename A::const_reference             const_reference;
+   //! An unsigned integral type
+   typedef typename A::size_type                   size_type;
+   //! A signed integral type
+   typedef typename A::difference_type             difference_type;
+   //! The allocator type
+   typedef A                                       allocator_type;
+   //! The random access iterator
+   typedef containers_detail::vector_iterator<pointer>        iterator;
+   //! The random access const_iterator
+   typedef containers_detail::vector_const_iterator<pointer>  const_iterator;
+
+   //! Iterator used to iterate backwards through a vector. 
+   typedef std::reverse_iterator<iterator>   
+      reverse_iterator;
+   //! Const iterator used to iterate backwards through a vector. 
+   typedef std::reverse_iterator<const_iterator>                 
+      const_reverse_iterator;
+   //! The stored allocator type
+   typedef allocator_type                          stored_allocator_type;
+
+   /// @cond
+   private:
+   typedef containers_detail::advanced_insert_aux_int<T, T*>    advanced_insert_aux_int_t;
+   typedef containers_detail::vector_value_traits<value_type, A> value_traits;
+
+   typedef typename base_t::allocator_v1           allocator_v1;
+   typedef typename base_t::allocator_v2           allocator_v2;
+   typedef typename base_t::alloc_version          alloc_version;
+
+   typedef constant_iterator<T, difference_type>   cvalue_iterator;
+   typedef repeat_iterator<T, difference_type>     repeat_it;
+   typedef boost::move_iterator<repeat_it>         repeat_move_it;
+   /// @endcond
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(vector)
+
+   //! <b>Effects</b>: Constructs a vector taking the allocator as parameter.
+   //! 
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   explicit vector(const A& a = A())
+      : base_t(a)
+   {}
+
+   //! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
+   //!   and inserts n default contructed values.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's default or copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Linear to n.
+   vector(size_type n) 
+      :  base_t(allocator_type())
+   {  this->resize(n); }
+
+   //! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
+   //!   and inserts n copies of value.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's default or copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Linear to n.
+   vector(size_type n, const T& value, const allocator_type& a = allocator_type()) 
+      :  base_t(a)
+   {  this->insert(this->cend(), n, value); }
+
+   //! <b>Effects</b>: Copy constructs a vector.
+   //!
+   //! <b>Postcondition</b>: x == *this.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements x contains.
+   vector(const vector<T, A>& x) 
+      :  base_t((base_t&)x)
+   {  *this = x;  }
+
+   //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
+   //!
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   vector(BOOST_RV_REF(vector) mx) 
+      :  base_t(boost::move(mx))
+   {  this->swap(mx);   }
+
+   //! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
+   //!   and inserts a copy of the range [first, last) in the vector.
+   //!
+   //! <b>Throws</b>: If allocator_type's default constructor or copy constructor
+   //!   throws or T's constructor taking an dereferenced InIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to the range [first, last).
+   template <class InIt>
+   vector(InIt first, InIt last, const allocator_type& a = allocator_type())
+      :  base_t(a)
+   {  this->assign(first, last); }
+
+   //! <b>Effects</b>: Destroys the vector. All stored values are destroyed
+   //!   and used memory is deallocated.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements.
+   ~vector() 
+   {} //vector_alloc_holder clears the data
+
+   //! <b>Effects</b>: Returns an iterator to the first element contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator begin()      
+   { return iterator(this->members_.m_start); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator begin() const
+   { return const_iterator(this->members_.m_start); }
+
+   //! <b>Effects</b>: Returns an iterator to the end of the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   iterator end()        
+   { return iterator(this->members_.m_start + this->members_.m_size); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator end()   const
+   { return this->cend(); }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning 
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rbegin()     
+   { return reverse_iterator(this->end());      }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning 
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rbegin()const
+   { return this->crbegin(); }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reverse_iterator rend()       
+   { return reverse_iterator(this->begin());       }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator rend()  const
+   { return this->crend(); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cbegin() const
+   { return const_iterator(this->members_.m_start); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the end of the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_iterator cend()   const
+   { return const_iterator(this->members_.m_start + this->members_.m_size); }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning 
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator crbegin()const
+   { return const_reverse_iterator(this->end());}
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //! of the reversed vector. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reverse_iterator crend()  const
+   { return const_reverse_iterator(this->begin()); }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference         front()       
+   { return *this->members_.m_start; }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a const reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference   front() const 
+   { return *this->members_.m_start; }
+
+   //! <b>Requires</b>: !empty()
+   //!
+   //! <b>Effects</b>: Returns a reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference         back()        
+   { return this->members_.m_start[this->members_.m_size - 1]; }
+
+   //! <b>Effects</b>: Returns a const reference to the first element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference   back()  const 
+   { return this->members_.m_start[this->members_.m_size - 1]; }
+
+   //! <b>Returns</b>: A pointer such that [data(),data() + size()) is a valid range.
+   //!   For a non-empty vector, data() == &front().
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   pointer data()        
+   { return this->members_.m_start; }
+
+   //! <b>Returns</b>: A pointer such that [data(),data() + size()) is a valid range.
+   //!   For a non-empty vector, data() == &front().
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_pointer data()  const 
+   { return this->members_.m_start; }
+
+   //! <b>Effects</b>: Returns the number of the elements contained in the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type size() const 
+   { return this->members_.m_size; }
+
+   //! <b>Effects</b>: Returns the largest possible size of the vector.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   size_type max_size() const 
+   { return this->alloc().max_size(); }
+
+   //! <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 this->members_.m_capacity; }
+
+   //! <b>Effects</b>: Returns true if the vector contains no elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   bool empty() const 
+   { return !this->members_.m_size; }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference operator[](size_type n)         
+   { return this->members_.m_start[n]; }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a const reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference operator[](size_type n) const   
+   { return this->members_.m_start[n]; }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: std::range_error if n >= size()
+   //! 
+   //! <b>Complexity</b>: Constant.
+   reference at(size_type n)
+   { this->priv_check_range(n); return this->members_.m_start[n]; }
+
+   //! <b>Requires</b>: size() < n.
+   //!
+   //! <b>Effects</b>: Returns a const reference to the nth element 
+   //!   from the beginning of the container.
+   //! 
+   //! <b>Throws</b>: std::range_error if n >= size()
+   //! 
+   //! <b>Complexity</b>: Constant.
+   const_reference at(size_type n) const
+   { this->priv_check_range(n); return this->members_.m_start[n]; }
+
+   //! <b>Effects</b>: Returns a copy of the internal allocator.
+   //! 
+   //! <b>Throws</b>: If allocator's copy constructor throws.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   allocator_type get_allocator() const 
+   { return this->alloc();  }
+
+   const stored_allocator_type &get_stored_allocator() const 
+   {  return this->alloc(); }
+
+   stored_allocator_type &get_stored_allocator()
+   {  return this->alloc(); }
+
+   //! <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.
+   void reserve(size_type new_cap)
+   {
+      if (this->capacity() < new_cap){
+         //There is not enough memory, allocate a new
+         //buffer or expand the old one.
+         bool same_buffer_start;
+         size_type real_cap = 0;
+         std::pair<pointer, bool> ret =
+            this->allocation_command
+               (allocate_new | expand_fwd | expand_bwd,
+                  new_cap, new_cap, real_cap, this->members_.m_start);
+
+         //Check for forward expansion
+         same_buffer_start = ret.second && this->members_.m_start == ret.first;
+         if(same_buffer_start){
+            #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+            ++this->num_expand_fwd;
+            #endif
+            this->members_.m_capacity  = real_cap;
+         }
+
+         //If there is no forward expansion, move objects
+         else{
+            //We will reuse insert code, so create a dummy input iterator
+            T *dummy_it(containers_detail::get_pointer(this->members_.m_start));
+            containers_detail::advanced_insert_aux_proxy<T, boost::move_iterator<T*>, T*>
+               proxy(boost::make_move_iterator(dummy_it), boost::make_move_iterator(dummy_it));
+            //Backwards (and possibly forward) expansion
+            if(ret.second){
+               #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+               ++this->num_expand_bwd;
+               #endif
+               this->priv_range_insert_expand_backwards
+                  ( containers_detail::get_pointer(ret.first)
+                  , real_cap
+                  , containers_detail::get_pointer(this->members_.m_start)
+                  , 0
+                  , proxy);
+            }
+            //New buffer
+            else{
+               #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+               ++this->num_alloc;
+               #endif
+               this->priv_range_insert_new_allocation
+                  ( containers_detail::get_pointer(ret.first)
+                  , real_cap
+                  , containers_detail::get_pointer(this->members_.m_start)
+                  , 0
+                  , proxy);
+            }
+         }
+      }
+   }
+
+   //! <b>Effects</b>: Makes *this contain the same elements as x.
+   //!
+   //! <b>Postcondition</b>: this->size() == x.size(). *this contains a copy 
+   //! of each of x's elements. 
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in x.
+   vector& operator=(const vector& x)
+   {
+      if (&x != this){
+         this->assign(x.members_.m_start, x.members_.m_start + x.members_.m_size);
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Move assignment. All mx's values are transferred to *this.
+   //!
+   //! <b>Postcondition</b>: x.empty(). *this contains a the elements x had
+   //!   before the function.
+   //!
+   //! <b>Throws</b>: If allocator_type's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Constant.
+   vector& operator=(BOOST_RV_REF(vector) x)
+   {
+      if (&x != this){
+         this->swap(x);
+         x.clear();
+      }
+      return *this;
+   }
+
+   //! <b>Effects</b>: Assigns the n copies of val to *this.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   void assign(size_type n, const value_type& val)
+   {  this->assign(cvalue_iterator(val, n), cvalue_iterator());   }
+
+   //! <b>Effects</b>: Assigns the the range [first, last) to *this.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's constructor from dereferencing InpIt throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   template <class InIt>
+   void assign(InIt first, InIt last) 
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_assign_dispatch(first, last, Result());
+   }
+
+   //! <b>Effects</b>: Inserts a copy of x at the end of the vector.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or
+   //!   T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_back(const T& x) 
+   {
+      if (this->members_.m_size < this->members_.m_capacity){
+         //There is more memory, just construct a new object at the end
+         new((void*)(containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size))value_type(x);
+         ++this->members_.m_size;
+      }
+      else{
+         this->insert(this->cend(), x);
+      }
+   }
+
+   //! <b>Effects</b>: Constructs a new element in the end of the vector
+   //!   and moves the resources of mx to this new element.
+   //!
+   //! <b>Throws</b>: If memory allocation throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   void push_back(BOOST_RV_REF(T) x) 
+   {
+      if (this->members_.m_size < this->members_.m_capacity){
+         //There is more memory, just construct a new object at the end
+         new((void*)containers_detail::get_pointer(this->members_.m_start + this->members_.m_size))value_type(boost::move(x));
+         ++this->members_.m_size;
+      }
+      else{
+         this->insert(this->cend(), boost::move(x));
+      }
+   }
+
+   #if defined(BOOST_CONTAINERS_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... in the end of the vector.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or the in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: Amortized constant time.
+   template<class ...Args>
+   void emplace_back(Args &&...args)
+   {
+      T* back_pos = containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size;
+      if (this->members_.m_size < this->members_.m_capacity){
+         //There is more memory, just construct a new object at the end
+         new((void*)(back_pos))value_type(boost::forward<Args>(args)...);
+         ++this->members_.m_size;
+      }
+      else{
+         containers_detail::advanced_insert_aux_emplace<T, T*, Args...> proxy
+            (boost::forward<Args>(args)...);
+         priv_range_insert(back_pos, 1, proxy);
+      }
+   }
+
+   //! <b>Requires</b>: position must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Inserts an object of type T constructed with
+   //!   std::forward<Args>(args)... before position
+   //!
+   //! <b>Throws</b>: If memory allocation throws or the in-place constructor throws.
+   //!
+   //! <b>Complexity</b>: If position is end(), amortized constant time
+   //!   Linear time otherwise.
+   template<class ...Args>
+   iterator emplace(const_iterator position, Args && ...args)
+   {
+      //Just call more general insert(pos, size, value) and return iterator
+      size_type pos_n = position - cbegin();
+      containers_detail::advanced_insert_aux_emplace<T, T*, Args...> proxy
+         (boost::forward<Args>(args)...);
+      priv_range_insert(position.get_ptr(), 1, proxy);
+      return iterator(this->members_.m_start + pos_n);
+   }
+
+   #else
+
+   void emplace_back()
+   {
+      T* back_pos = containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size;
+      if (this->members_.m_size < this->members_.m_capacity){
+         //There is more memory, just construct a new object at the end
+         new((void*)(back_pos))value_type();
+         ++this->members_.m_size;
+      }
+      else{
+         containers_detail::advanced_insert_aux_emplace<value_type, T*> proxy;
+         priv_range_insert(back_pos, 1, proxy);
+      }
+   }
+
+   iterator emplace(const_iterator position)
+   {
+      size_type pos_n = position - cbegin();
+      containers_detail::advanced_insert_aux_emplace<value_type, T*> proxy;
+      priv_range_insert(containers_detail::get_pointer(position.get_ptr()), 1, proxy);
+      return iterator(this->members_.m_start + pos_n);
+   }
+
+   #define BOOST_PP_LOCAL_MACRO(n)                                                              \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                   \
+   void emplace_back(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))                     \
+   {                                                                                            \
+      T* back_pos = containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size;        \
+      if (this->members_.m_size < this->members_.m_capacity){                                   \
+         new((void*)(back_pos))value_type                                                       \
+            (BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                         \
+         ++this->members_.m_size;                                                               \
+      }                                                                                         \
+      else{                                                                                     \
+         containers_detail::BOOST_PP_CAT(BOOST_PP_CAT(advanced_insert_aux_emplace, n), arg)                \
+            <value_type, T*, BOOST_PP_ENUM_PARAMS(n, P)>                                        \
+               proxy(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                 \
+         priv_range_insert(back_pos, 1, proxy);                                                 \
+      }                                                                                         \
+   }                                                                                            \
+                                                                                                \
+   template<BOOST_PP_ENUM_PARAMS(n, class P)>                                                   \
+   iterator emplace(const_iterator pos, BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_LIST, _))  \
+   {                                                                                            \
+      size_type pos_n = pos - cbegin();                                                         \
+      containers_detail::BOOST_PP_CAT(BOOST_PP_CAT(advanced_insert_aux_emplace, n), arg)                   \
+         <value_type, T*, BOOST_PP_ENUM_PARAMS(n, P)>                                           \
+            proxy(BOOST_PP_ENUM(n, BOOST_CONTAINERS_PP_PARAM_FORWARD, _));                    \
+      priv_range_insert(containers_detail::get_pointer(pos.get_ptr()), 1, proxy);                          \
+      return iterator(this->members_.m_start + pos_n);                                          \
+   }                                                                                            \
+   //!
+   #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINERS_MAX_CONSTRUCTOR_PARAMETERS)
+   #include BOOST_PP_LOCAL_ITERATE()
+
+   #endif   //#ifdef BOOST_CONTAINERS_PERFECT_FORWARDING
+  
+   //! <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(vector& x)
+   {
+      allocator_type &this_al = this->alloc(), &other_al = x.alloc();
+      //Just swap internals
+      containers_detail::do_swap(this->members_.m_start, x.members_.m_start);
+      containers_detail::do_swap(this->members_.m_size, x.members_.m_size);
+      containers_detail::do_swap(this->members_.m_capacity, x.members_.m_capacity);
+
+      if (this_al != other_al){
+         containers_detail::do_swap(this_al, other_al);
+      }
+   }
+
+   //! <b>Requires</b>: position must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a copy of x before position.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or x's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: If position is end(), amortized constant time
+   //!   Linear time otherwise.
+   iterator insert(const_iterator position, const T& x) 
+   {
+      //Just call more general insert(pos, size, value) and return iterator
+      size_type pos_n = position - cbegin();
+      this->insert(position, (size_type)1, x);
+      return iterator(this->members_.m_start + pos_n);
+   }
+
+   //! <b>Requires</b>: position must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a new element before position with mx's resources.
+   //!
+   //! <b>Throws</b>: If memory allocation throws.
+   //!
+   //! <b>Complexity</b>: If position is end(), amortized constant time
+   //!   Linear time otherwise.
+   iterator insert(const_iterator position, BOOST_RV_REF(T) x) 
+   {
+      //Just call more general insert(pos, size, value) and return iterator
+      size_type pos_n = position - cbegin();
+      this->insert(position
+                  ,repeat_move_it(repeat_it(x, 1))
+                  ,repeat_move_it(repeat_it()));
+      return iterator(this->members_.m_start + pos_n);
+   }
+
+   //! <b>Requires</b>: pos must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert a copy of the [first, last) range before pos.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, T's constructor from a
+   //!   dereferenced InpIt throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to std::distance [first, last).
+   template <class InIt>
+   void insert(const_iterator pos, InIt first, InIt last)
+   {
+      //Dispatch depending on integer/iterator
+      const bool aux_boolean = containers_detail::is_convertible<InIt, std::size_t>::value;
+      typedef containers_detail::bool_<aux_boolean> Result;
+      this->priv_insert_dispatch(pos, first, last, Result());
+   }
+
+   //! <b>Requires</b>: pos must be a valid iterator of *this.
+   //!
+   //! <b>Effects</b>: Insert n copies of x before pos.
+   //!
+   //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to n.
+   void insert(const_iterator p, size_type n, const T& x)
+   {  this->insert(p, cvalue_iterator(x, n), cvalue_iterator());  }
+
+   //! <b>Effects</b>: Removes the last element from the vector.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Constant time.
+   void pop_back() 
+   {
+      //Destroy last element
+      --this->members_.m_size;
+      this->destroy(containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size);
+   }
+
+   //! <b>Effects</b>: Erases the element at position pos.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the elements between pos and the 
+   //!   last element. Constant if pos is the first or the last element.
+   iterator erase(const_iterator position) 
+   {
+      T *pos = containers_detail::get_pointer(position.get_ptr());
+      T *beg = containers_detail::get_pointer(this->members_.m_start);
+      boost::move(pos + 1, beg + this->members_.m_size, pos);
+      --this->members_.m_size;
+      //Destroy last element
+      base_t::destroy(containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size);
+      return iterator(position.get_ptr());
+   }
+
+   //! <b>Effects</b>: Erases the elements pointed by [first, last).
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the distance between first and last.
+   iterator erase(const_iterator first, const_iterator last) 
+   {
+      if (first != last){   // worth doing, copy down over hole
+         T* end_pos = containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size;
+         T* ptr = containers_detail::get_pointer(boost::move
+            (containers_detail::get_pointer(last.get_ptr())
+            ,end_pos
+            ,containers_detail::get_pointer(first.get_ptr())
+            ));
+         size_type destroyed = (end_pos - ptr);
+         this->destroy_n(ptr, destroyed);
+         this->members_.m_size -= destroyed;
+      }
+      return iterator(first.get_ptr());
+   }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are copy constructed from x.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type new_size, const T& x) 
+   {
+      pointer finish = this->members_.m_start + this->members_.m_size;
+      if (new_size < size()){
+         //Destroy last elements
+         this->erase(const_iterator(this->members_.m_start + new_size), this->end());
+      }
+      else{
+         //Insert new elements at the end
+         this->insert(const_iterator(finish), new_size - this->size(), x);
+      }
+   }
+
+   //! <b>Effects</b>: Inserts or erases elements at the end such that
+   //!   the size becomes n. New elements are default constructed.
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to the difference between size() and new_size.
+   void resize(size_type new_size) 
+   {
+      if (new_size < this->size()){
+         //Destroy last elements
+         this->erase(const_iterator(this->members_.m_start + new_size), this->end());
+      }
+      else{
+         size_type n = new_size - this->size();
+         this->reserve(new_size);
+         containers_detail::default_construct_aux_proxy<T, T*, size_type> proxy(n);
+         priv_range_insert(this->cend().get_ptr(), n, proxy);
+      }
+   }
+
+   //! <b>Effects</b>: Erases all the elements of the vector.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Complexity</b>: Linear to the number of elements in the vector.
+   void clear() 
+   {  this->prot_destroy_all();  }
+
+   /// @cond
+
+   //! <b>Effects</b>: Tries to deallocate the excess of memory created
+   //!   with previous allocations. The size of the vector is unchanged
+   //!
+   //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
+   //!
+   //! <b>Complexity</b>: Linear to size().
+   void shrink_to_fit()
+   {  priv_shrink_to_fit(alloc_version());   }
+
+   private:
+   void priv_shrink_to_fit(allocator_v1)
+   {
+      if(this->members_.m_capacity){
+         if(!size()){
+            this->prot_deallocate();
+         }
+         else{
+            //This would not work with stateful allocators
+            vector<T, A>(*this).swap(*this);
+         }
+      }
+   }
+
+   void priv_shrink_to_fit(allocator_v2)
+   {
+      if(this->members_.m_capacity){
+         if(!size()){
+            this->prot_deallocate();
+         }
+         else{
+            size_type received_size;
+            if(this->alloc().allocation_command
+               ( shrink_in_place | nothrow_allocation
+               , this->capacity(), this->size()
+               , received_size,   this->members_.m_start).first){
+               this->members_.m_capacity = received_size;
+               #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+               ++this->num_shrink;
+               #endif
+            }
+         }
+      }
+   }
+
+   template <class FwdIt>
+   void priv_range_insert(pointer pos, FwdIt first, FwdIt last, std::forward_iterator_tag)
+   {
+      if(first != last){        
+         const size_type n = std::distance(first, last);
+         containers_detail::advanced_insert_aux_proxy<T, FwdIt, T*> proxy(first, last);
+         priv_range_insert(pos, n, proxy);
+      }
+   }
+
+   void priv_range_insert(pointer pos, const size_type n, advanced_insert_aux_int_t &interf)
+   {
+      //Check if we have enough memory or try to expand current memory
+      size_type remaining = this->members_.m_capacity - this->members_.m_size;
+      bool same_buffer_start;
+      std::pair<pointer, bool> ret;
+      size_type real_cap = this->members_.m_capacity;
+
+      //Check if we already have room
+      if (n <= remaining){
+         same_buffer_start = true;
+      }
+      else{
+         //There is not enough memory, allocate a new
+         //buffer or expand the old one.
+         size_type new_cap = this->next_capacity(n);
+         ret = this->allocation_command
+               (allocate_new | expand_fwd | expand_bwd,
+                  this->members_.m_size + n, new_cap, real_cap, this->members_.m_start);
+
+         //Check for forward expansion
+         same_buffer_start = ret.second && this->members_.m_start == ret.first;
+         if(same_buffer_start){
+            this->members_.m_capacity  = real_cap;
+         }
+      }
+      
+      //If we had room or we have expanded forward
+      if (same_buffer_start){
+         #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+         ++this->num_expand_fwd;
+         #endif
+         this->priv_range_insert_expand_forward
+            (containers_detail::get_pointer(pos), n, interf);
+      }
+      //Backwards (and possibly forward) expansion
+      else if(ret.second){
+         #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+         ++this->num_expand_bwd;
+         #endif
+         this->priv_range_insert_expand_backwards
+            ( containers_detail::get_pointer(ret.first)
+            , real_cap
+            , containers_detail::get_pointer(pos)
+            , n
+            , interf);
+      }
+      //New buffer
+      else{
+         #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+         ++this->num_alloc;
+         #endif
+         this->priv_range_insert_new_allocation
+            ( containers_detail::get_pointer(ret.first)
+            , real_cap
+            , containers_detail::get_pointer(pos)
+            , n
+            , interf);
+      }
+   }
+
+   void priv_range_insert_expand_forward(T* pos, size_type n, advanced_insert_aux_int_t &interf)
+   {
+      //There is enough memory
+      T* old_finish = containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size;
+      const size_type elems_after = old_finish - pos;
+
+      if (elems_after > n){
+         //New elements can be just copied.
+         //Move to uninitialized memory last objects
+         boost::uninitialized_move(old_finish - n, old_finish, old_finish);
+         this->members_.m_size += n;
+         //Copy previous to last objects to the initialized end
+         boost::move_backward(pos, old_finish - n, old_finish);
+         //Insert new objects in the pos
+         interf.copy_all_to(pos);
+      }
+      else {
+         //The new elements don't fit in the [pos, end()) range. Copy
+         //to the beginning of the unallocated zone the last new elements.
+         interf.uninitialized_copy_some_and_update(old_finish, elems_after, false);
+         this->members_.m_size += n - elems_after;
+         //Copy old [pos, end()) elements to the uninitialized memory
+         boost::uninitialized_move
+            ( pos, old_finish, containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size);
+         this->members_.m_size += elems_after;
+         //Copy first new elements in pos
+         interf.copy_all_to(pos);
+      }
+   }
+
+   void priv_range_insert_new_allocation
+      (T* new_start, size_type new_cap, T* pos, size_type n, advanced_insert_aux_int_t &interf)
+   {
+      T* new_finish = new_start;
+      T *old_finish;
+      //Anti-exception rollbacks
+      typename value_traits::UCopiedArrayDeallocator scoped_alloc(new_start, this->alloc(), new_cap);
+      typename value_traits::UCopiedArrayDestructor constructed_values_destroyer(new_start, 0u);
+
+      //Initialize with [begin(), pos) old buffer 
+      //the start of the new buffer
+      new_finish = boost::uninitialized_move
+         (containers_detail::get_pointer(this->members_.m_start), pos, old_finish = new_finish);
+      constructed_values_destroyer.increment_size(new_finish - old_finish);
+      //Initialize new objects, starting from previous point
+      interf.uninitialized_copy_all_to(old_finish = new_finish);
+      new_finish += n;
+      constructed_values_destroyer.increment_size(new_finish - old_finish);
+      //Initialize from the rest of the old buffer, 
+      //starting from previous point
+      new_finish = boost::uninitialized_move
+         ( pos, containers_detail::get_pointer(this->members_.m_start) + this->members_.m_size, new_finish);
+      //All construction successful, disable rollbacks
+      constructed_values_destroyer.release();
+      scoped_alloc.release();
+      //Destroy and deallocate old elements
+      //If there is allocated memory, destroy and deallocate
+      if(this->members_.m_start != 0){
+         if(!value_traits::trivial_dctr_after_move)
+            this->destroy_n(containers_detail::get_pointer(this->members_.m_start), this->members_.m_size); 
+         this->alloc().deallocate(this->members_.m_start, this->members_.m_capacity);
+      }
+      this->members_.m_start     = new_start;
+      this->members_.m_size      = new_finish - new_start;
+      this->members_.m_capacity  = new_cap;
+   }
+
+   void priv_range_insert_expand_backwards
+         (T* new_start, size_type new_capacity,
+          T* pos, const size_type n, advanced_insert_aux_int_t &interf)
+   {
+      //Backup old data
+      T* old_start  = containers_detail::get_pointer(this->members_.m_start);
+      T* old_finish = old_start + this->members_.m_size;
+      size_type old_size = this->members_.m_size;
+
+      //We can have 8 possibilities:
+      const size_type elemsbefore   = (size_type)(pos - old_start);
+      const size_type s_before      = (size_type)(old_start - new_start);
+
+      //Update the vector buffer information to a safe state
+      this->members_.m_start      = new_start;
+      this->members_.m_capacity   = new_capacity;
+      this->members_.m_size = 0;
+
+      //If anything goes wrong, this object will destroy
+      //all the old objects to fulfill previous vector state
+      typename value_traits::OldArrayDestructor old_values_destroyer(old_start, old_size);
+      //Check if s_before is big enough to hold the beginning of old data + new data
+      if(difference_type(s_before) >= difference_type(elemsbefore + n)){
+         //Copy first old values before pos, after that the new objects
+         boost::uninitialized_move(old_start, pos, new_start);
+         this->members_.m_size = elemsbefore;
+         interf.uninitialized_copy_all_to(new_start + elemsbefore);
+         this->members_.m_size += n;
+         //Check if s_before is so big that even copying the old data + new data
+         //there is a gap between the new data and the old data
+         if(s_before >= (old_size + n)){
+            //Old situation:
+            // _________________________________________________________
+            //|            raw_mem                | old_begin | old_end |
+            //| __________________________________|___________|_________|
+            //
+            //New situation:
+            // _________________________________________________________
+            //| old_begin |    new   | old_end |         raw_mem        |
+            //|___________|__________|_________|________________________|
+            //
+            //Now initialize the rest of memory with the last old values
+            boost::uninitialized_move
+               (pos, old_finish, new_start + elemsbefore + n);
+            //All new elements correctly constructed, avoid new element destruction
+            this->members_.m_size = old_size + n;
+            //Old values destroyed automatically with "old_values_destroyer"
+            //when "old_values_destroyer" goes out of scope unless the have trivial
+            //destructor after move.
+            if(value_traits::trivial_dctr_after_move)
+               old_values_destroyer.release();
+         }
+         //s_before is so big that divides old_end
+         else{
+            //Old situation:
+            // __________________________________________________
+            //|            raw_mem         | old_begin | old_end |
+            //| ___________________________|___________|_________|
+            //
+            //New situation:
+            // __________________________________________________
+            //| old_begin |   new    | old_end |  raw_mem        |
+            //|___________|__________|_________|_________________|
+            //
+            //Now initialize the rest of memory with the last old values
+            //All new elements correctly constructed, avoid new element destruction
+            size_type raw_gap = s_before - (elemsbefore + n);
+            //Now initialize the rest of s_before memory with the
+            //first of elements after new values
+            boost::uninitialized_move(pos, pos + raw_gap, new_start + elemsbefore + n);
+            //Update size since we have a contiguous buffer
+            this->members_.m_size = old_size + s_before;
+            //All new elements correctly constructed, avoid old element destruction
+            old_values_destroyer.release();
+            //Now copy remaining last objects in the old buffer begin
+            T *to_destroy = boost::move(pos + raw_gap, old_finish, old_start);
+            //Now destroy redundant elements except if they were moved and
+            //they have trivial destructor after move
+            size_type n_destroy =  old_finish - to_destroy;
+            if(!value_traits::trivial_dctr_after_move)
+               this->destroy_n(to_destroy, n_destroy);
+            this->members_.m_size -= n_destroy;
+         }
+      }
+      else{
+         //Check if we have to do the insertion in two phases
+         //since maybe s_before is not big enough and
+         //the buffer was expanded both sides
+         //
+         //Old situation:
+         // _________________________________________________
+         //| raw_mem | old_begin + old_end |  raw_mem        |
+         //|_________|_____________________|_________________|
+         //
+         //New situation with do_after:
+         // _________________________________________________
+         //|     old_begin + new + old_end     |  raw_mem    |
+         //|___________________________________|_____________|
+         //
+         //New without do_after:
+         // _________________________________________________
+         //| old_begin + new + old_end  |  raw_mem           |
+         //|____________________________|____________________|
+         //
+         bool do_after    = n > s_before;
+
+         //Now we can have two situations: the raw_mem of the
+         //beginning divides the old_begin, or the new elements:
+         if (s_before <= elemsbefore) {
+            //The raw memory divides the old_begin group:
+            //
+            //If we need two phase construction (do_after)
+            //new group is divided in new = new_beg + new_end groups
+            //In this phase only new_beg will be inserted
+            //
+            //Old situation:
+            // _________________________________________________
+            //| raw_mem | old_begin | old_end |  raw_mem        |
+            //|_________|___________|_________|_________________|
+            //
+            //New situation with do_after(1):
+            //This is not definitive situation, the second phase
+            //will include
+            // _________________________________________________
+            //| old_begin | new_beg | old_end |  raw_mem        |
+            //|___________|_________|_________|_________________|
+            //
+            //New situation without do_after:
+            // _________________________________________________
+            //| old_begin | new | old_end |  raw_mem            |
+            //|___________|_____|_________|_____________________|
+            //
+            //Copy the first part of old_begin to raw_mem
+            T *start_n = old_start + difference_type(s_before); 
+            boost::uninitialized_move(old_start, start_n, new_start);
+            //The buffer is all constructed until old_end,
+            //release destroyer and update size
+            old_values_destroyer.release();
+            this->members_.m_size = old_size + s_before;
+            //Now copy the second part of old_begin overwriting himself
+            T* next = boost::move(start_n, pos, old_start);
+            if(do_after){
+               //Now copy the new_beg elements
+               interf.copy_some_and_update(next, s_before, true);
+            }
+            else{
+               //Now copy the all the new elements
+               interf.copy_all_to(next);
+               T* move_start = next + n;
+               //Now displace old_end elements
+               T* move_end   = boost::move(pos, old_finish, move_start);
+               //Destroy remaining moved elements from old_end except if
+               //they have trivial destructor after being moved
+               difference_type n_destroy = s_before - n;
+               if(!value_traits::trivial_dctr_after_move)
+                  this->destroy_n(move_end, n_destroy);
+               this->members_.m_size -= n_destroy;
+            }
+         }
+         else {
+            //If we have to expand both sides,
+            //we will play if the first new values so
+            //calculate the upper bound of new values
+
+            //The raw memory divides the new elements
+            //
+            //If we need two phase construction (do_after)
+            //new group is divided in new = new_beg + new_end groups
+            //In this phase only new_beg will be inserted
+            //
+            //Old situation:
+            // _______________________________________________________
+            //|   raw_mem     | old_begin | old_end |  raw_mem        |
+            //|_______________|___________|_________|_________________|
+            //
+            //New situation with do_after():
+            // ____________________________________________________
+            //| old_begin |    new_beg    | old_end |  raw_mem     |
+            //|___________|_______________|_________|______________|
+            //
+            //New situation without do_after:
+            // ______________________________________________________
+            //| old_begin | new | old_end |  raw_mem                 |
+            //|___________|_____|_________|__________________________|
+            //
+            //First copy whole old_begin and part of new to raw_mem
+            boost::uninitialized_move(old_start, pos, new_start);
+            this->members_.m_size = elemsbefore;
+
+            const size_type mid_n = difference_type(s_before) - elemsbefore;
+            interf.uninitialized_copy_some_and_update(new_start + elemsbefore, mid_n, true);
+            this->members_.m_size = old_size + s_before;
+            //The buffer is all constructed until old_end,
+            //release destroyer and update size
+            old_values_destroyer.release();
+
+            if(do_after){
+               //Copy new_beg part
+               interf.copy_some_and_update(old_start, s_before - mid_n, true);
+            }
+            else{
+               //Copy all new elements
+               interf.copy_all_to(old_start);
+               T* move_start = old_start + (n-mid_n);
+               //Displace old_end
+               T* move_end = boost::move(pos, old_finish, move_start);
+               //Destroy remaining moved elements from old_end except if they
+               //have trivial destructor after being moved
+               difference_type n_destroy = s_before - n;
+               if(!value_traits::trivial_dctr_after_move)
+                  this->destroy_n(move_end, n_destroy);
+               this->members_.m_size -= n_destroy;
+            }
+         }
+
+         //This is only executed if two phase construction is needed
+         //This can be executed without exception handling since we
+         //have to just copy and append in raw memory and
+         //old_values_destroyer has been released in phase 1.
+         if(do_after){
+            //The raw memory divides the new elements
+            //
+            //Old situation:
+            // ______________________________________________________
+            //|   raw_mem    | old_begin |  old_end   |  raw_mem     |
+            //|______________|___________|____________|______________|
+            //
+            //New situation with do_after(1):
+            // _______________________________________________________
+            //| old_begin   +   new_beg  | new_end |old_end | raw_mem |
+            //|__________________________|_________|________|_________|
+            //
+            //New situation with do_after(2):
+            // ______________________________________________________
+            //| old_begin      +       new            | old_end |raw |
+            //|_______________________________________|_________|____|
+            //
+            const size_type n_after  = n - s_before;
+            const difference_type elemsafter = old_size - elemsbefore;
+
+            //We can have two situations:
+            if (elemsafter > difference_type(n_after)){
+               //The raw_mem from end will divide displaced old_end
+               //
+               //Old situation:
+               // ______________________________________________________
+               //|   raw_mem    | old_begin |  old_end   |  raw_mem     |
+               //|______________|___________|____________|______________|
+               //
+               //New situation with do_after(1):
+               // _______________________________________________________
+               //| old_begin   +   new_beg  | new_end |old_end | raw_mem |
+               //|__________________________|_________|________|_________|
+               //
+               //First copy the part of old_end raw_mem
+               T* finish_n = old_finish - difference_type(n_after);
+               boost::uninitialized_move(finish_n, old_finish, old_finish);
+               this->members_.m_size += n_after;
+               //Displace the rest of old_end to the new position
+               boost::move_backward(pos, finish_n, old_finish);
+               //Now overwrite with new_end
+               //The new_end part is [first + (n - n_after), last)
+               interf.copy_all_to(pos);
+            }
+            else {
+               //The raw_mem from end will divide new_end part
+               //
+               //Old situation:
+               // _____________________________________________________________
+               //|   raw_mem    | old_begin |  old_end   |  raw_mem            |
+               //|______________|___________|____________|_____________________|
+               //
+               //New situation with do_after(2):
+               // _____________________________________________________________
+               //| old_begin   +   new_beg  |     new_end   |old_end | raw_mem |
+               //|__________________________|_______________|________|_________|
+               //
+               size_type mid_last_dist = n_after - elemsafter;
+               //First initialize data in raw memory
+               //The new_end part is [first + (n - n_after), last)
+               interf.uninitialized_copy_some_and_update(old_finish, elemsafter, false);
+               this->members_.m_size += mid_last_dist;
+               boost::uninitialized_move(pos, old_finish, old_finish + mid_last_dist);
+               this->members_.m_size += n_after - mid_last_dist;
+               //Now copy the part of new_end over constructed elements
+               interf.copy_all_to(pos);
+            }
+         }
+      }
+   }
+
+   template <class InIt>
+   void priv_range_insert(const_iterator pos, InIt first, InIt last, std::input_iterator_tag)
+   {
+      for(;first != last; ++first){
+         this->insert(pos, boost::move(value_type(*first)));
+      }
+   }
+
+   template <class InIt>
+   void priv_assign_aux(InIt first, InIt last, std::input_iterator_tag)
+   {
+      //Overwrite all elements we can from [first, last)
+      iterator cur = begin();
+      for ( ; first != last && cur != end(); ++cur, ++first){
+         *cur = *first;
+      }
+
+      if (first == last){
+         //There are no more elements in the sequence, erase remaining
+         this->erase(cur, cend());
+      }
+      else{
+         //There are more elements in the range, insert the remaining ones
+         this->insert(this->cend(), first, last);
+      }
+   }
+
+   template <class FwdIt>
+   void priv_assign_aux(FwdIt first, FwdIt last, std::forward_iterator_tag)
+   {
+      size_type n = std::distance(first, last);
+      //Check if we have enough memory or try to expand current memory
+      size_type remaining = this->members_.m_capacity - this->members_.m_size;
+      bool same_buffer_start;
+      std::pair<pointer, bool> ret;
+      size_type real_cap = this->members_.m_capacity;
+
+      if (n <= remaining){
+         same_buffer_start = true;
+      }
+      else{
+         //There is not enough memory, allocate a new buffer
+         size_type new_cap = this->next_capacity(n);
+         ret = this->allocation_command
+               (allocate_new | expand_fwd | expand_bwd,
+                  this->size() + n, new_cap, real_cap, this->members_.m_start);
+         same_buffer_start = ret.second && this->members_.m_start == ret.first;
+         if(same_buffer_start){
+            this->members_.m_capacity  = real_cap;
+         }
+      }
+      
+      if(same_buffer_start){
+         T *start = containers_detail::get_pointer(this->members_.m_start);
+         if (this->size() >= n){
+            //There is memory, but there are more old elements than new ones
+            //Overwrite old elements with new ones
+            // iG std::copy(first, last, start);
+            std::copy(first, last, start);
+            //Destroy remaining old elements
+            this->destroy_n(start + n, this->members_.m_size - n);
+            this->members_.m_size = n;
+         }
+         else{
+            //There is memory, but there are less old elements than new ones
+            //First overwrite some old elements with new ones
+            FwdIt mid = first;
+            std::advance(mid, this->size());
+            // iG T *end = std::copy(first, mid, start);
+            T *end = std::copy(first, mid, start);
+            //Initialize the remaining new elements in the uninitialized memory
+            // iG std::uninitialized_copy(mid, last, end);
+            boost::uninitialized_copy_or_move(mid, last, end);
+            this->members_.m_size = n;
+         }
+      }
+      else if(!ret.second){
+         typename value_traits::UCopiedArrayDeallocator scoped_alloc(ret.first, this->alloc(), real_cap);
+         // iG std::uninitialized_copy(first, last, containers_detail::get_pointer(ret.first));
+         boost::uninitialized_copy_or_move(first, last, containers_detail::get_pointer(ret.first));
+         scoped_alloc.release();
+         //Destroy and deallocate old buffer
+         if(this->members_.m_start != 0){
+            this->destroy_n(containers_detail::get_pointer(this->members_.m_start), this->members_.m_size); 
+            this->alloc().deallocate(this->members_.m_start, this->members_.m_capacity);
+         }
+         this->members_.m_start     = ret.first;
+         this->members_.m_size      = n;
+         this->members_.m_capacity  = real_cap;
+      }
+      else{
+         //Backwards expansion
+         //If anything goes wrong, this object will destroy old objects
+         T *old_start         = containers_detail::get_pointer(this->members_.m_start);
+         size_type old_size   = this->members_.m_size;
+         typename value_traits::OldArrayDestructor old_values_destroyer(old_start, old_size);
+         //If something goes wrong size will be 0
+         //but holding the whole buffer
+         this->members_.m_size  = 0;
+         this->members_.m_start = ret.first;
+         this->members_.m_capacity = real_cap;
+         
+         //Backup old buffer data
+         size_type old_offset    = old_start - containers_detail::get_pointer(ret.first);
+         size_type first_count   = containers_detail::min_value(n, old_offset);
+
+         FwdIt mid = first;
+         std::advance(mid, first_count);
+         // iG std::uninitialized_copy(first, mid, containers_detail::get_pointer(ret.first));
+         boost::uninitialized_copy_or_move(first, mid, containers_detail::get_pointer(ret.first));
+
+         if(old_offset > n){
+            //All old elements will be destroyed by "old_values_destroyer" 
+            this->members_.m_size = n;
+         }
+         else{
+            //We have constructed objects from the new begin until
+            //the old end so release the rollback destruction
+            old_values_destroyer.release();
+            this->members_.m_start  = ret.first;
+            this->members_.m_size   = first_count + old_size;
+            //Now overwrite the old values
+            size_type second_count = containers_detail::min_value(old_size, n - first_count);
+            FwdIt mid2 = mid;
+            std::advance(mid2, second_count);
+            // iG std::copy(mid, mid2, old_start);
+            std::copy(mid, mid2, old_start);
+            
+            //Check if we still have to append elements in the
+            //uninitialized end
+            if(second_count == old_size){
+               // iG std::copy(mid2, last, old_start + old_size);
+               std::copy(mid2, last, old_start + old_size);
+            }
+            else{
+               //We have to destroy some old values
+               this->destroy_n
+                  (old_start + second_count, old_size - second_count);
+               this->members_.m_size = n;
+            }
+            this->members_.m_size = n;                        
+         }
+      }
+   }
+
+   template <class Integer>
+   void priv_assign_dispatch(Integer n, Integer val, containers_detail::true_)
+   { this->assign((size_type) n, (T) val); }
+
+   template <class InIt>
+   void priv_assign_dispatch(InIt first, InIt last, containers_detail::false_)
+   { 
+      //Dispatch depending on integer/iterator
+      typedef typename std::iterator_traits<InIt>::iterator_category ItCat;
+      this->priv_assign_aux(first, last, ItCat()); 
+   }
+
+   template <class Integer>
+   void priv_insert_dispatch(const_iterator pos, Integer n, Integer val, containers_detail::true_) 
+   {  this->insert(pos, (size_type)n, (T)val);  }
+
+   template <class InIt>
+   void priv_insert_dispatch(const_iterator pos, InIt first, 
+                             InIt last,      containers_detail::false_)
+   {
+      //Dispatch depending on integer/iterator
+      typedef typename std::iterator_traits<InIt>::iterator_category ItCat;
+      this->priv_range_insert(pos.get_ptr(), first, last, ItCat());
+   }
+
+   void priv_check_range(size_type n) const 
+   {
+      //If n is out of range, throw an out_of_range exception
+      if (n >= size())
+         throw std::out_of_range("vector::at");
+   }
+
+   #ifdef BOOST_CONTAINERS_VECTOR_ALLOC_STATS
+   public:
+   unsigned int num_expand_fwd;
+   unsigned int num_expand_bwd;
+   unsigned int num_shrink;
+   unsigned int num_alloc;
+   void reset_alloc_stats()
+   {  num_expand_fwd = num_expand_bwd = num_alloc = 0, num_shrink = 0;   }
+   #endif
+   /// @endcond
+};
+
+template <class T, class A>
+inline bool 
+operator==(const vector<T, A>& x, const vector<T, A>& y)
+{
+   //Check first size and each element if needed
+   return x.size() == y.size() && std::equal(x.begin(), x.end(), y.begin());
+}
+
+template <class T, class A>
+inline bool 
+operator!=(const vector<T, A>& x, const vector<T, A>& y)
+{
+   //Check first size and each element if needed
+  return x.size() != y.size() || !std::equal(x.begin(), x.end(), y.begin());
+}
+
+template <class T, class A>
+inline bool 
+operator<(const vector<T, A>& x, const vector<T, A>& y)
+{
+   return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+template <class T, class A>
+inline void swap(vector<T, A>& x, vector<T, A>& y)
+{  x.swap(y);  }
+
+}}
+
+/// @cond
+
+namespace boost {
+
+//!has_trivial_destructor_after_move<> == true_type
+//!specialization for optimizations
+template <class T, class A>
+struct has_trivial_destructor_after_move<boost::container::vector<T, A> >
+{
+   static const bool value = has_trivial_destructor<A>::value;
+};
+
+}
+
+/// @endcond
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //   #ifndef  BOOST_CONTAINERS_CONTAINERS_VECTOR_HPP
+
Added: sandbox/move/boost/move/move.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/boost/move/move.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,744 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// Parts of this file come from Adobe's Move library:
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
+// or a copy at http://stlab.adobe.com/licenses.html)
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! \file
+
+#ifndef BOOST_MOVE_HPP
+#define BOOST_MOVE_HPP
+
+#include <boost/config.hpp>
+#include <algorithm> //copy, copy_backward
+#include <memory>    //uninitialized_copy
+#include <iterator>  //std::iterator
+#include <boost/mpl/if.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/utility/addressof.hpp>
+
+namespace boost {
+namespace move_detail {
+
+template <class T>
+struct identity
+{
+   typedef T type;
+};
+
+template <class T, class U>
+class is_convertible
+{
+   typedef char true_t;
+   class false_t { char dummy[2]; };
+   static true_t dispatch(U);
+   static false_t dispatch(...);
+   static T trigger();
+   public:
+   enum { value = sizeof(dispatch(trigger())) == sizeof(true_t) };
+};
+
+}  //namespace move_detail {
+}  //namespace boost {
+
+#if !defined(BOOST_HAS_RVALUE_REFS) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            struct rv
+//
+//////////////////////////////////////////////////////////////////////////////
+template <class T>
+class rv : public T
+{
+   rv();
+   ~rv();
+   rv(rv const&);
+   void operator=(rv const&);
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            move_detail::is_rv
+//
+//////////////////////////////////////////////////////////////////////////////
+
+namespace move_detail {
+
+template <class T>
+struct is_rv
+{
+   static const bool value = false;
+};
+
+template <class T>
+struct is_rv< rv<T> >
+{
+   static const bool value = true;
+};
+
+}  //namespace move_detail {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               is_movable
+//
+//////////////////////////////////////////////////////////////////////////////
+template<class T>
+class is_movable
+{
+   public:
+   static const bool value = move_detail::is_convertible<T, rv<T>&>::value;
+};
+
+template<class T>
+class is_movable< rv<T> >
+{
+   public:
+   static const bool value = false;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            move()
+//
+//////////////////////////////////////////////////////////////////////////////
+template <class T>
+typename boost::disable_if<is_movable<T>, T&>::type move(T& x)
+{
+   return x;
+}
+
+template <class T>
+typename enable_if<is_movable<T>, rv<T>&>::type move(T& x)
+{
+   return *static_cast<rv<T>* >(boost::addressof(x));
+}
+
+template <class T>
+typename enable_if<is_movable<T>, rv<T>&>::type move(const rv<T>& x)
+{
+   return const_cast<rv<T>& >(x);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            forward()
+//
+//////////////////////////////////////////////////////////////////////////////
+
+template <class T>
+typename enable_if<boost::move_detail::is_rv<T>, T &>::type
+   forward(const typename move_detail::identity<T>::type &x)
+{
+   return const_cast<T&>(x);
+}
+
+/*
+template <class T>
+typename enable_if<boost::move_detail::is_rv<T>, T &>::type
+forward(typename move_detail::identity<T>::type &x)
+{
+   return x;
+}
+
+template <class T>
+typename disable_if<boost::move_detail::is_rv<T>, T &>::type
+   forward(typename move_detail::identity<T>::type &x)
+{
+   return x;
+}
+*/
+template <class T>
+typename disable_if<boost::move_detail::is_rv<T>, const T &>::type
+   forward(const typename move_detail::identity<T>::type &x)
+{
+   return x;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         BOOST_ENABLE_MOVE_EMULATION
+//
+//////////////////////////////////////////////////////////////////////////////
+#define BOOST_ENABLE_MOVE_EMULATION(TYPE)\
+   operator boost::rv<TYPE>&() \
+   {  return *static_cast<boost::rv<TYPE>* >(this);  }\
+//
+
+#define BOOST_RV_REF(TYPE)\
+   boost::rv< TYPE >& \
+//
+
+/// @cond
+
+#define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
+   boost::rv< TYPE<ARG1, ARG2> >& \
+//
+
+#define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
+   boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
+//
+
+/// @endcond
+
+#define BOOST_FWD_REF(TYPE)\
+   const TYPE & \
+//
+}  //namespace boost
+
+#else    //BOOST_HAS_RVALUE_REFS
+
+#include <boost/type_traits/remove_reference.hpp>
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               is_movable
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! For compilers with rvalue references, this traits class returns true
+//! if T && is convertible to T.
+//!
+//! For other compilers returns true if T is convertible to <i>boost::rv<T>&</i>
+template<class T>
+class is_movable
+{
+   public:
+   static const bool value = move_detail::is_convertible<T&&, T>::value;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                                  move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+#if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+//! This function provides a way to convert a reference into a rvalue reference
+//! in compilers with rvalue reference. For other compilers converts T & into
+//! <i>boost::rv<T> &</i> so that move emulation is activated.
+template <class T> inline 
+rvalue_reference move (input_reference);
+#else
+template <class T> inline 
+typename remove_reference<T>::type&& move(T&& t)
+{  return t;   }
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                                  forward
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+#if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+//! This function provides limited form of forwarding that is usually enough for
+//! in-place construction and avoids the exponential overloading necessary for
+//! perfect forwarding in C++03.
+//!
+//! For compilers with rvalue references this function provides perfect forwarding.
+//!
+//! Otherwise:
+//! * If input_reference binds to const boost::rv<T> & then it output_reference is
+//!   boost::rev<T> &
+//!
+//! * Else, input_reference is equal to output_reference is equal to input_reference.
+template <class T> inline output_reference forward(input_reference);
+#else
+template <class T> inline
+T&& forward (typename move_detail::identity<T>::type&& t)
+{  return t;   }
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         BOOST_ENABLE_MOVE_EMULATION
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! This macro expands to nothing for compilers with rvalue references.
+//! Otherwise expands to:
+//! \code
+//! operator boost::rv<TYPE>&()
+//! {  return static_cast<boost::rv<TYPE>& >(*this);   }
+//! \endcode
+#define BOOST_ENABLE_MOVE_EMULATION(TYPE)\
+//
+
+/// @cond
+
+#define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
+   TYPE<ARG1, ARG2> && \
+//
+
+#define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
+   TYPE<ARG1, ARG2, ARG3> && \
+//
+
+/// @endcond
+
+//! This macro expands to <i>T&&</i> for compilers with rvalue references.
+//! Otherwise expands to <i>boost::rv<T> &</i>.
+#define BOOST_RV_REF(TYPE)\
+   TYPE && \
+//
+
+//! This macro expands to <i>T&&</i> for compilers with rvalue references.
+//! Otherwise expands to <i>const T &</i>.
+#define BOOST_FWD_REF(TYPE)\
+   TYPE && \
+//
+
+}  //namespace boost {
+
+#endif   //BOOST_HAS_RVALUE_REFS
+
+namespace boost {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            move_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! Class template move_iterator is an iterator adaptor with the same behavior
+//! as the underlying iterator except that its dereference operator implicitly
+//! converts the value returned by the underlying iterator's dereference operator
+//! to an rvalue reference. Some generic algorithms can be called with move
+//! iterators to replace copying with moving.
+template <class It>
+class move_iterator
+{
+   public:
+   typedef It                                                              iterator_type;
+   typedef typename std::iterator_traits<iterator_type>::value_type        value_type;
+   #if defined(BOOST_HAS_RVALUE_REFS) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
+   typedef value_type &&                                                   reference;
+   #else
+   typedef typename boost::mpl::if_
+      < boost::is_movable<value_type>
+      , boost::rv<value_type>&
+      , value_type & >::type                                               reference;
+   #endif
+   typedef typename std::iterator_traits<iterator_type>::pointer           pointer;
+   typedef typename std::iterator_traits<iterator_type>::difference_type   difference_type;
+   typedef typename std::iterator_traits<iterator_type>::iterator_category iterator_category;
+
+   move_iterator()
+   {}
+
+   explicit move_iterator(It i)
+      :  m_it(i)
+   {}
+
+   template <class U>
+   move_iterator(const move_iterator<U>& u)
+      :  m_it(u.base())
+   {}
+
+   iterator_type base() const
+   {  return m_it;   }
+
+   reference operator*() const
+   {
+      #if defined(BOOST_HAS_RVALUE_REFS)
+      return *m_it;
+      #else
+      return boost::move(*m_it);
+      #endif
+   }
+
+   pointer   operator->() const
+   {  return m_it;   }
+
+   move_iterator& operator++()
+   {  ++m_it; return *this;   }
+
+   move_iterator<iterator_type>  operator++(int)
+   {  move_iterator<iterator_type> tmp(*this); ++(*this); return tmp;   }
+
+   move_iterator& operator--()
+   {  --m_it; return *this;   }
+
+   move_iterator<iterator_type>  operator--(int)
+   {  move_iterator<iterator_type> tmp(*this); --(*this); return tmp;   }
+
+   move_iterator<iterator_type>  operator+ (difference_type n) const
+   {  return move_iterator<iterator_type>(m_it + n);  }
+
+   move_iterator& operator+=(difference_type n)
+   {  m_it += n; return *this;   }
+
+   move_iterator<iterator_type>  operator- (difference_type n) const
+   {  return move_iterator<iterator_type>(m_it - n);  }
+
+   move_iterator& operator-=(difference_type n)
+   {  m_it -= n; return *this;   }
+
+   reference operator[](difference_type n) const
+   {
+      #if defined(BOOST_HAS_RVALUE_REFS)
+      return m_it[n];
+      #else
+      return boost::move(m_it[n]);
+      #endif
+   }
+
+   friend bool operator==(const move_iterator& x, const move_iterator& y)
+   {  return x.base() == y.base();  }
+
+   friend bool operator!=(const move_iterator& x, const move_iterator& y)
+   {  return x.base() != y.base();  }
+
+   friend bool operator< (const move_iterator& x, const move_iterator& y)
+   {  return x.base() < y.base();   }
+
+   friend bool operator<=(const move_iterator& x, const move_iterator& y)
+   {  return x.base() <= y.base();  }
+
+   friend bool operator> (const move_iterator& x, const move_iterator& y)
+   {  return x.base() > y.base();  }
+
+   friend bool operator>=(const move_iterator& x, const move_iterator& y)
+   {  return x.base() >= y.base();  }
+
+   friend difference_type operator-(const move_iterator& x, const move_iterator& y)
+   {  return x.base() - y.base();   }
+
+   friend move_iterator operator+(difference_type n, const move_iterator& x)
+   {  return move_iterator(x.base() + n);   }
+
+   private:
+   It m_it;
+};
+
+
+//is_move_iterator
+namespace move_detail {
+
+template <class I>
+struct is_move_iterator
+{
+   static const bool value = false;
+};
+
+template <class I>
+struct is_move_iterator< ::boost::move_iterator<I> >
+{
+   static const bool value = true;
+};
+
+}  //namespace move_detail {
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            move_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//!
+//! <b>Returns</b>: move_iterator<It>(i).
+template<class It>
+move_iterator<It> make_move_iterator(const It &it)
+{  return move_iterator<It>(it); }
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         back_move_insert_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+//! A move insert iterator that move constructs elements at the
+//! back of a container
+template <typename C> // C models Container
+class back_move_insert_iterator
+   : public std::iterator<std::output_iterator_tag, void, void, void, void>
+{
+   C* container_m;
+
+   public:
+   typedef C container_type;
+
+   explicit back_move_insert_iterator(C& x) : container_m(&x) { }
+
+   back_move_insert_iterator& operator=(typename C::reference x)
+   { container_m->push_back(boost::move(x)); return *this; }
+
+   back_move_insert_iterator& operator*()     { return *this; }
+   back_move_insert_iterator& operator++()    { return *this; }
+   back_move_insert_iterator& operator++(int) { return *this; }
+};
+
+//!
+//! <b>Returns</b>: back_move_insert_iterator<C>(x).
+template <typename C> // C models Container
+inline back_move_insert_iterator<C> back_move_inserter(C& x)
+{
+   return back_move_insert_iterator<C>(x);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         front_move_insert_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! A move insert iterator that move constructs elements int the
+//! front of a container
+template <typename C> // C models Container
+class front_move_insert_iterator
+   : public std::iterator<std::output_iterator_tag, void, void, void, void>
+{
+   C* container_m;
+
+public:
+   typedef C container_type;
+
+   explicit front_move_insert_iterator(C& x) : container_m(&x) { }
+
+   front_move_insert_iterator& operator=(typename C::reference x)
+   { container_m->push_front(boost::move(x)); return *this; }
+
+   front_move_insert_iterator& operator*()     { return *this; }
+   front_move_insert_iterator& operator++()    { return *this; }
+   front_move_insert_iterator& operator++(int) { return *this; }
+};
+
+//!
+//! <b>Returns</b>: front_move_insert_iterator<C>(x).
+template <typename C> // C models Container
+inline front_move_insert_iterator<C> front_move_inserter(C& x)
+{
+   return front_move_insert_iterator<C>(x);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                         insert_move_iterator
+//
+//////////////////////////////////////////////////////////////////////////////
+template <typename C> // C models Container
+class move_insert_iterator
+   : public std::iterator<std::output_iterator_tag, void, void, void, void>
+{
+   C* container_m;
+   typename C::iterator pos_;
+
+   public:
+   typedef C container_type;
+
+   explicit move_insert_iterator(C& x, typename C::iterator pos)
+      : container_m(&x), pos_(pos)
+   {}
+
+   move_insert_iterator& operator=(typename C::reference x)
+   {
+      pos_ = container_m->insert(pos_, boost::move(x));
+      ++pos_;
+      return *this;
+   }
+
+   move_insert_iterator& operator*()     { return *this; }
+   move_insert_iterator& operator++()    { return *this; }
+   move_insert_iterator& operator++(int) { return *this; }
+};
+
+//!
+//! <b>Returns</b>: move_insert_iterator<C>(x, it).
+template <typename C> // C models Container
+inline move_insert_iterator<C> move_inserter(C& x, typename C::iterator it)
+{
+   return move_insert_iterator<C>(x, it);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+//! <b>Effects</b>: Moves elements in the range [first,last) into the range [result,result + (last -
+//!   first)) starting from first and proceeding to last. For each non-negative integer n < (last-first),
+//!   performs *(result + n) = boost::move (*(first + n)).
+//!
+//! <b>Effects</b>: result + (last - first).
+//!
+//! <b>Requires</b>: result shall not be in the range [first,last).
+//!
+//! <b>Complexity</b>: Exactly last - first move assignments.
+template <typename I, // I models InputIterator
+          typename O> // O models OutputIterator
+O move(I f, I l, O result)
+{
+   while (f != l) {
+      *result = boost::move(*f);
+      ++f; ++result;
+   }
+   return result;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               move_backward
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>: Moves elements in the range [first,last) into the range
+//!   [result - (last-first),result) starting from last - 1 and proceeding to
+//!   first. For each positive integer n <= (last - first),
+//!   performs *(result - n) = boost::move(*(last - n)).
+//!
+//! <b>Requires</b>: result shall not be in the range [first,last).
+//!
+//! <b>Returns</b>: result - (last - first).
+//!
+//! <b>Complexity</b>: Exactly last - first assignments.
+template <typename I, // I models BidirectionalIterator
+typename O> // O models BidirectionalIterator
+O move_backward(I f, I l, O result)
+{
+   while (f != l) {
+      --l; --result;
+      *result = boost::move(*l);
+   }
+   return result;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                               uninitialized_move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; first != last; ++result, ++first)
+//!      new (static_cast<void*>(&*result))
+//!         typename iterator_traits<ForwardIterator>::value_type(boost::move(*first));
+//!   \endcode
+//!
+//! <b>Returns</b>: result
+template
+   <typename I, // I models InputIterator
+    typename F> // F models ForwardIterator
+F uninitialized_move(I f, I l, F r
+   /// @cond
+   ,typename enable_if<is_movable<typename std::iterator_traits<I>::value_type> >::type* = 0
+   /// @endcond
+   )
+{
+   typedef typename std::iterator_traits<I>::value_type input_value_type;
+   while (f != l) {
+      ::new(static_cast<void*>(&*r)) input_value_type(boost::move(*f));
+      ++f; ++r;
+   }
+   return r;
+}
+
+/// @cond
+
+template
+   <typename I,   // I models InputIterator
+    typename F>   // F models ForwardIterator
+F uninitialized_move(I f, I l, F r,
+   typename disable_if<is_movable<typename std::iterator_traits<I>::value_type> >::type* = 0)
+{
+   return std::uninitialized_copy(f, l, r);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//                            uninitialized_copy_or_move
+//
+//////////////////////////////////////////////////////////////////////////////
+
+namespace move_detail {
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+F uninitialized_move_move_iterator(I f, I l, F r,
+                             typename enable_if< is_movable<typename I::value_type> >::type* = 0)
+{
+   return boost::uninitialized_move(f, l, r);
+}
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+F uninitialized_move_move_iterator(I f, I l, F r,
+                                   typename disable_if< is_movable<typename I::value_type> >::type* = 0)
+{
+   return std::uninitialized_copy(f.base(), l.base(), r);
+}
+
+}  //namespace move_detail {
+
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+F uninitialized_copy_or_move(I f, I l, F r,
+                             typename enable_if< move_detail::is_move_iterator<I> >::type* = 0)
+{
+   return boost::move_detail::uninitialized_move_move_iterator(f, l, r);
+}
+
+/// @endcond
+
+//! <b>Effects</b>:
+//!   \code
+//!   for (; first != last; ++result, ++first)
+//!      new (static_cast<void*>(&*result))
+//!         typename iterator_traits<ForwardIterator>::value_type(*first);
+//!   \endcode
+//!
+//! <b>Returns</b>: result
+//!
+//! <b>Note</b>: This function is provided because
+//!   <i>std::uninitialized_copy</i> from some STL implementations
+//!    is not compatible with <i>move_iterator</i>
+template
+<typename I,   // I models InputIterator
+typename F>   // F models ForwardIterator
+F uninitialized_copy_or_move(I f, I l, F r
+   /// @cond
+   ,typename disable_if< move_detail::is_move_iterator<I> >::type* = 0
+   /// @endcond
+   )
+{
+   return std::uninitialized_copy(f, l, r);
+}
+
+///has_trivial_destructor_after_move<> == true_type
+///specialization for optimizations
+template <class T>
+struct has_trivial_destructor_after_move
+   : public boost::has_trivial_destructor<T>
+{};
+
+}  //namespace boost {
+
+#endif	//#ifndef BOOST_MOVE_HPP
Added: sandbox/move/libs/move/doc/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/doc/Jamfile.v2	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,38 @@
+#  Boost.Move library documentation Jamfile
+#
+#  Copyright Ion Gaztanaga 2009. 
+#  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/move for documentation.
+
+
+import doxygen ;
+import quickbook ;
+
+doxygen autodoc
+   :
+      [ glob ../../../boost/move/*.hpp ]
+   :
+   <doxygen:param>HIDE_UNDOC_MEMBERS=YES
+   <doxygen:param>HIDE_UNDOC_MEMBERS=YES
+   <doxygen:param>HIDE_UNDOC_CLASSES=YES
+   <doxygen:param>EXTRACT_PRIVATE=NO
+   <doxygen:param>ENABLE_PREPROCESSING=YES
+   <doxygen:param>MACRO_EXPANSION=YES
+   <doxygen:param>"PREDEFINED=\"BOOST_MOVE_DOXYGEN_INVOKED\""
+   ;
+
+xml move : move.qbk ;
+
+boostbook standalone
+   :
+      move
+   :
+        <xsl:param>boost.root=../../../..
+        <xsl:param>boost.libraries=../../../../libs/libraries.htm
+        <xsl:param>generate.section.toc.level=3
+        <xsl:param>chunk.first.sections=1
+        <dependency>autodoc
+   ;
Added: sandbox/move/libs/move/doc/html/boostbook.css
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/doc/html/boostbook.css	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,538 @@
+/*=============================================================================
+    Copyright (c) 2004 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to 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)
+=============================================================================*/
+
+/*=============================================================================
+    Body defaults
+=============================================================================*/
+
+    body 
+    {
+        margin: 1em;
+        font-family: sans-serif;
+    }
+
+/*=============================================================================
+    Paragraphs
+=============================================================================*/
+
+    p 
+    {
+        text-align: left;
+        font-size: 10pt; 
+        line-height: 1.15;
+    }
+
+/*=============================================================================
+    Program listings
+=============================================================================*/
+
+    /* Code on paragraphs */
+    p tt.computeroutput
+    {
+        font-size: 10pt;
+    }
+
+    pre.synopsis
+    {
+        font-size: 10pt;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+
+    .programlisting, 
+    .screen
+    {
+        font-size: 10pt;
+        display: block;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+
+/*=============================================================================
+    Headings
+=============================================================================*/
+
+    h1, h2, h3, h4, h5, h6 
+    { 
+        text-align: left;
+        margin: 1em 0em 0.5em 0em;
+        font-weight: bold;
+    }
+
+    h1 { font: 140% }
+    h2 { font: bold 140% }
+    h3 { font: bold 130% }
+    h4 { font: bold 120% }
+    h5 { font: italic 110% }
+    h6 { font: italic 100% }
+
+    /* Top page titles */
+    title, 
+    h1.title, 
+    h2.title
+    h3.title, 
+    h4.title, 
+    h5.title, 
+    h6.title, 
+    .refentrytitle
+    {
+        font-weight: bold;
+        margin-bottom: 1pc;
+    }
+
+    h1.title { font-size: 140% }
+    h2.title { font-size: 140% }
+    h3.title { font-size: 130% }
+    h4.title { font-size: 120% }
+    h5.title { font-size: 110% }
+    h6.title { font-size: 100% }
+
+    .section h1 
+    {
+        margin: 0em 0em 0.5em 0em;
+        font-size: 140%;
+    }
+
+    .section h2 { font-size: 140% }
+    .section h3 { font-size: 130% }
+    .section h4 { font-size: 120% }
+    .section h5 { font-size: 110% }
+    .section h6 { font-size: 100% }
+
+    /* Code on titles */
+    h1 tt.computeroutput { font-size: 140% }
+    h2 tt.computeroutput { font-size: 140% }
+    h3 tt.computeroutput { font-size: 130% }
+    h4 tt.computeroutput { font-size: 120% }
+    h5 tt.computeroutput { font-size: 110% }
+    h6 tt.computeroutput { font-size: 100% }
+
+/*=============================================================================
+    Author
+=============================================================================*/
+
+    h3.author 
+    { 
+        font-size: 100% 
+    }
+
+/*=============================================================================
+    Lists
+=============================================================================*/
+
+    li
+    {
+        font-size: 10pt;
+        line-height: 1.3;
+    }
+
+    /* Unordered lists */
+    ul 
+    {
+        text-align: left;
+    }
+
+    /* Ordered lists */
+    ol 
+    {
+        text-align: left;
+    }
+
+/*=============================================================================
+    Links
+=============================================================================*/
+
+    a
+    {
+        text-decoration: none; /* no underline */
+    }
+
+    a:hover
+    {
+        text-decoration: underline;
+    }
+
+/*=============================================================================
+    Spirit style navigation
+=============================================================================*/
+
+    .spirit-nav
+    {
+        text-align: right;
+    }
+
+    .spirit-nav a
+    {
+        color: white;
+        padding-left: 0.5em;
+    }
+
+    .spirit-nav img
+    {
+        border-width: 0px;
+    }
+
+/*=============================================================================
+    Table of contents
+=============================================================================*/
+
+    .toc
+    {
+       margin: 1pc 4% 0pc 4%;
+       padding: 0.1pc 1pc 0.1pc 1pc;
+       font-size: 10pt;
+       line-height: 1.15;
+    }
+
+    .toc-main
+    {
+     width: 600;
+    text-align: center;
+       margin: 1pc 1pc 1pc 10%;
+       padding: 2pc 1pc 3pc 1pc;
+    line-height: 0.1;
+    }
+
+    .boost-toc
+    {
+       float: right;
+       padding: 0.5pc;
+    }
+
+/*=============================================================================
+    Tables
+=============================================================================*/
+
+    .table-title, 
+    div.table p.title
+    {
+        margin-left: 4%;
+        padding-right: 0.5em; 
+        padding-left: 0.5em;
+    }
+
+    .informaltable table, 
+    .table table
+    {
+        width: 92%;
+        margin-left: 4%;
+        margin-right: 4%;
+    }
+
+    div.informaltable table, 
+    div.table table
+    {
+        padding: 4px;
+    }
+
+    /* Table Cells */
+    div.informaltable table tr td, 
+    div.table table tr td
+    {
+        padding: 0.5em;
+        text-align: left;
+    }
+
+    div.informaltable table tr th, 
+    div.table table tr th
+    {
+        padding: 0.5em 0.5em 0.5em 0.5em;
+        border: 1pt solid white;
+        font-size: 120%;
+    }
+
+/*=============================================================================
+    Blurbs
+=============================================================================*/
+
+    div.note,
+    div.tip,
+    div.important,
+    div.caution,
+    div.warning,
+    p.blurb
+    {
+        font-size: 10pt;
+        line-height: 1.2;
+        display: block;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+
+    p.blurb img
+    {
+        padding: 1pt;
+    }
+
+/*=============================================================================
+    Variable Lists
+=============================================================================*/
+
+    span.term
+    {
+        font-weight: bold;
+        font-size: 10pt;
+    }
+
+    div.variablelist table tbody tr td
+    {
+        text-align: left;
+        vertical-align: top;
+        padding: 0em 2em 0em 0em;
+        font-size: 10pt;
+    }
+
+    div.variablelist table tbody tr td p
+    {
+        margin: 0em 0em 0.5em 0em;
+    }
+
+    /* Make the terms in definition lists bold */
+    div.variablelist dl dt
+    {
+        font-weight: bold;
+        font-size: 10pt;
+    }
+
+    div.variablelist dl dd
+    {
+        margin: 1em 0em 1em 2em;
+        font-size: 10pt;
+    }
+
+/*=============================================================================
+    Misc
+=============================================================================*/
+
+    /* Title of books and articles in bibliographies */
+    span.title
+    {
+        font-style: italic;
+    }
+
+    span.underline
+    {
+        text-decoration: underline;
+    }
+
+    span.strikethrough
+    {
+        text-decoration: line-through;
+    }
+
+    /* Copyright, Legal Notice */
+    div div.legalnotice p
+    {
+        font-size: 8pt;
+        text-align: left
+    }
+
+/*=============================================================================
+    Colors
+=============================================================================*/
+
+    @media screen
+    {
+        /* Links */
+        a
+        {
+            color: #0C7445;
+        }
+
+        a:visited
+        {
+            color: #663974;
+        }
+
+        h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
+        h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover,
+        h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited
+        {
+            text-decoration: none; /* no underline */
+            color: #000000;
+        }
+
+        /* Syntax Highlighting */
+        .keyword        { color: #0000AA; }
+        .identifier     { color: #000000; }
+        .special        { color: #707070; }
+        .preprocessor   { color: #402080; }
+        .char           { color: teal; }
+        .comment        { color: #800000; }
+        .string         { color: teal; }
+        .number         { color: teal; }
+        .white_bkd      { background-color: #E8FBE9; }
+        .dk_grey_bkd    { background-color: #A0DAAC; }
+
+        /* Copyright, Legal Notice */
+        .copyright
+        { 
+            color: #666666; 
+            font-size: small; 
+        }
+
+        div div.legalnotice p
+        {
+            color: #666666;
+        }
+
+        /* Program listing */
+        pre.synopsis
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            background-color: #FAFFFB;
+        }
+
+        .programlisting, 
+        .screen
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            background-color: #FAFFFB;
+        }
+
+        /* Blurbs */
+        div.note,
+        div.tip,
+        div.important,
+        div.caution,
+        div.warning,
+        p.blurb
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            background-color: #FAFFFB;
+        }
+
+        /* Table of contents */
+        .toc
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            background-color: #FAFFFB;
+        }
+
+        /* Table of contents */
+        .toc-main
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            background-color: #FAFFFB;
+        }
+
+
+        /* Tables */
+        div.informaltable table tr td, 
+        div.table table tr td
+        {
+            border: 1px solid #DCDCDC;
+            background-color: #FAFFFB;
+        }
+
+        div.informaltable table tr th, 
+        div.table table tr th
+        {
+            background-color: #E3F9E4;
+            border: 1px solid #DCDCDC;
+        }
+
+        /* Misc */
+        span.highlight
+        {
+            color: #00A000;
+        }
+    }
+
+    @media print
+    {
+        /* Links */
+        a
+        {
+            color: black;
+        }
+
+        a:visited
+        {
+            color: black;
+        }
+
+        .spirit-nav
+        {
+            display: none;
+        }
+
+        /* Program listing */
+        pre.synopsis
+        {
+            border: 1px solid gray;
+            background-color: #FAFFFB;
+        }
+
+        .programlisting, 
+        .screen
+        {
+            border: 1px solid gray;
+            background-color: #FAFFFB;
+        }
+
+        /* Table of contents */
+        .toc
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            background-color: #FAFFFB;
+        }
+
+        /* Table of contents */
+        .toc-main
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            background-color: #FAFFFB;
+        }
+
+        .informaltable table, 
+        .table table
+        {
+            border: 1px solid #DCDCDC;
+            border-bottom: 3px solid #9D9D9D;
+            border-right: 3px solid #9D9D9D;
+            border-collapse: collapse;
+            background-color: #FAFFFB;
+        }
+
+        /* Tables */
+        div.informaltable table tr td, 
+        div.table table tr td
+        {
+            border: 1px solid #DCDCDC;
+            background-color: #FAFFFB;
+        }
+
+        div.informaltable table tr th, 
+        div.table table tr th
+        {
+            border: 1px solid #DCDCDC;
+            background-color: #FAFFFB;
+        }
+
+        /* Misc */
+        span.highlight
+        {
+            font-weight: bold;
+        }
+    }
Added: sandbox/move/libs/move/doc/html/images/blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/caution.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/draft.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/home.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/important.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/next.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/note.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/prev.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/tip.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/toc-blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/toc-minus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/toc-plus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/up.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/images/warning.png
==============================================================================
Binary file. No diff available.
Added: sandbox/move/libs/move/doc/html/reference.css
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/doc/html/reference.css	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,13 @@
+/*=============================================================================
+    Copyright (c) 2004 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to 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)
+=============================================================================*/
+PRE.synopsis { 
+  background-color: #e0ffff;
+  border: thin solid blue;
+  padding: 1em
+}
Added: sandbox/move/libs/move/doc/move.qbk
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/doc/move.qbk	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,541 @@
+[/
+ / Copyright (c) 2008-2009 Ion Gaztanaga
+ /
+ / 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)
+ /]
+
+[library Boost.Move
+    [quickbook 1.3]
+    [authors [Gaztañaga, Ion]]
+    [copyright 2008-2009 Ion Gaztañaga]
+    [id move]
+    [dirname move]
+    [purpose Move semantics]
+    [license
+        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])
+    ]
+]
+
+[warning This library is NOT an official Boost library]
+
+[important To be able to use containers of movable values you will need an special version
+ of [*Boost.Container] bundled with this library]
+
+[section:introduction Introduction]
+
+[note
+
+  The first 3 chapters are the adapted from the article
+ [@http://www.artima.com/cppsource/rvalue.html ['A Brief Introduction to Rvalue References]]
+ by Howard E. Hinnant, Bjarne Stroustrup, and Bronek Kozicki
+
+]
+
+Copying can be expensive. For example, for vectors `v2=v1` typically involves a function call,
+a memory allocation, and a loop. This is of course acceptable where we actually need two copies of
+a vector, but in many cases, we don't: We often copy a `vector` from one place to another, just to
+proceed to overwrite the old copy. Consider: 
+
+[c++]
+
+   template <class T> swap(T& a, T& b)
+   {
+      T tmp(a);   // now we have two copies of a
+      a = b;      // now we have two copies of b
+      b = tmp;    // now we have two copies of tmp (aka a)
+   }
+
+But, we didn't want to have any copies of a or b, we just wanted to swap them. Let's try again: 
+
+[c++]
+
+   template <class T> swap(T& a, T& b)
+   {
+      T tmp(boost::move(a));
+      a = boost::move(b);   
+      b = boost::move(tmp);
+   }
+
+This `move()` gives its target the value of its argument, but is not obliged to preserve the value
+of its source. So, for a `vector`, `move()` could reasonably be expected to leave its argument as
+a zero-capacity vector to avoid having to copy all the elements. In other words, [*move is a potentially
+destructive copy].
+
+In this particular case, we could have optimized swap by a specialization. However, we can't
+specialize every function that copies a large object just before it deletes or overwrites it. That
+would be unmanageable. 
+
+In C++0x, move semantics are implemented with the introduction of rvalue references. They allow us to
+implement `move()` without verbosity or runtime overhead. [*Boost.Move] is a library that offers tools
+to implement those move semantics not only in compilers with `rvalue references` but also in compilers
+conforming to C++03.
+
+[endsect]
+
+[section:implementing_movable_classes Implementing movable classes]
+
+[import ../example/doc_clone_ptr.cpp]
+
+Consider a simple handle class that owns a resource and also provides copy semantics
+(copy constructor and assignment). For example a `clone_ptr` might own a pointer, and call
+`clone()` on it for copying purposes: 
+
+[c++]
+
+   template <class T>
+   class clone_ptr
+   {
+      private:
+      T* ptr;
+
+      public:
+      // construction
+      explicit clone_ptr(T* p = 0) : ptr(p) {}
+
+      // destruction
+      ~clone_ptr() { delete ptr; }
+
+      // copy semantics
+      clone_ptr(const clone_ptr& p)
+         : ptr(p.ptr ? p.ptr->clone() : 0) {}
+
+      clone_ptr& operator=(const clone_ptr& p)
+      {
+         if (this != &p)
+         {
+            T *p = p.ptr ? p.ptr->clone() : 0;
+            delete ptr;
+            ptr = p;
+         }
+         return *this;
+      }
+
+      // move semantics
+      clone_ptr(clone_ptr&& p)
+         : ptr(p.ptr) { p.ptr = 0; }
+
+      clone_ptr& operator=(clone_ptr&& p)
+      {
+         std::swap(ptr, p.ptr);
+         delete p.ptr;
+         p.ptr = 0;
+         return *this;
+      }
+
+      // Other operations...
+   };
+
+`clone_ptr` has expected copy constructor and assignment semantics, duplicating resources when copying.
+Note that copy constructing or assigning a `clone_ptr` is a relatively expensive operation: 
+
+[copy_clone_ptr]
+
+`clone_ptr` is code that you might find in today's books on C++, except for the part marked as
+`move semantics`. That part is implemented in terms of C++0x `rvalue references`. You can find
+some good introduction and tutorials on rvalue references in these papers:
+
+*  [@http://www.artima.com/cppsource/rvalue.html ['A Brief Introduction to Rvalue References]]
+*  [@http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx ['Rvalue References: C++0x Features in VC10, Part 2]]
+
+When the source of the copy is known to be an `rvalue` (e.g.: a temporary object), one can avoid the
+potentially expensive `clone()` operation by pilfering source's pointer (no one will notice!). The move
+constructor above does exactly that, leaving the rvalue in a default constructed state. The move assignment
+operator simply does the same freeing old resources.
+
+Now when code tries to copy an rvalue `clone_ptr`, or if that code explicitly gives permission to
+consider the source of the copy an rvalue (using `boost::move`), the operation will execute much faster. 
+
+[move_clone_ptr]
+
+Many aspects of move semantics can be emulated for compilers not supporting `rvalue references`
+and [*Boost.Move] offers tools for that purpose. With [*Boost.Move] we can write code that
+will work both in compilers with rvalue references and those who conform to C++03:
+
+[clone_ptr_def]
+
+For compilers with rvalue references `BOOST_ENABLE_MOVE_EMULATION(TYPE)` macro is expanded to nothing
+and `BOOST_RV_REF` to `TYPE &&` so we obtain exactly the same code we've presented in the beginning
+of this chapter.
+
+For compilers without rvalue references, `BOOST_ENABLE_MOVE_EMULATION(TYPE)` is expaded to a
+conversion operator that will allow `boost::move` to work:
+
+[c++]
+
+   operator boost::rv<TYPE>&()
+   {  return static_cast<boost::rv<TYPE>& >(*this);   }
+
+and `BOOST_RV_REF` is expanded to `boost::rv<TYPE> &`, a non-instantiable type derived from T, and
+thus, it's similar to a reference to that class:
+
+[c++]
+
+   template <class T>
+   class rv : public T
+   {
+      //Non-instantiable...
+      public:
+      T &get() { return *this; }
+   };
+
+For classes made up of other classes (via either containment or inheritance), the move constructor
+and move assignment can be easily coded using the `boost::move` function:
+
+[clone_ptr_base_derived]
+
+Each subobject will now be treated individually, calling move to bind to the subobject's move
+constructors and move assignment operators. `Member` has move operations coded (just like
+our earlier `clone_ptr` example) which will completely avoid the tremendously more expensive
+copy operations:
+
+[clone_ptr_move_derived]
+
+Note above that the argument x is treated as a lvalue reference. That's why it is necessary to
+say `move(x)` instead of just x when passing down to the base class. This is a key safety feature of move
+semantics designed to prevent accidently moving twice from some named variable. All moves occur
+explicitly.
+
+[*Question]: What about types that don't own resources? (E.g. `std::complex`?) 
+
+No work needs to be done in that case. The copy constructor is already optimal.
+
+[endsect]
+
+[section:movable_only_classes Movable but Non-Copyable Types]
+
+Some types are not amenable to copy semantics but can still be made movable. For example: 
+
+*  `unique_ptr` (non-shared, non-copyable ownership) 
+*  A type representing a thread of execution
+*  A type representing a file descriptor
+
+By making such types movable (though still non-copyable) their utility is tremendously
+increased. Movable but non-copyable types can be returned by value from factory functions:
+
+[c++]
+
+   file_descriptor create_file(/* ... */);
+   //...
+   file_descriptor data_file = create_file(/* ... */);  // No copies!
+
+In the above example, the underlying file handle is passed from object to object, as long
+as the source `file_descriptor` is an rvalue. At all times, there is still only one underlying file
+handle, and only one `file_descriptor` owns it at a time. Here's the definition of `file descriptor`:
+
+[import ../example/doc_file_descriptor.cpp]
+[file_descriptor_def]
+
+Movable but non-copyable types can also safely be put into containers if those containers
+are aware of move semantics. If the container needs to "copy" an element internally
+(e.g. vector reallocation) it will move the element instead of copying it.
+[*Boost.Container] containers are move-aware:
+
+[file_descriptor_example]
+
+[/
+ /Many standard algorithms benefit from moving elements of the sequence as opposed to
+ /copying them. This not only provides better performance (like the improved `swap`
+ /implementation described above), but also allows these algorithms to operate on movable
+ /but non-copyable types. For example the following code sorts a `vector<unique_ptr<T>>`
+ /based on comparing the pointed-to types: 
+ /
+ /[c++]
+ /
+ /   struct indirect_less
+ /   {
+ /      template <class T>
+ /      bool operator()(const T& x, const T& y)
+ /         {return *x < *y;}
+ /   };
+ /   ...
+ /   std::vector<std::unique_ptr<A>> v;
+ /   ...
+ /   std::sort(v.begin(), v.end(), indirect_less());
+ /
+ /
+ /As sort moves the unique_ptr's around, it will use swap (which no longer requires Copyability)
+ /or move construction / move assignment. Thus during the entire algorithm, the invariant that
+ /each item is owned and referenced by one and only one smart pointer is maintained. If the
+ /algorithm were to attempt a copy (say by programming mistake) a compile time error would result. 
+ /]
+
+[endsect]
+
+[section:construct_forwarding Constructor Forwarding]
+
+Consider writing a generic factory function that returns an object for a newly
+constructed generic type. Factory functions such as this are valuable for encapsulating
+and localizing the allocation of resources. Obviously, the factory function must accept
+exactly the same sets of arguments as the constructors of the type of objects constructed:
+
+[c++]
+
+   template<class T> T* factory_new()
+   {  return new T();  }
+
+   template<class T> T* factory_new(a1)
+   {  return new T(a1);  }
+
+   template<class T> T* factory_new(a1, a2)
+   {  return new T(a1, a2);  }
+
+Unfortunately, in C++03 the much bigger issue with this approach is that the N-argument case
+would require 2^N overloads, immediately discounting this as a general solution. Fortunately,
+most constructors take arguments by value, by const-reference or by rvalue reference. If these
+limitations are accepted, the forwarding emulation of a N-argument case requires just N overloads.
+This library makes this emulation easy with the help of `BOOST_FWD_REF` and
+`boost::forward`:
+
+[import ../example/doc_construct_forward.cpp]
+[construct_forward_example]
+
+In compilers wit rvalue references `BOOST_FWD_REF(TYPE)` expands to `TYPE &&` and
+`boost::forward` implements perfect forwarding. Otherwise
+`BOOST_FWD_REF(TYPE)` expands to `const TYPE &` and `boost::forward`
+behaviour depends on the argument type:
+
+* If TYPE is boost::rv<T>, then return a non-const reference `boost::rv<T> &`.
+* Otherwise, just returns the input const reference.
+
+Constructor forwarding comes handful to implement placement insertion in containers with
+just N overloads if the implementor accepts the limitations of this type of forwarding for
+C++03 compilers. In compilers with rvalue references perfect forwarding is achieved.
+
+[endsect]
+
+[/[section:perfect_forwarding Perfect Forwarding]
+ /
+ /Consider writing a generic factory function that returns a std::shared_ptr for a newly
+ /constructed generic type. Factory functions such as this are valuable for encapsulating
+ /and localizing the allocation of resources. Obviously, the factory function must accept
+ /exactly the same sets of arguments as the constructors of the type of objects constructed.
+ /Today this might be coded as: 
+ /
+ /[c++]
+ /
+ /   template <class T>
+ /   std::shared_ptr<T>
+ /   factory()   // no argument version
+ /   {
+ /      return std::shared_ptr<T>(new T);
+ /   }
+ /
+ /   template <class T, class A1>
+ /   std::shared_ptr<T>
+ /   factory(const A1& a1)   // one argument version
+ /   {
+ /      return std::shared_ptr<T>(new T(a1));
+ /   }
+ /
+ /   // all the other versions
+ /
+ /
+ /In the interest of brevity, we will focus on just the one-parameter version. For example: 
+ /
+ / [c++]
+ /
+ /    std::shared_ptr<A> p = factory<A>(5);
+ /
+ /
+ / [*Question]: What if T's constructor takes a parameter by non-const reference? 
+ /
+ / In that case, we get a compile-time error as the const-qualifed argument of the factory
+ / function will not bind to the non-const parameter of T's constructor. 
+ /
+ / To solve that problem, we could use non-const parameters in our factory functions: 
+ /
+ / [c++]
+ /
+ /    template <class T, class A1>
+ /    std::shared_ptr<T>
+ /    factory(A1& a1)
+ /    {
+ /       return std::shared_ptr<T>(new T(a1));
+ /    }
+ /
+ /
+ / This is much better. If a const-qualified type is passed to the factory, the const will
+ / be deduced into the template parameter (A1 for example) and then properly forwarded to
+ / T's constructor. Similarly, if a non-const argument is given to factory, it will be
+ / correctly forwarded to T's constructor as a non-const. Indeed, this is precisely how
+ /forwarding applications are coded today (e.g. `std::bind`). 
+ /
+ /However, consider: 
+ /
+ /[c++]
+ /
+ /   std::shared_ptr<A> p = factory<A>(5);	// error
+ /   A* q = new A(5);	                // ok
+ /
+ /
+ /This example worked with our first version of factory, but now it's broken: The "5"
+ /causesthe factory template argument to be deduced as int& and subsequently will not
+ /bind to the rvalue "5". Neither solution so far is right. Each breaks reasonable and
+ /common code. 
+ /
+ /[*Question]: What about overloading on every combination of AI& and const AI&? 
+ /
+ /This would allow use to handle all examples, but at a cost of an exponential explosion:
+ /For our two-parameter case, this would require 4 overloads. For a three-parameter factory
+ /we would need 8 additional overloads. For a four-parameter factory we would need 16, and
+ /so on. This is not a scalable solution. 
+ /
+ /Rvalue references offer a simple, scalable solution to this problem: 
+ /
+ /[c++]
+ /
+ /  template <class T, class A1>
+ /  std::shared_ptr<T>
+ /  factory(A1&& a1)
+ /  {
+ /     return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
+ /  }
+ /
+ / Now rvalue arguments can bind to the factory parameters. If the argument is const, that
+ / fact gets deduced into the factory template parameter type. 
+ /
+ / [*Question]: What is that forward function in our solution? 
+ /
+ / Like move, forward is a simple standard library function used to express our intent
+ / directly and explicitly, rather than through potentially cryptic uses of references.
+ / We want to forward the argument a1, so we simply say so. 
+ /
+ / Here, forward preserves the lvalue/rvalue-ness of the argument that was passed to factory.
+ / If an rvalue is passed to factory, then an rvalue will be passed to T's constructor with
+ / the help of the forward function. Similarly, if an lvalue is passed to factory, it is
+ / forwarded to T's constructor as an lvalue. 
+ /
+ / The definition of forward looks like this: 
+ /
+ / [c++]
+ /
+ /    template <class T>
+ /   struct identity
+ /   {
+ /      typedef T type;
+ /   };
+ /
+ /   template <class T>
+ /   T&& forward(typename identity<T>::type&& a)
+ /   {
+ /      return a;
+ /   }
+ /
+ /[endsect]
+ /
+ /]
+
+[section:move_iterator Move iterators]
+
+[c++]
+
+   template<class Iterator>
+   class move_iterator;
+
+   template<class It>
+   move_iterator<It> make_move_iterator(const It &it);
+
+[classref boost::move_iterator move_iterator] is an iterator adaptor with the
+same behavior as the underlying iterator
+except that its dereference operator implicitly converts the value returned by the
+underlying iterator's dereference operator to an rvalue reference: `boost::move(*underlying_iterator)`
+It is a read-once iterator, but can have up to random access traversal characteristics.
+
+`move_iterator` is very useful because some generic algorithms and container insertion functions
+can be called with move iterators to replace copying with moving. For example:
+
+[import ../example/movable.hpp]
+[movable_definition]
+
+`movable` objects can be moved from one container to another using move iterators and insertion
+and assignment operations.w
+
+[import ../example/doc_move_iterator.cpp]
+[move_iterator_example]
+
+[endsect]
+
+[section:move_inserters Move inserters]
+
+Similar to standard insert iterators, it's possible to deal with move insertion in the same way
+as writing into an array. A special kind of iterator adaptors, called move insert iterators, are
+provided with this library. With regular iterator classes,
+
+[c++]
+
+   while (first != last) *result++ = *first++;
+
+causes a range [first,last) to be copied into a range starting with result. The same code with
+result being an move insert iterator will move insert corresponding elements into the container.
+This device allows all of the copying algorithms in the library to work in the move insert mode
+instead of the regular overwrite mode. This library offers 3 move insert iterators and their
+helper functions:
+
+[c++]
+
+   // Note: C models Container
+   template <typename C> 
+   class back_move_insert_iterator;
+
+   template <typename C>
+   back_move_insert_iterator<C> back_move_inserter(C& x);
+
+   template <typename C>
+   class front_move_insert_iterator;
+
+   template <typename C>
+   front_move_insert_iterator<C> front_move_inserter(C& x);
+
+   template <typename C>
+   class move_insert_iterator;
+
+   template <typename C>
+   move_insert_iterator<C> move_inserter(C& x, typename C::iterator it);
+
+
+A move insert iterator is constructed from a container and possibly one of its iterators pointing
+to where insertion takes place if it is neither at the beginning nor at the end of the container.
+Insert iterators satisfy the requirements of output iterators. `operator*` returns the move insert
+iterator itself. The assignment `operator=(T& x)` is defined on insert iterators to allow writing
+into them, it inserts x right before where the insert iterator is pointing. In other words, an
+`insert iterator` is like a cursor pointing into the container where the insertion takes place.
+`back_move_iterator` move inserts elements at the end of a container, `front_insert_iterator`
+move inserts elements at the beginning of a container, and `move_insert_iterator` move inserts
+elements where the iterator points to in a container. `back_move_inserter`, `front_move_inserter`,
+and `move_inserter` are three functions making the insert iterators out of a container. Here's
+an example of how to use them:
+
+[import ../example/doc_move_inserter.cpp]
+[move_inserter_example]
+
+[endsect]
+
+[section:move_algorithms Move algorithms]
+
+The standard library offers several copy-based algorithms. Some of them, like `std::copy` or
+`std::uninitialized_copy` are basic building blocks for containers and other data structures.
+This library offers move-based functions for those purposes:
+
+[c++]
+
+  template<typename I, typename O> O move(I, I, O);
+  template<typename I, typename O> O move_backward(I, I, O);
+  template<typename I, typename F> F uninitialized_move(I, I, F);
+  template<typename I, typename F> F uninitialized_copy_or_move(I, I, F);
+
+
+The first 3 are move variations of their equivalent copy algorithms, but copy assignment and
+copy construction are replaced with move assignment and construction. The last one has the
+same behaviour as `std::uninitialized_copy` but since several standand library implementations
+don't play very well with `move_iterator`s, this version is a portable version for those
+willing to use move iterators.
+
+[import ../example/doc_move_algorithms.cpp]
+[move_algorithms_example]
+
+[endsect]
+
+[xinclude autodoc.xml]
Added: sandbox/move/libs/move/example/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/Jamfile.v2	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,28 @@
+##############################################################################
+##
+## (C) Copyright Ion Gaztanaga 2008-2009 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)
+##
+##
+##############################################################################
+rule test_all
+{
+   local all_rules = ;
+
+   for local fileb in [ glob *.cpp ]
+   {
+      all_rules += [ run $(fileb)
+      :  # additional args
+      :  # test-files
+      :  # requirements
+      ] ;
+   }
+
+   return $(all_rules) ;
+}
+
+test-suite move_example : [ test_all r ] 
+: <link>static
+;
+ 
Added: sandbox/move/libs/move/example/doc_clone_ptr.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/doc_clone_ptr.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,147 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/move/move.hpp>
+#include <utility>
+
+//[clone_ptr_base_derived
+class Base
+{
+   public:
+   // Compiler-generated copy constructor and assignment 
+
+   Base(){}
+
+   // move semantics
+   BOOST_ENABLE_MOVE_EMULATION(Base)
+
+   Base(BOOST_RV_REF(Base) x) {/**/}      // Move ctor
+
+   Base& operator=(BOOST_RV_REF(Base) x)
+   {/**/ return *this;}                   // Move assign
+   
+   virtual Base *clone() const
+   {  return new Base(*this);  }
+};
+
+class Member
+{
+   public:
+   Member(){}
+
+   // Compiler-generated copy constructor and assignment 
+
+   // move semantics
+   BOOST_ENABLE_MOVE_EMULATION(Member)
+
+   Member(BOOST_RV_REF(Member))  {/**/}      // Move ctor
+
+   Member &operator=(BOOST_RV_REF(Member))   // Move assign
+   {/**/ return *this;  }
+};
+
+class Derived : public Base
+{
+   Member mem_;
+
+   public:
+   // Compiler-generated copy constructor and assignment 
+
+   Derived(){}
+
+   // move semantics
+   BOOST_ENABLE_MOVE_EMULATION(Derived)
+
+   Derived(BOOST_RV_REF(Derived) x)             // Move ctor
+      : Base(boost::move(static_cast<Base&>(x))), 
+        mem_(boost::move(x.mem_)) { }
+
+   Derived& operator=(BOOST_RV_REF(Derived) x)  // Move assign
+   {
+      Base::operator=(boost::move(static_cast<Base&>(x)));
+      mem_  = boost::move(x.mem_);
+      return *this;
+   }
+   // ...
+};
+//]
+
+//[clone_ptr_def
+template <class T>
+class clone_ptr
+{
+   //<-
+   private:
+   T* ptr;
+
+   public:
+   // construction
+   explicit clone_ptr(T* p = 0) : ptr(p) {}
+
+   // destruction
+   ~clone_ptr() { delete ptr; }
+
+   // copy semantics
+   clone_ptr(const clone_ptr& p)
+      : ptr(p.ptr ? p.ptr->clone() : 0) {}
+
+   clone_ptr& operator=(const clone_ptr& p)
+   {
+      if (this != &p)
+      {
+         T *p = p.ptr ? p.ptr->clone() : 0;
+         delete ptr;
+         ptr = p;
+      }
+      return *this;
+   }
+
+   //->
+   // Same as before ...
+
+   // move semantics
+   BOOST_ENABLE_MOVE_EMULATION(clone_ptr)
+   
+   clone_ptr(BOOST_RV_REF(clone_ptr) p)
+      : ptr(p.ptr) { p.ptr = 0; }
+
+   clone_ptr& operator=(BOOST_RV_REF(clone_ptr) p)
+   {
+      std::swap(ptr, p.ptr);
+      delete p.ptr;
+      p.ptr = 0;
+      return *this;
+   }
+};
+//]
+
+int main()
+{
+   {
+   //[copy_clone_ptr
+   clone_ptr<Base> p1(new Derived());
+   // ...
+   clone_ptr<Base> p2 = p1;  // p2 and p1 each own their own pointer
+   //]
+   }
+   {
+   //[move_clone_ptr
+   clone_ptr<Base> p1(new Derived());
+   // ...
+   clone_ptr<Base> p2 = boost::move(p1);  // p2 now owns the pointer instead of p1
+   }
+   //]
+   //[clone_ptr_move_derived
+   Derived d;
+   Derived d2(boost::move(d));
+   d2 = boost::move(d);
+   //]
+   return 0;
+}
Added: sandbox/move/libs/move/example/doc_construct_forward.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/doc_construct_forward.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,98 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//[construct_forward_example
+#include <boost/move/move.hpp>
+#include <iostream>
+
+class non_movable_test
+{
+   public:
+   non_movable_test()
+   {  std::cout << "non_movable_test()" << std::endl;   }
+
+   non_movable_test(const non_movable_test&)
+   {  std::cout << "non_movable_test(const non_movable_test&)" << std::endl;   }
+
+   non_movable_test(int)
+   {  std::cout << "non_movable_test(int)" << std::endl;   }
+
+   non_movable_test(int, double)
+   {  std::cout << "non_movable_test(int, double)" << std::endl;   }
+};
+
+class movable_test
+{
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(movable_test)
+
+   movable_test()
+   {  std::cout << "movable_test()" << std::endl;   }
+
+   movable_test(int)
+   {  std::cout << "movable_test(int)" << std::endl;   }
+
+   movable_test(BOOST_RV_REF(movable_test))
+   {  std::cout << "movable_test(BOOST_RV_REF(movable_test))" << std::endl;   }
+
+   movable_test(const movable_test &)
+   {  std::cout << "movable_test(const movable_test &)" << std::endl;   }
+
+   movable_test(BOOST_RV_REF(movable_test), BOOST_RV_REF(movable_test))
+   {  std::cout << "movable_test(BOOST_RV_REF(movable_test), BOOST_RV_REF(movable_test))" << std::endl;   }
+};
+
+//1 argument
+template<class MaybeMovable, class MaybeRv>
+void function_construct(BOOST_FWD_REF(MaybeRv) x)
+{  MaybeMovable m(boost::forward<MaybeRv>(x));   }
+
+//2 argument
+template<class MaybeMovable, class MaybeRv, class MaybeRv2>
+void function_construct(BOOST_FWD_REF(MaybeRv) x, BOOST_FWD_REF(MaybeRv2) x2)
+{
+   MaybeMovable m(boost::forward<MaybeRv>(x), boost::forward<MaybeRv2>(x2));
+}
+
+int main()
+{
+   movable_test m;
+   //move constructor
+   function_construct<movable_test>(boost::move(m));
+   //copy constructor
+   function_construct<movable_test>(movable_test());
+   //two rvalue constructor
+   function_construct<movable_test>(boost::move(m), boost::move(m));
+
+   non_movable_test nm;
+   //copy constructor (non_movable_test has no move ctor.)
+   function_construct<non_movable_test>(boost::move(nm));
+   //copy constructor
+   function_construct<non_movable_test>(nm);
+   //int constructor
+   function_construct<non_movable_test>(int(0));
+   //int, double constructor
+   function_construct<non_movable_test>(int(0), double(0.0));
+
+   //Output is:
+   //movable_test()
+   //movable_test(BOOST_RV_REF(movable_test))
+   //movable_test()
+   //movable_test(const movable_test &)
+   //movable_test(BOOST_RV_REF(movable_test), BOOST_RV_REF(movable_test))
+   //non_movable_test()
+   //non_movable_test(const non_movable_test&)
+   //non_movable_test(const non_movable_test&)
+   //non_movable_test(int)
+   //non_movable_test(int, double)
+   return 0;
+}
+//]
Added: sandbox/move/libs/move/example/doc_file_descriptor.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/doc_file_descriptor.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,87 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//[file_descriptor_def
+
+#include <boost/move/move.hpp>
+#include <stdexcept>
+
+class file_descriptor
+{
+   //<-
+   int operating_system_open_file(const char *)
+   {
+      return 1;
+   }
+
+   void operating_system_close_file(int)
+   {}
+   //->
+   int os_descr_;
+
+   file_descriptor(file_descriptor &);
+   file_descriptor & operator=(file_descriptor &);
+
+   public:
+   explicit file_descriptor(const char *filename = 0)
+      : os_descr_(filename ? operating_system_open_file(filename) : 0)
+   {  if(!os_descr_) throw std::runtime_error("file not found");  }
+
+   ~file_descriptor()
+   {  if(!os_descr_)  operating_system_close_file(os_descr_);  }
+
+   // move semantics
+   BOOST_ENABLE_MOVE_EMULATION(file_descriptor)
+
+   file_descriptor(BOOST_RV_REF(file_descriptor) x)            // Move ctor
+      :  os_descr_(x.os_descr_)
+   {  x.os_descr_ = 0;  }      
+
+   file_descriptor& operator=(BOOST_RV_REF(file_descriptor) x) // Move assign
+   {
+      if(!os_descr_) operating_system_close_file(os_descr_);
+      os_descr_   = x.os_descr_;
+      x.os_descr_ = 0;
+      return *this;
+   }
+
+   bool empty() const   {  return os_descr_ == 0;  }
+};
+
+//]
+
+//[file_descriptor_example
+#include <boost/container/vector.hpp>
+#include <cassert>
+
+file_descriptor create_file_descriptor(const char *filename)
+{  return file_descriptor(filename);  }
+
+int main()
+{
+   //Open a file obtaining its descriptor. The file_descriptor
+   //can be returned from factory functions without any copy
+   file_descriptor fd = create_file_descriptor("filename");
+   assert(!fd.empty());
+
+   //Move into a vector
+   boost::container::vector<file_descriptor> v;
+   v.push_back(boost::move(fd));
+
+   //Check ownership has been transferred
+   assert(fd.empty());
+   assert(!v[0].empty());
+
+   //Compilation error if uncommented, file_descriptor is not copyable:
+   //boost::container::vector<file_descriptor> v2(v);
+   return 0;
+}
+//]
Added: sandbox/move/libs/move/example/doc_move_algorithms.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/doc_move_algorithms.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,41 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//[move_algorithms_example
+#include "movable.hpp"
+#include <cassert>
+#include <boost/aligned_storage.hpp>
+
+int main()
+{
+   const std::size_t ArraySize = 10;
+   movable movable_array[ArraySize];
+   movable movable_array2[ArraySize];
+   //move
+   boost::move(&movable_array2[0], &movable_array2[ArraySize], &movable_array[0]);
+   assert(movable_array2[0].moved());
+   assert(!movable_array[0].moved());
+
+   //move backward
+   boost::move_backward(&movable_array[0], &movable_array[ArraySize], &movable_array2[ArraySize]);
+   assert(movable_array[0].moved());
+   assert(!movable_array2[0].moved());
+
+   //uninitialized_move
+   boost::aligned_storage< sizeof(movable)*ArraySize
+                         , boost::alignment_of<movable>::value>::type storage;
+   movable *raw_movable = static_cast<movable*>(static_cast<void*>(&storage));
+   boost::uninitialized_move(&movable_array2[0], &movable_array2[ArraySize], raw_movable);
+   assert(movable_array2[0].moved());
+   assert(!raw_movable[0].moved());
+   return 0;
+}
+//]
Added: sandbox/move/libs/move/example/doc_move_inserter.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/doc_move_inserter.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,48 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//[move_inserter_example
+#include <boost/container/list.hpp>
+#include "movable.hpp"
+#include <cassert>
+
+using namespace boost::container;
+
+typedef list<movable> list_t;
+typedef list_t::iterator l_iterator;
+
+template<class MoveInsertIterator>
+void test_move_inserter(list_t &l2, MoveInsertIterator mit)
+{
+   //Create a list with 10 default constructed objects
+   list<movable> l(10);
+   assert(!l.begin()->moved());
+   l2.clear();
+
+   //Move construct
+   for(l_iterator itbeg = l.begin(), itend = l.end(); itbeg != itend; ++itbeg){
+      *mit = *itbeg;
+   }
+   //Check size and status
+   assert(l2.size() == l.size());
+   assert(l.begin()->moved());
+   assert(!l2.begin()->moved());
+}
+
+int main()
+{
+   list_t l2;
+   test_move_inserter(l2, boost::back_move_inserter(l2));
+   test_move_inserter(l2, boost::front_move_inserter(l2));
+   test_move_inserter(l2, boost::move_inserter(l2, l2.end()));
+   return 0;
+}
+//]
Added: sandbox/move/libs/move/example/doc_move_iterator.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/doc_move_iterator.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,39 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+//[move_iterator_example
+#include <boost/container/vector.hpp>
+#include "movable.hpp"
+#include <cassert>
+
+int main()
+{
+   using namespace boost::container;
+
+   //Create a vector with 10 default constructed objects
+   vector<movable> v(10);
+   assert(!v[0].moved());
+
+   //Move construct all elements in v into v2
+   vector<movable> v2( boost::make_move_iterator(v.begin())
+                     , boost::make_move_iterator(v.end()));
+   assert(v[0].moved());
+   assert(!v2[0].moved());
+
+   //Now move assign all elements from in v2 back into v
+   v.assign( boost::make_move_iterator(v2.begin())
+           , boost::make_move_iterator(v2.end()));
+   assert(v2[0].moved());
+   assert(!v[0].moved());
+
+   return 0;
+}
+//]
Added: sandbox/move/libs/move/example/movable.hpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/example/movable.hpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,48 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_MOVE_TEST_MOVABLE_HPP
+#define BOOST_MOVE_TEST_MOVABLE_HPP
+
+//[movable_definition 
+//header file "movable.hpp"
+#include <boost/move/move.hpp>
+
+//A movable class
+class movable
+{
+   //Non-copyable
+   movable(movable &);
+   movable & operator=(movable &);
+
+   int value_;
+
+   public:
+   BOOST_ENABLE_MOVE_EMULATION(movable)
+
+   movable() : value_(1){}
+
+   //Move constructor and assignment
+   movable(BOOST_RV_REF(movable) m)
+   {  value_ = m.value_;   m.value_ = 0;  }
+
+   movable & operator=(BOOST_RV_REF(movable) m)
+   {  value_ = m.value_;   m.value_ = 0;  return *this;  }
+
+   bool moved() const //Observer
+   {  return value_ == 0; }
+
+   friend bool operator < (const movable &l, const movable &r)
+   {  return l.value_ < r.value_; }
+};
+
+//]
+
+#endif //BOOST_MOVE_TEST_MOVABLE_HPP
Added: sandbox/move/libs/move/proj/vc7ide/Move.sln
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/Move.sln	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,107 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "construct_forward_test", "construct_forward_test.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "move_iterator_test", "move_iterator_test.vcproj", "{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "move_test", "move_test.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "move_algorithm_test", "move_algorithm.vcproj", "{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_clone_ptr", "doc_clone_ptr.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_file_descriptor", "doc_file_descriptor.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_move_iterator", "doc_move_iterator.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_move_inserter", "doc_move_inserter.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_move_algorithms", "doc_move_algorithms.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doc_construct_forward", "doc_construct_forward.vcproj", "{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "back_move_inserter_test", "back_move_inserter_test.vcproj", "{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.ActiveCfg = Debug|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.Build.0 = Debug|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.ActiveCfg = Release|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.Build.0 = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.ActiveCfg = Debug|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.Build.0 = Debug|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.ActiveCfg = Release|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.Build.0 = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.ActiveCfg = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Debug.Build.0 = Debug|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.ActiveCfg = Release|Win32
+		{CD57C283-1862-42FE-BF87-B96D3A2A7912}.Release.Build.0 = Release|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.ActiveCfg = Debug|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Debug.Build.0 = Debug|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.ActiveCfg = Release|Win32
+		{C8AD2618-79EB-8612-42FE-2A3AC9667A13}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionItems) = postSolution
+		..\..\doc\Jamfile.v2 = ..\..\doc\Jamfile.v2
+		..\..\..\..\boost\move\move.hpp = ..\..\..\..\boost\move\move.hpp
+		..\..\doc\move.qbk = ..\..\doc\move.qbk
+		todo.txt = todo.txt
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
Added: sandbox/move/libs/move/proj/vc7ide/back_move_inserter_test.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/back_move_inserter_test.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="back_move_inserter_test"
+	ProjectGUID="{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/back_move_inserter_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/back_move_inserter_test_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/back_move_inserter_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/back_move_inserter_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/back_move_inserter_test.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{818563C3-6640-0A65-55CB-202E5BAD7FAF}">
+			<File
+				RelativePath="..\..\test\back_move_inserter.cpp">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/construct_forward_test.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/construct_forward_test.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="construct_forward_test"
+	ProjectGUID="{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/construct_forward_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="TRUE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/construct_forward_test_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/construct_forward_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/construct_forward_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/construct_forward_test.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{818563C3-6640-0A65-55CB-202E5BAD7FAF}">
+			<File
+				RelativePath="..\..\test\construct_forward.cpp">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/doc_clone_ptr.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/doc_clone_ptr.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="doc_clone_ptr"
+	ProjectGUID="{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/doc_clone_ptr"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="TRUE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_clone_ptr_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/doc_clone_ptr.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/doc_clone_ptr"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_clone_ptr.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{34957FC1-7BC5-1646-05A6-27542AA2A2FF}">
+			<File
+				RelativePath="..\..\example\doc_clone_ptr.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93A78280-B78D-4B31-7E8B-6255ACE1E5FB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/doc_construct_forward.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/doc_construct_forward.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="doc_construct_forward"
+	ProjectGUID="{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/doc_construct_forward"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_construct_forward_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/doc_construct_forward.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/doc_construct_forward"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_construct_forward.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{34957FC1-7BC5-1646-05A6-27542AA2A2FF}">
+			<File
+				RelativePath="..\..\example\doc_construct_forward.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93A78280-B78D-4B31-7E8B-6255ACE1E5FB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/doc_file_descriptor.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/doc_file_descriptor.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="doc_file_descriptor"
+	ProjectGUID="{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/doc_file_descriptor"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_file_descriptor_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/doc_file_descriptor.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/doc_file_descriptor"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_file_descriptor.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{34957FC1-7BC5-1646-05A6-27542AA2A2FF}">
+			<File
+				RelativePath="..\..\example\doc_file_descriptor.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93A78280-B78D-4B31-7E8B-6255ACE1E5FB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/doc_move_algorithms.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/doc_move_algorithms.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="doc_move_algorithms"
+	ProjectGUID="{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/doc_move_algorithms"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_move_algorithms_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/doc_move_algorithms.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/doc_move_algorithms"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_move_algorithms.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{34957FC1-7BC5-1646-05A6-27542AA2A2FF}">
+			<File
+				RelativePath="..\..\example\doc_move_algorithms.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93A78280-B78D-4B31-7E8B-6255ACE1E5FB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/doc_move_inserter.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/doc_move_inserter.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="doc_move_inserter"
+	ProjectGUID="{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/doc_move_inserter"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_move_inserter_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/doc_move_inserter.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/doc_move_inserter"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_move_inserter.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{34957FC1-7BC5-1646-05A6-27542AA2A2FF}">
+			<File
+				RelativePath="..\..\example\doc_move_inserter.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93A78280-B78D-4B31-7E8B-6255ACE1E5FB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/doc_move_iterator.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/doc_move_iterator.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="doc_move_iterator"
+	ProjectGUID="{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/doc_move_iterator"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_move_iterator_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/doc_move_iterator.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/doc_move_iterator"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/doc_move_iterator.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{34957FC1-7BC5-1646-05A6-27542AA2A2FF}">
+			<File
+				RelativePath="..\..\example\doc_move_iterator.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93A78280-B78D-4B31-7E8B-6255ACE1E5FB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/move_algorithm.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/move_algorithm.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="move_algorithm_test"
+	ProjectGUID="{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/move_algorithm_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/move_algorithm_test_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/move_algorithm_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/move_algorithm_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/move_algorithm_test.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{818563C3-6640-0A65-55CB-202E5BAD7FAF}">
+			<File
+				RelativePath="..\..\test\move_algorithm.cpp">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/move_iterator_test.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/move_iterator_test.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="move_iterator_test"
+	ProjectGUID="{C8AD2618-79EB-8612-42FE-2A3AC9667A13}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/move_iterator_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="FALSE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/move_iterator_test_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/move_iterator_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/move_iterator_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/move_iterator_test.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{818563C3-6640-0A65-55CB-202E5BAD7FAF}">
+			<File
+				RelativePath="..\..\test\move_iterator.cpp">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/move_test.vcproj
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/move_test.vcproj	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="move_test"
+	ProjectGUID="{CD57C283-1862-42FE-BF87-B96D3A2A7912}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="../../Bin/Win32/Debug"
+			IntermediateDirectory="Debug/move_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				DisableLanguageExtensions="TRUE"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/move_test_d.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/move_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+				FixedBaseAddress="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="../../Bin/Win32/Release"
+			IntermediateDirectory="Release/move_test"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="../../../.."
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;BOOST_DATE_TIME_NO_LIB"
+				RuntimeLibrary="2"
+				TreatWChar_tAsBuiltInType="TRUE"
+				ForceConformanceInForLoopScope="FALSE"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="winmm.lib"
+				OutputFile="$(OutDir)/move_test.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="../../../../stage/lib"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{34957FC1-7BC5-1646-05A6-27542AA2A2FF}">
+			<File
+				RelativePath="..\..\test\move.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93A78280-B78D-4B31-7E8B-6255ACE1E5FB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Added: sandbox/move/libs/move/proj/vc7ide/todo.txt
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/proj/vc7ide/todo.txt	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1 @@
+BOOST_MOVE_MOVABLE_ONLY
\ No newline at end of file
Added: sandbox/move/libs/move/test/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/test/Jamfile.v2	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,28 @@
+##############################################################################
+##
+## (C) Copyright Ion Gaztanaga 2008-2009 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)
+##
+##
+##############################################################################
+rule test_all
+{
+   local all_rules = ;
+
+   for local fileb in [ glob *.cpp ]
+   {
+      all_rules += [ run $(fileb)
+      :  # additional args
+      :  # test-files
+      :  # requirements
+      ] ;
+   }
+
+   return $(all_rules) ;
+}
+
+test-suite move_test : [ test_all r ] 
+: <link>static
+;
+ 
Added: sandbox/move/libs/move/test/back_move_inserter.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/test/back_move_inserter.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,44 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/move/move.hpp>
+#include <boost/container/vector.hpp>
+#include "../example/movable.hpp"
+
+int main()
+{
+   namespace bc = ::boost::container;
+   //Default construct 10 movable objects
+   bc::vector<movable> v(10);
+
+   //Test default constructed value
+   if(v[0].moved()){
+      return 1;
+   }
+
+   //Move values
+   bc::vector<movable> v2;
+   std::copy(v.begin(), v.end(), boost::back_move_inserter(v2));
+
+   //Test values have been moved
+   if(!v[0].moved()){
+      return 1;
+   }
+
+   if(v2.size() != 10){
+      return 1;
+   }
+
+   if(v2[0].moved()){
+      return 1;
+   }
+
+   return 0;
+}
Added: sandbox/move/libs/move/test/construct_forward.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/test/construct_forward.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,39 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/move/move.hpp>
+#include "../example/movable.hpp"
+#include <cstdio>
+
+class non_movable
+{
+   public:
+   non_movable()
+   {}
+};
+
+template<class MaybeMovableOnly, class MaybeRvalue>
+void function_construct(BOOST_FWD_REF(MaybeRvalue) x)
+{
+   //Moves in case Convertible is boost::rv<movable> copies otherwise
+   //For C++0x perfect forwarding
+   MaybeMovableOnly m(boost::forward<MaybeRvalue>(x));
+}
+
+int main()
+{
+   movable m;
+   function_construct<movable>(boost::move(m));
+   non_movable nm;
+   function_construct<non_movable>(boost::move(nm));
+   const non_movable cnm;
+   function_construct<non_movable>(cnm);
+   return 0;
+}
Added: sandbox/move/libs/move/test/move.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/test/move.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,128 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/move/move.hpp>
+#include "../example/movable.hpp"
+
+movable function(movable m)
+{
+   return movable(boost::move(m));
+}
+
+movable functionr(BOOST_RV_REF(movable) m)
+{
+   return movable(boost::move(m));
+}
+
+movable function2(movable m)
+{
+   return boost::move(m);
+}
+
+BOOST_RV_REF(movable) function2r(BOOST_RV_REF(movable) m)
+{
+   return boost::move(m);
+}
+
+movable move_return_function2 ()
+{
+    return movable();
+}
+
+movable move_return_function ()
+{
+    movable m;
+    return (boost::move(m));
+}
+
+
+#include <boost/move/move.hpp>
+#include "../example/movable.hpp"
+
+//Catch by value
+void function_value(movable)
+{}
+
+//Catch by reference
+void function_ref(const movable &)
+{}
+
+//Catch by reference
+void function_ref(BOOST_RV_REF(movable))
+{}
+
+void limitations_test()
+{
+   movable m;
+   movable cm;
+
+   //move returns rv ref
+   BOOST_RV_REF(movable) r = boost::move(m);
+   //Conversion operator applied
+   BOOST_RV_REF(movable) q = movable();
+   //Dangerous for a container if const overload is disabled
+   BOOST_RV_REF(movable) s = m;
+   (void)r;
+   (void)q;
+   (void)s;
+ 
+   //Catch by value, ok
+   m = movable();
+
+   //Does not compile
+   //_value(m);
+   //Compiles
+   function_value(movable());
+
+   //Does not compile
+   //function_ref(movable());
+   //Compiles
+   function_ref(boost::move(m));
+}
+
+int main()
+{
+   {
+      movable m;
+      movable m2(boost::move(m));
+      movable m3(function(movable(boost::move(m2))));
+      movable m4(function(boost::move(m3)));
+	}
+   {
+      movable m;
+      movable m2(boost::move(m));
+      movable m3(functionr(movable(boost::move(m2))));
+      movable m4(functionr(boost::move(m3))); 
+	}
+   {
+      movable m;
+      movable m2(boost::move(m));
+      movable m3(function2(movable(boost::move(m2))));
+      movable m4(function2(boost::move(m3)));
+	}
+   {
+      movable m;
+      movable m2(boost::move(m));
+      movable m3(function2r(movable(boost::move(m2))));
+      movable m4(function2r(boost::move(m3)));
+	}
+   {
+      movable m;
+      movable m2(boost::move(m));
+      movable m3(move_return_function());
+	}
+   {
+      movable m;
+      movable m2(boost::move(m));
+      movable m3(move_return_function2());
+	}
+   limitations_test();
+   return 0;
+}
Added: sandbox/move/libs/move/test/move_algorithm.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/test/move_algorithm.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,55 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/move/move.hpp>
+#include <boost/container/vector.hpp>
+#include "../example/movable.hpp"
+
+int main()
+{
+   namespace bc = ::boost::container;
+   //Default construct 10 movable objects
+   bc::vector<movable> v(10);
+   bc::vector<movable> v2(10);
+
+   //Move to v2
+   boost::move(v.begin(), v.end(), v2.begin());
+
+   //Test values have been moved
+   if(!v[0].moved()){
+      return 1;
+   }
+
+   if(v2.size() != 10){
+      return 1;
+   }
+
+   if(v2[0].moved()){
+      return 1;
+   }
+
+   //Move to v again
+   boost::move_backward(v2.begin(), v2.end(), v.end());
+
+   //Test values have been moved
+   if(!v2[0].moved()){
+      return 1;
+   }
+
+   if(v.size() != 10){
+      return 1;
+   }
+
+   if(v[0].moved()){
+      return 1;
+   }
+
+   return 0;
+}
Added: sandbox/move/libs/move/test/move_iterator.cpp
==============================================================================
--- (empty file)
+++ sandbox/move/libs/move/test/move_iterator.cpp	2009-04-12 15:34:52 EDT (Sun, 12 Apr 2009)
@@ -0,0 +1,52 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009.
+// 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/move for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#include <boost/move/move.hpp>
+#include <boost/container/vector.hpp>
+#include "../example/movable.hpp"
+
+int main()
+{
+   namespace bc = ::boost::container;
+   //Default construct 10 movable objects
+   bc::vector<movable> v(10);
+
+   //Test default constructed value
+   if(v[0].moved()){
+      return 1;
+   }
+
+   //Move values
+   bc::vector<movable> v2
+      (boost::make_move_iterator(v.begin()), boost::make_move_iterator(v.end()));
+
+   //Test values have been moved
+   if(!v[0].moved()){
+      return 1;
+   }
+
+   if(v2.size() != 10){
+      return 1;
+   }
+
+   //Move again
+   v.assign(boost::make_move_iterator(v2.begin()), boost::make_move_iterator(v2.end()));
+
+   //Test values have been moved
+   if(!v2[0].moved()){
+      return 1;
+   }
+
+   if(v[0].moved()){
+      return 1;
+   }
+
+   return 0;
+}