Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / container / scoped_allocator.hpp
index 7da71bd..0a29871 100644 (file)
@@ -6,7 +6,7 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2011-2013. 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)
 //
@@ -17,7 +17,7 @@
 #ifndef BOOST_CONTAINER_ALLOCATOR_SCOPED_ALLOCATOR_HPP
 #define BOOST_CONTAINER_ALLOCATOR_SCOPED_ALLOCATOR_HPP
 
-#if (defined MSC_VER) && (_MSC_VER >= 1200)
+#if defined (_MSC_VER)
 #  pragma once
 #endif
 
@@ -30,8 +30,8 @@
 #include <boost/container/detail/utilities.hpp>
 #include <utility>
 #include <boost/container/detail/pair.hpp>
-#include <boost/move/move.hpp>
-
+#include <boost/move/utility_core.hpp>
+#include <boost/core/no_exceptions_support.hpp>
 
 namespace boost { namespace container {
 
@@ -46,11 +46,11 @@ namespace boost { namespace container {
 //! and if T is used in a context where a container must call such a constructor, then the program is
 //! ill-formed.
 //!
-//! [Example:
-//!  template <class T, class A = allocator<T> >  
+//! <code>
+//!  template <class T, class Allocator = allocator<T> >
 //!  class Z {
 //!    public:
-//!      typedef A allocator_type;
+//!      typedef Allocator allocator_type;
 //!
 //!    // Default constructor with optional allocator suffix
 //!    Z(const allocator_type& a = allocator_type());
@@ -61,10 +61,10 @@ namespace boost { namespace container {
 //! };
 //!
 //! // Specialize trait for class template Z
-//! template <class T, class A = allocator<T> >
-//! struct constructible_with_allocator_suffix<Z<T,A> > 
+//! template <class T, class Allocator = allocator<T> >
+//! struct constructible_with_allocator_suffix<Z<T,Allocator> >
 //!      : ::boost::true_type { };
-//! -- end example]
+//! </code>
 //!
 //! <b>Note</b>: This trait is a workaround inspired by "N2554: The Scoped Allocator Model (Rev 2)"
 //! (Pablo Halpern, 2008-02-29) to backport the scoped allocator model to C++03, as
@@ -80,7 +80,7 @@ struct constructible_with_allocator_suffix
 {};
 
 //! <b>Remark</b>: if a specialization is derived from true_type, indicates that T may be constructed
-//! with allocator_arg and T::allocator_type as its first two constructor arguments. 
+//! with allocator_arg and T::allocator_type as its first two constructor arguments.
 //! Ideally, all constructors of T (including the copy and move constructors) should have a variant
 //! that accepts these two initial arguments.
 //!
@@ -90,32 +90,32 @@ struct constructible_with_allocator_suffix
 //! called with these initial arguments, and if T is used in a context where a container must call such
 //! a constructor, then the program is ill-formed.
 //!
-//! [Example:
-//! template <class T, class A = allocator<T> >
+//! <code>
+//! template <class T, class Allocator = allocator<T> >
 //! class Y {
 //!    public:
-//!       typedef A allocator_type;
-//! 
+//!       typedef Allocator allocator_type;
+//!
 //!       // Default constructor with and allocator-extended default constructor
 //!       Y();
 //!       Y(allocator_arg_t, const allocator_type& a);
-//! 
+//!
 //!       // Copy constructor and allocator-extended copy constructor
 //!       Y(const Y& yy);
 //!       Y(allocator_arg_t, const allocator_type& a, const Y& yy);
-//! 
+//!
 //!       // Variadic constructor and allocator-extended variadic constructor
 //!       template<class ...Args> Y(Args&& args...);
-//!       template<class ...Args> 
+//!       template<class ...Args>
 //!       Y(allocator_arg_t, const allocator_type& a, Args&&... args);
 //! };
-//! 
+//!
 //! // Specialize trait for class template Y
-//! template <class T, class A = allocator<T> >
-//! struct constructible_with_allocator_prefix<Y<T,A> > 
+//! template <class T, class Allocator = allocator<T> >
+//! struct constructible_with_allocator_prefix<Y<T,Allocator> >
 //!       : ::boost::true_type { };
-//! 
-//! -- end example]
+//!
+//! </code>
 //!
 //! <b>Note</b>: This trait is a workaround inspired by "N2554: The Scoped Allocator Model (Rev 2)"
 //! (Pablo Halpern, 2008-02-29) to backport the scoped allocator model to C++03, as
@@ -130,7 +130,7 @@ struct constructible_with_allocator_prefix
     : ::boost::false_type
 {};
 
-///@cond
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
 
 namespace container_detail {
 
@@ -159,7 +159,7 @@ struct uses_allocator_imp
 
 }  //namespace container_detail {
 
-///@endcond
+#endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
 
 //! <b>Remark</b>: Automatically detects if T has a nested allocator_type that is convertible from
 //! Alloc. Meets the BinaryTypeTrait requirements ([meta.rqmts] 20.4.1). A program may
@@ -173,7 +173,7 @@ struct uses_allocator
    : boost::integral_constant<bool, container_detail::uses_allocator_imp<T, Alloc>::value>
 {};
 
-///@cond
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
 
 namespace container_detail {
 
@@ -259,7 +259,7 @@ namespace container_detail {
    //! Thanks Mathias!
 
    //With variadic templates, we need a single class to implement the trait
-   #if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
    template<class T, class ...Args>
    struct is_constructible_impl
@@ -290,9 +290,9 @@ namespace container_detail {
       : is_constructible<T, allocator_arg_t, InnerAlloc, Args...>
    {};
 
-   #else // #if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+   #else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
-   //Without variadic templates, we need to use de preprocessor to generate
+   //Without variadic templates, we need to use the preprocessor to generate
    //some specializations.
 
    #define BOOST_CONTAINER_MAX_IS_CONSTRUCTIBLE_PARAMETERS \
@@ -382,14 +382,14 @@ namespace container_detail {
          >
    {};*/
 
-   #endif   // #if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+   #endif   // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
 #else    // #if !defined(BOOST_NO_SFINAE_EXPR)
 
    //Without advanced SFINAE expressions, we can't use is_constructible
    //so backup to constructible_with_allocator_xxx
 
-   #if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
    template < class T, class InnerAlloc, class ...Args>
    struct is_constructible_with_allocator_prefix
@@ -401,7 +401,7 @@ namespace container_detail {
       : constructible_with_allocator_suffix<T>
    {};*/
 
-   #else    // #if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+   #else    // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
    template < class T
             , class InnerAlloc
@@ -423,11 +423,11 @@ namespace container_detail {
       : constructible_with_allocator_suffix<T>
    {};*/
 
-   #endif   // #if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+   #endif   // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
 #endif   // #if !defined(BOOST_NO_SFINAE_EXPR)
 
-#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
 template < typename OutermostAlloc
          , typename InnerAlloc
@@ -489,7 +489,7 @@ inline void dispatch_uses_allocator
       (outermost_alloc, p, ::boost::forward<Args>(args)...);
 }
 
-#else    //#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#else    //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
 #define BOOST_PP_LOCAL_MACRO(n)                                                              \
 template < typename OutermostAlloc                                                           \
@@ -564,9 +564,9 @@ inline void dispatch_uses_allocator(boost::false_type uses_allocator
 #define BOOST_PP_LOCAL_LIMITS (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS)
 #include BOOST_PP_LOCAL_ITERATE()
 
-#endif   //#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#endif   //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
-#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
 template <typename OuterAlloc, class ...InnerAllocs>
 class scoped_allocator_adaptor_base
@@ -583,7 +583,10 @@ class scoped_allocator_adaptor_base
    };
 
    typedef OuterAlloc outer_allocator_type;
-   typedef scoped_allocator_adaptor<InnerAllocs...> inner_allocator_type;
+   typedef scoped_allocator_adaptor<InnerAllocs...>   inner_allocator_type;
+   typedef allocator_traits<inner_allocator_type>     inner_traits_type;
+   typedef scoped_allocator_adaptor
+      <OuterAlloc, InnerAllocs...>                    scoped_allocator_type;
    typedef boost::integral_constant<
       bool,
       outer_traits_type::propagate_on_container_copy_assignment::value ||
@@ -634,7 +637,7 @@ class scoped_allocator_adaptor_base
       , m_inner(other.inner_allocator())
       {}
 
-   protected:
+   public:
    struct internal_type_t{};
 
    template <class OuterA2>
@@ -663,23 +666,41 @@ class scoped_allocator_adaptor_base
       return *this;
    }
 
-   inner_allocator_type&       inner_allocator()
+   void swap(scoped_allocator_adaptor_base &r)
+   {
+      boost::container::swap_dispatch(this->outer_allocator(), r.outer_allocator());
+      boost::container::swap_dispatch(this->m_inner, r.inner_allocator());
+   }
+
+   friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r)
+   {  l.swap(r);  }
+
+   inner_allocator_type&       inner_allocator() BOOST_CONTAINER_NOEXCEPT
       { return m_inner; }
 
-   inner_allocator_type const& inner_allocator() const
+   inner_allocator_type const& inner_allocator() const BOOST_CONTAINER_NOEXCEPT
       { return m_inner; }
 
-   outer_allocator_type      & outer_allocator()
+   outer_allocator_type      & outer_allocator() BOOST_CONTAINER_NOEXCEPT
       { return static_cast<outer_allocator_type&>(*this); }
 
-   const outer_allocator_type &outer_allocator() const
+   const outer_allocator_type &outer_allocator() const BOOST_CONTAINER_NOEXCEPT
       { return static_cast<const outer_allocator_type&>(*this); }
 
+   scoped_allocator_type select_on_container_copy_construction() const
+   {
+      return scoped_allocator_type
+         (internal_type_t()
+         ,outer_traits_type::select_on_container_copy_construction(this->outer_allocator())
+         ,inner_traits_type::select_on_container_copy_construction(this->inner_allocator())
+         );
+   }
+
    private:
    inner_allocator_type m_inner;
 };
 
-#else //#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#else //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
 //Let's add a dummy first template parameter to allow creating
 //specializations up to maximum InnerAlloc count
@@ -723,6 +744,12 @@ class scoped_allocator_adaptor_base<OuterAlloc, true
          ( BOOST_PP_SUB(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, n)                          \
          , BOOST_CONTAINER_PP_IDENTITY, nat)                                                    \
       > inner_allocator_type;                                                                   \
+   typedef scoped_allocator_adaptor<OuterAlloc, BOOST_PP_ENUM_PARAMS(n, Q)                      \
+      BOOST_PP_ENUM_TRAILING                                                                    \
+         ( BOOST_PP_SUB(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, n)                          \
+         , BOOST_CONTAINER_PP_IDENTITY, nat)                                                    \
+      > scoped_allocator_type;                                                                  \
+   typedef allocator_traits<inner_allocator_type>   inner_traits_type;                          \
    typedef boost::integral_constant<                                                            \
       bool,                                                                                     \
       outer_traits_type::propagate_on_container_copy_assignment::value ||                       \
@@ -782,7 +809,7 @@ class scoped_allocator_adaptor_base<OuterAlloc, true
       , m_inner(other.inner_allocator())                                                        \
       {}                                                                                        \
                                                                                                 \
-   protected:                                                                                   \
+   public:                                                                                      \
    struct internal_type_t{};                                                                    \
                                                                                                 \
    template <class OuterA2>                                                                     \
@@ -810,6 +837,15 @@ class scoped_allocator_adaptor_base<OuterAlloc, true
       return *this;                                                                             \
    }                                                                                            \
                                                                                                 \
+   void swap(scoped_allocator_adaptor_base &r)                                                  \
+   {                                                                                            \
+      boost::container::swap_dispatch(this->outer_allocator(), r.outer_allocator());            \
+      boost::container::swap_dispatch(this->m_inner, r.inner_allocator());                      \
+   }                                                                                            \
+                                                                                                \
+   friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r)         \
+   {  l.swap(r);  }                                                                             \
+                                                                                                \
    inner_allocator_type&       inner_allocator()                                                \
       { return m_inner; }                                                                       \
                                                                                                 \
@@ -822,6 +858,14 @@ class scoped_allocator_adaptor_base<OuterAlloc, true
    const outer_allocator_type &outer_allocator() const                                          \
       { return static_cast<const outer_allocator_type&>(*this); }                               \
                                                                                                 \
+   scoped_allocator_type select_on_container_copy_construction() const                          \
+   {                                                                                            \
+      return scoped_allocator_type                                                              \
+         (internal_type_t()                                                                     \
+         ,outer_traits_type::select_on_container_copy_construction(this->outer_allocator())     \
+         ,inner_traits_type::select_on_container_copy_construction(this->inner_allocator())     \
+         );                                                                                     \
+   }                                                                                            \
    private:                                                                                     \
    inner_allocator_type m_inner;                                                                \
 };                                                                                              \
@@ -829,13 +873,13 @@ class scoped_allocator_adaptor_base<OuterAlloc, true
 #define BOOST_PP_LOCAL_LIMITS (1, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS)
 #include BOOST_PP_LOCAL_ITERATE()
 
-#endif   //#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
+#endif   //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
 //Specialization for adaptor without any InnerAlloc
 template <typename OuterAlloc>
 class scoped_allocator_adaptor_base
    < OuterAlloc
-   #if defined(BOOST_NO_VARIADIC_TEMPLATES)
+   #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
       , true
       BOOST_PP_ENUM_TRAILING(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, BOOST_CONTAINER_PP_IDENTITY, nat)
    #endif
@@ -850,7 +894,7 @@ class scoped_allocator_adaptor_base
    {
       typedef scoped_allocator_adaptor_base
          <typename allocator_traits<OuterAlloc>::template portable_rebind_alloc<U>::type
-         #if defined(BOOST_NO_VARIADIC_TEMPLATES)
+         #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
          , true
          BOOST_PP_ENUM_TRAILING(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, BOOST_CONTAINER_PP_IDENTITY, container_detail::nat)
          #endif
@@ -860,6 +904,8 @@ class scoped_allocator_adaptor_base
    typedef OuterAlloc                           outer_allocator_type;
    typedef allocator_traits<OuterAlloc>         outer_traits_type;
    typedef scoped_allocator_adaptor<OuterAlloc> inner_allocator_type;
+   typedef inner_allocator_type                 scoped_allocator_type;
+   typedef allocator_traits<inner_allocator_type>   inner_traits_type;
    typedef typename outer_traits_type::
       propagate_on_container_copy_assignment    propagate_on_container_copy_assignment;
    typedef typename outer_traits_type::
@@ -887,7 +933,7 @@ class scoped_allocator_adaptor_base
    scoped_allocator_adaptor_base
       (const scoped_allocator_adaptor_base<
          OuterA2
-         #if defined(BOOST_NO_VARIADIC_TEMPLATES)
+         #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
          , true
          BOOST_PP_ENUM_TRAILING(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, BOOST_CONTAINER_PP_IDENTITY, container_detail::nat)
          #endif
@@ -899,7 +945,7 @@ class scoped_allocator_adaptor_base
    scoped_allocator_adaptor_base
       (BOOST_RV_REF_BEG scoped_allocator_adaptor_base<
          OuterA2
-         #if defined(BOOST_NO_VARIADIC_TEMPLATES)
+         #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
          , true
          BOOST_PP_ENUM_TRAILING(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, BOOST_CONTAINER_PP_IDENTITY, container_detail::nat)
          #endif
@@ -907,14 +953,14 @@ class scoped_allocator_adaptor_base
       : outer_allocator_type(other.outer_allocator())
       {}
 
-   protected:
+   public:
    struct internal_type_t{};
 
    template <class OuterA2>
    scoped_allocator_adaptor_base(internal_type_t, BOOST_FWD_REF(OuterA2) outerAlloc, const inner_allocator_type &)
       : outer_allocator_type(::boost::forward<OuterA2>(outerAlloc))
       {}
+
    public:
    scoped_allocator_adaptor_base &operator=(BOOST_COPY_ASSIGN_REF(scoped_allocator_adaptor_base) other)
    {
@@ -928,6 +974,14 @@ class scoped_allocator_adaptor_base
       return *this;
    }
 
+   void swap(scoped_allocator_adaptor_base &r)
+   {
+      boost::container::swap_dispatch(this->outer_allocator(), r.outer_allocator());
+   }
+
+   friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r)
+   {  l.swap(r);  }
+
    inner_allocator_type&       inner_allocator()
       { return static_cast<inner_allocator_type&>(*this); }
 
@@ -939,14 +993,25 @@ class scoped_allocator_adaptor_base
 
    const outer_allocator_type &outer_allocator() const
       { return static_cast<const outer_allocator_type&>(*this); }
+
+   scoped_allocator_type select_on_container_copy_construction() const
+   {
+      return scoped_allocator_type
+         (internal_type_t()
+         ,outer_traits_type::select_on_container_copy_construction(this->outer_allocator())
+         //Don't use inner_traits_type::select_on_container_copy_construction(this->inner_allocator())
+         //as inner_allocator() is equal to *this and that would trigger an infinite loop
+         , this->inner_allocator()
+         );
+   }
 };
 
 }  //namespace container_detail {
 
-///@endcond
+#endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
 
 //Scoped allocator
-#if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
    #if !defined(BOOST_CONTAINER_UNIMPLEMENTED_PACK_EXPANSION_TO_FIXED_LIST)
 
@@ -973,14 +1038,14 @@ class scoped_allocator_adaptor_base
    //! scoped_allocator_adaptor is derived from the outer allocator type so it can be
    //! substituted for the outer allocator type in most expressions. -end note]
    //!
-   //! In the construct member functions, `OUTERMOST(x)` is x if x does not have
-   //! an `outer_allocator()` member function and
-   //! `OUTERMOST(x.outer_allocator())` otherwise; `OUTERMOST_ALLOC_TRAITS(x)` is
-   //! `allocator_traits<decltype(OUTERMOST(x))>`.
+   //! In the construct member functions, <code>OUTERMOST(x)</code> is x if x does not have
+   //! an <code>outer_allocator()</code> member function and
+   //! <code>OUTERMOST(x.outer_allocator())</code> otherwise; <code>OUTERMOST_ALLOC_TRAITS(x)</code> is
+   //! <code>allocator_traits<decltype(OUTERMOST(x))></code>.
    //!
-   //! [<b>Note</b>: `OUTERMOST(x)` and
-   //! `OUTERMOST_ALLOC_TRAITS(x)` are recursive operations. It is incumbent upon
-   //! the definition of `outer_allocator()` to ensure that the recursion terminates.
+   //! [<b>Note</b>: <code>OUTERMOST(x)</code> and
+   //! <code>OUTERMOST_ALLOC_TRAITS(x)</code> are recursive operations. It is incumbent upon
+   //! the definition of <code>outer_allocator()</code> to ensure that the recursion terminates.
    //! It will terminate for all instantiations of scoped_allocator_adaptor. -end note]
    template <typename OuterAlloc, typename ...InnerAllocs>
    class scoped_allocator_adaptor
@@ -992,7 +1057,7 @@ class scoped_allocator_adaptor_base
 
    #endif   // #if !defined(BOOST_CONTAINER_UNIMPLEMENTED_PACK_EXPANSION_TO_FIXED_LIST)
 
-#else // #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+#else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
 template <typename OuterAlloc
          BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, class Q)
@@ -1001,7 +1066,7 @@ class scoped_allocator_adaptor
 #endif
    : public container_detail::scoped_allocator_adaptor_base
          <OuterAlloc
-         #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+         #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
          , InnerAllocs...
          #else
          , true BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
@@ -1011,24 +1076,25 @@ class scoped_allocator_adaptor
    BOOST_COPYABLE_AND_MOVABLE(scoped_allocator_adaptor)
 
    public:
-   /// @cond
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
    typedef container_detail::scoped_allocator_adaptor_base
       <OuterAlloc
-      #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
       , InnerAllocs...
       #else
       , true BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
       #endif
       >                       base_type;
-   typedef typename base_type::internal_type_t internal_type_t;
-   /// @endcond
+   typedef typename base_type::internal_type_t              internal_type_t;
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
    typedef OuterAlloc                                       outer_allocator_type;
    //! Type: For exposition only
    //!
    typedef allocator_traits<OuterAlloc>                     outer_traits_type;
-   //! Type: `scoped_allocator_adaptor<OuterAlloc>` if `sizeof...(InnerAllocs)` is zero; otherwise,
-   //! `scoped_allocator_adaptor<InnerAllocs...>`.
+   //! Type: <code>scoped_allocator_adaptor<OuterAlloc></code> if <code>sizeof...(InnerAllocs)</code> is zero; otherwise,
+   //! <code>scoped_allocator_adaptor<InnerAllocs...></code>.
    typedef typename base_type::inner_allocator_type         inner_allocator_type;
+   typedef allocator_traits<inner_allocator_type>           inner_traits_type;
    typedef typename outer_traits_type::value_type           value_type;
    typedef typename outer_traits_type::size_type            size_type;
    typedef typename outer_traits_type::difference_type      difference_type;
@@ -1036,29 +1102,29 @@ class scoped_allocator_adaptor
    typedef typename outer_traits_type::const_pointer        const_pointer;
    typedef typename outer_traits_type::void_pointer         void_pointer;
    typedef typename outer_traits_type::const_void_pointer   const_void_pointer;
-   //! Type: `true_type` if `allocator_traits<A>::propagate_on_container_copy_assignment::value` is
-   //! true for any `A` in the set of `OuterAlloc` and `InnerAllocs...`; otherwise, false_type.
+   //! Type: <code>true_type</code> if <code>allocator_traits<Allocator>::propagate_on_container_copy_assignment::value</code> is
+   //! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>; otherwise, false_type.
    typedef typename base_type::
       propagate_on_container_copy_assignment                propagate_on_container_copy_assignment;
-   //! Type: `true_type` if `allocator_traits<A>::propagate_on_container_move_assignment::value` is
-   //! true for any `A` in the set of `OuterAlloc` and `InnerAllocs...`; otherwise, false_type.
+   //! Type: <code>true_type</code> if <code>allocator_traits<Allocator>::propagate_on_container_move_assignment::value</code> is
+   //! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>; otherwise, false_type.
    typedef typename base_type::
       propagate_on_container_move_assignment                propagate_on_container_move_assignment;
-   //! Type: `true_type` if `allocator_traits<A>::propagate_on_container_swap::value` is true for any
-   //! `A` in the set of `OuterAlloc` and `InnerAllocs...`; otherwise, false_type.
+   //! Type: <code>true_type</code> if <code>allocator_traits<Allocator>::propagate_on_container_swap::value</code> is true for any
+   //! <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>; otherwise, false_type.
    typedef typename base_type::
       propagate_on_container_swap                           propagate_on_container_swap;
 
    //! Type: Rebinds scoped allocator to
-   //!    `typedef scoped_allocator_adaptor
+   //!    <code>typedef scoped_allocator_adaptor
    //!      < typename outer_traits_type::template portable_rebind_alloc<U>::type
-   //!      , InnerAllocs... >`
+   //!      , InnerAllocs... ></code>
    template <class U>
    struct rebind
    {
       typedef scoped_allocator_adaptor
          < typename outer_traits_type::template portable_rebind_alloc<U>::type
-         #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+         #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
          , InnerAllocs...
          #else
          BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
@@ -1086,7 +1152,7 @@ class scoped_allocator_adaptor
       : base_type(::boost::move(other.base()))
       {}
 
-   #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
    //! <b>Requires</b>: OuterAlloc shall be constructible from OuterA2.
    //!
@@ -1097,7 +1163,7 @@ class scoped_allocator_adaptor
    scoped_allocator_adaptor(BOOST_FWD_REF(OuterA2) outerAlloc, const InnerAllocs & ...innerAllocs)
       : base_type(::boost::forward<OuterA2>(outerAlloc), innerAllocs...)
       {}
-   #else // #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
    #define BOOST_PP_LOCAL_MACRO(n)                                                              \
    template <class OuterA2>                                                                     \
@@ -1111,14 +1177,14 @@ class scoped_allocator_adaptor
    #define BOOST_PP_LOCAL_LIMITS (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS)
    #include BOOST_PP_LOCAL_ITERATE()
 
-   #endif   // #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #endif   // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
    //! <b>Requires</b>: OuterAlloc shall be constructible from OuterA2.
    //!
    //! <b>Effects</b>: initializes each allocator within the adaptor with the corresponding allocator from other.
    template <class OuterA2>
    scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2
-      #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
       , InnerAllocs...
       #else
       BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
@@ -1133,7 +1199,7 @@ class scoped_allocator_adaptor
    //! rvalue from other.
    template <class OuterA2>
    scoped_allocator_adaptor(BOOST_RV_REF_BEG scoped_allocator_adaptor<OuterA2
-      #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
       , InnerAllocs...
       #else
       BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
@@ -1143,120 +1209,117 @@ class scoped_allocator_adaptor
       {}
 
    scoped_allocator_adaptor &operator=(BOOST_COPY_ASSIGN_REF(scoped_allocator_adaptor) other)
-   {
-      base_type::operator=(static_cast<const base_type &>(other));
-      return *this;
-   }
+   {  return static_cast<scoped_allocator_adaptor&>(base_type::operator=(static_cast<const base_type &>(other))); }
 
    scoped_allocator_adaptor &operator=(BOOST_RV_REF(scoped_allocator_adaptor) other)
-   {
-      base_type::operator=(boost::move(static_cast<scoped_allocator_adaptor&>(other)));
-      return *this;
-   }
+   {  return static_cast<scoped_allocator_adaptor&>(base_type::operator=(boost::move(static_cast<base_type&>(other)))); }
+
+   #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+   //! <b>Effects</b>: swaps *this with r.
+   //!
+   void swap(scoped_allocator_adaptor &r);
+
+   //! <b>Effects</b>: swaps *this with r.
+   //!
+   friend void swap(scoped_allocator_adaptor &l, scoped_allocator_adaptor &r);
 
    //! <b>Returns</b>:
-   //!   `static_cast<OuterAlloc&>(*this)`.
-   outer_allocator_type      & outer_allocator()
-      {  return *this; }
+   //!   <code>static_cast<OuterAlloc&>(*this)</code>.
+   outer_allocator_type      & outer_allocator() BOOST_CONTAINER_NOEXCEPT;
 
    //! <b>Returns</b>:
-   //!   `static_cast<const OuterAlloc&>(*this)`.
-   const outer_allocator_type &outer_allocator() const
-      {  return *this; }
+   //!   <code>static_cast<const OuterAlloc&>(*this)</code>.
+   const outer_allocator_type &outer_allocator() const BOOST_CONTAINER_NOEXCEPT;
 
    //! <b>Returns</b>:
-   //!   *this if `sizeof...(InnerAllocs)` is zero; otherwise, inner.
-   inner_allocator_type&       inner_allocator()
-      {  return base_type::inner_allocator(); }
+   //!   *this if <code>sizeof...(InnerAllocs)</code> is zero; otherwise, inner.
+   inner_allocator_type&       inner_allocator() BOOST_CONTAINER_NOEXCEPT;
 
    //! <b>Returns</b>:
-   //!   *this if `sizeof...(InnerAllocs)` is zero; otherwise, inner.
-   inner_allocator_type const& inner_allocator() const
-      {  return base_type::inner_allocator(); }
+   //!   *this if <code>sizeof...(InnerAllocs)</code> is zero; otherwise, inner.
+   inner_allocator_type const& inner_allocator() const BOOST_CONTAINER_NOEXCEPT;
+
+   #endif   //BOOST_CONTAINER_DOXYGEN_INVOKED
 
    //! <b>Returns</b>:
-   //!   `allocator_traits<OuterAlloc>::max_size(outer_allocator())`.
-   size_type max_size() const
+   //!   <code>allocator_traits<OuterAlloc>::max_size(outer_allocator())</code>.
+   size_type max_size() const BOOST_CONTAINER_NOEXCEPT
    {
       return outer_traits_type::max_size(this->outer_allocator());
    }
 
    //! <b>Effects</b>:
-   //!   calls `OUTERMOST_ALLOC_TRAITS(*this)::destroy(OUTERMOST(*this), p)`.
+   //!   calls <code>OUTERMOST_ALLOC_TRAITS(*this)::destroy(OUTERMOST(*this), p)</code>.
    template <class T>
-   void destroy(T* p)
+   void destroy(T* p) BOOST_CONTAINER_NOEXCEPT
    {
       allocator_traits<typename outermost_allocator<OuterAlloc>::type>
          ::destroy(get_outermost_allocator(this->outer_allocator()), p);
    }
 
    //! <b>Returns</b>:
-   //! `allocator_traits<OuterAlloc>::allocate(outer_allocator(), n)`.
+   //! <code>allocator_traits<OuterAlloc>::allocate(outer_allocator(), n)</code>.
    pointer allocate(size_type n)
    {
       return outer_traits_type::allocate(this->outer_allocator(), n);
    }
 
    //! <b>Returns</b>:
-   //! `allocator_traits<OuterAlloc>::allocate(outer_allocator(), n, hint)`.
+   //! <code>allocator_traits<OuterAlloc>::allocate(outer_allocator(), n, hint)</code>.
    pointer allocate(size_type n, const_void_pointer hint)
    {
       return outer_traits_type::allocate(this->outer_allocator(), n, hint);
    }
 
    //! <b>Effects</b>:
-   //! `allocator_traits<OuterAlloc>::deallocate(outer_allocator(), p, n)`.
+   //! <code>allocator_traits<OuterAlloc>::deallocate(outer_allocator(), p, n)</code>.
    void deallocate(pointer p, size_type n)
    {
       outer_traits_type::deallocate(this->outer_allocator(), p, n);
    }
 
-   //! <b>Returns</b>: A new scoped_allocator_adaptor object where each allocator
+   #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+   //! <b>Returns</b>: Allocator new scoped_allocator_adaptor object where each allocator
    //! A in the adaptor is initialized from the result of calling
-   //! `allocator_traits<A>::select_on_container_copy_construction()` on
+   //! <code>allocator_traits<Allocator>::select_on_container_copy_construction()</code> on
    //! the corresponding allocator in *this.
-   scoped_allocator_adaptor select_on_container_copy_construction() const
-   {
-      return scoped_allocator_adaptor
-         (internal_type_t()
-         ,outer_traits_type::select_on_container_copy_construction(this->outer_allocator())
-         ,outer_traits_type::select_on_container_copy_construction(this->inner_allocator())
-         );
-   }
-   /// @cond
+   scoped_allocator_adaptor select_on_container_copy_construction() const;
+   #endif   //BOOST_CONTAINER_DOXYGEN_INVOKED
+
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
    base_type &base()             { return *this; }
 
    const base_type &base() const { return *this; }
-   /// @endcond
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
 
-   #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
    //! <b>Effects</b>:
-   //! 1) If `uses_allocator<T, inner_allocator_type>::value` is false calls
-   //!    `OUTERMOST_ALLOC_TRAITS(*this)::construct
-   //!       (OUTERMOST(*this), p, std::forward<Args>(args)...)`.
+   //! 1) If <code>uses_allocator<T, inner_allocator_type>::value</code> is false calls
+   //!    <code>OUTERMOST_ALLOC_TRAITS(*this)::construct
+   //!       (OUTERMOST(*this), p, std::forward<Args>(args)...)</code>.
    //!
-   //! 2) Otherwise, if `uses_allocator<T, inner_allocator_type>::value` is true and
-   //!    `is_constructible<T, allocator_arg_t, inner_allocator_type, Args...>::value` is true, calls
-   //!    `OUTERMOST_ALLOC_TRAITS(*this)::construct(OUTERMOST(*this), p, allocator_arg,
-   //!    inner_allocator(), std::forward<Args>(args)...)`.
+   //! 2) Otherwise, if <code>uses_allocator<T, inner_allocator_type>::value</code> is true and
+   //!    <code>is_constructible<T, allocator_arg_t, inner_allocator_type, Args...>::value</code> is true, calls
+   //!    <code>OUTERMOST_ALLOC_TRAITS(*this)::construct(OUTERMOST(*this), p, allocator_arg,
+   //!    inner_allocator(), std::forward<Args>(args)...)</code>.
    //!
-   //! [<b>Note</b>: In compilers without advanced decltype SFINAE support, `is_constructible` can't
+   //! [<b>Note</b>: In compilers without advanced decltype SFINAE support, <code>is_constructible</code> can't
    //! be implemented so that condition will be replaced by
    //! constructible_with_allocator_prefix<T>::value. -end note]
    //!
    //! 3) Otherwise, if uses_allocator<T, inner_allocator_type>::value is true and
-   //!    `is_constructible<T, Args..., inner_allocator_type>::value` is true, calls
-   //!    `OUTERMOST_ALLOC_TRAITS(*this)::construct(OUTERMOST(*this), p,
-   //!    std::forward<Args>(args)..., inner_allocator())`.
+   //!    <code>is_constructible<T, Args..., inner_allocator_type>::value</code> is true, calls
+   //!    <code>OUTERMOST_ALLOC_TRAITS(*this)::construct(OUTERMOST(*this), p,
+   //!    std::forward<Args>(args)..., inner_allocator())</code>.
    //!
-   //! [<b>Note</b>: In compilers without advanced decltype SFINAE support, `is_constructible` can't be
+   //! [<b>Note</b>: In compilers without advanced decltype SFINAE support, <code>is_constructible</code> can't be
    //! implemented so that condition will be replaced by
-   //! `constructible_with_allocator_suffix<T>::value`. -end note]
+   //! <code>constructible_with_allocator_suffix<T>::value</code>. -end note]
    //!
    //! 4) Otherwise, the program is ill-formed.
    //!
-   //! [<b>Note</b>: An error will result if `uses_allocator` evaluates
+   //! [<b>Note</b>: An error will result if <code>uses_allocator</code> evaluates
    //! to true but the specific constructor does not take an allocator. This definition prevents a silent
    //! failure to pass an inner allocator to a contained element. -end note]
    template < typename T, class ...Args>
@@ -1274,7 +1337,7 @@ class scoped_allocator_adaptor
          , p, ::boost::forward<Args>(args)...);
    }
 
-   #else // #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
    //Disable this overload if the first argument is pair as some compilers have
    //overload selection problems when the first parameter is a pair.
@@ -1295,7 +1358,7 @@ class scoped_allocator_adaptor
    #define BOOST_PP_LOCAL_LIMITS (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS)
    #include BOOST_PP_LOCAL_ITERATE()
 
-   #endif   // #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #endif   // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
 
    template <class T1, class T2>
    void construct(std::pair<T1,T2>* p)
@@ -1312,7 +1375,7 @@ class scoped_allocator_adaptor
    template <class T1, class T2, class U, class V>
    void construct(container_detail::pair<T1, T2>* p, BOOST_FWD_REF(U) x, BOOST_FWD_REF(V) y)
    {  this->construct_pair(p, ::boost::forward<U>(x), ::boost::forward<V>(y));   }
-  
+
    template <class T1, class T2, class U, class V>
    void construct(std::pair<T1, T2>* p, const std::pair<U, V>& x)
    {  this->construct_pair(p, x);   }
@@ -1321,7 +1384,7 @@ class scoped_allocator_adaptor
    void construct( container_detail::pair<T1, T2>* p
                  , const container_detail::pair<U, V>& x)
    {  this->construct_pair(p, x);   }
-  
+
    template <class T1, class T2, class U, class V>
    void construct( std::pair<T1, T2>* p
                  , BOOST_RV_REF_BEG std::pair<U, V> BOOST_RV_REF_END x)
@@ -1332,74 +1395,79 @@ class scoped_allocator_adaptor
                  , BOOST_RV_REF_BEG container_detail::pair<U, V> BOOST_RV_REF_END x)
    {  this->construct_pair(p, x);   }
 
-   /// @cond
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
    private:
    template <class Pair>
    void construct_pair(Pair* p)
    {
       this->construct(container_detail::addressof(p->first));
-      try {
+      BOOST_TRY{
          this->construct(container_detail::addressof(p->second));
       }
-      catch (...) {
+      BOOST_CATCH(...){
          this->destroy(container_detail::addressof(p->first));
-         throw;
+         BOOST_RETHROW
       }
+      BOOST_CATCH_END
    }
 
    template <class Pair, class U, class V>
    void construct_pair(Pair* p, BOOST_FWD_REF(U) x, BOOST_FWD_REF(V) y)
    {
       this->construct(container_detail::addressof(p->first), ::boost::forward<U>(x));
-      try {
+      BOOST_TRY{
          this->construct(container_detail::addressof(p->second), ::boost::forward<V>(y));
       }
-      catch (...) {
+      BOOST_CATCH(...){
          this->destroy(container_detail::addressof(p->first));
-         throw;
+         BOOST_RETHROW
       }
+      BOOST_CATCH_END
    }
 
    template <class Pair, class Pair2>
    void construct_pair(Pair* p, const Pair2& pr)
    {
       this->construct(container_detail::addressof(p->first), pr.first);
-      try {
+      BOOST_TRY{
          this->construct(container_detail::addressof(p->second), pr.second);
       }
-      catch (...) {
+      BOOST_CATCH(...){
          this->destroy(container_detail::addressof(p->first));
-         throw;
+         BOOST_RETHROW
       }
+      BOOST_CATCH_END
    }
 
    template <class Pair, class Pair2>
    void construct_pair(Pair* p, BOOST_RV_REF(Pair2) pr)
    {
       this->construct(container_detail::addressof(p->first), ::boost::move(pr.first));
-      try {
+      BOOST_TRY{
          this->construct(container_detail::addressof(p->second), ::boost::move(pr.second));
       }
-      catch (...) {
+      BOOST_CATCH(...){
          this->destroy(container_detail::addressof(p->first));
-         throw;
+         BOOST_RETHROW
       }
+      BOOST_CATCH_END
    }
 
    //template <class T1, class T2, class... Args1, class... Args2>
    //void construct(pair<T1, T2>* p, piecewise_construct_t, tuple<Args1...> x, tuple<Args2...> y);
 
-   private:
+   public:
+   //Internal function
    template <class OuterA2>
    scoped_allocator_adaptor(internal_type_t, BOOST_FWD_REF(OuterA2) outer, const inner_allocator_type& inner)
       : base_type(internal_type_t(), ::boost::forward<OuterA2>(outer), inner)
    {}
 
-   /// @endcond
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
 };
 
 template <typename OuterA1, typename OuterA2
-   #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
    , typename... InnerAllocs
    #else
    BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, class Q)
@@ -1407,21 +1475,21 @@ template <typename OuterA1, typename OuterA2
    >
 inline bool operator==(
    const scoped_allocator_adaptor<OuterA1
-      #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
       ,InnerAllocs...
       #else
       BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
       #endif
       >& a,
    const scoped_allocator_adaptor<OuterA2
-      #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
       ,InnerAllocs...
       #else
       BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
       #endif
    >& b)
 {
-   #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)  
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
    const bool has_zero_inner = sizeof...(InnerAllocs) == 0u;
    #else
    const bool has_zero_inner =
@@ -1434,7 +1502,7 @@ inline bool operator==(
 }
 
 template <typename OuterA1, typename OuterA2
-   #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+   #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
    , typename... InnerAllocs
    #else
    BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, class Q)
@@ -1442,14 +1510,14 @@ template <typename OuterA1, typename OuterA2
    >
 inline bool operator!=(
    const scoped_allocator_adaptor<OuterA1
-      #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
       ,InnerAllocs...
       #else
       BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)
       #endif
       >& a,
    const scoped_allocator_adaptor<OuterA2
-      #if !defined(BOOST_NO_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+      #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
       ,InnerAllocs...
       #else
       BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS, Q)