]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/assign/ptr_list_of.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / assign / ptr_list_of.hpp
index 0ea6cd208b9c2097881b983cbdc1c15e2b0aa7f2..67b58608098b7a24d3fafa9f41ad63f5d2040699 100644 (file)
 #include <boost/type_traits/is_array.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
+#include <boost/move/utility.hpp>
+
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 
 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
 #include <boost/preprocessor/repetition/enum_params.hpp>
 #include <boost/preprocessor/iteration/local.hpp>
 
+#endif
+
 namespace boost
 {
 
@@ -38,18 +43,22 @@ namespace assign_detail
 {
     /////////////////////////////////////////////////////////////////////////
     // Part 1: flexible and efficient interface
-    /////////////////////////////////////////////////////////////////////////    
+    /////////////////////////////////////////////////////////////////////////
 
-    template< class T > 
-    class generic_ptr_list : 
+    template< class T >
+    class generic_ptr_list :
         public converter< generic_ptr_list<T>,
-                          BOOST_DEDUCED_TYPENAME boost::ptr_vector<T>::iterator >      
+                          BOOST_DEDUCED_TYPENAME boost::ptr_vector<T>::iterator >
     {
     protected:
         typedef boost::ptr_vector<T>       impl_type;
+#if defined(BOOST_NO_AUTO_PTR)
+        typedef std::unique_ptr<impl_type> release_type;
+#else
         typedef std::auto_ptr<impl_type>   release_type;
+#endif 
         mutable impl_type                  values_;
-        
+
     public:
         typedef BOOST_DEDUCED_TYPENAME impl_type::iterator         iterator;
         typedef iterator                                           const_iterator;
@@ -67,7 +76,7 @@ namespace assign_detail
         {
             return values_.release();
         }
-        
+
     public:
         iterator begin() const       { return values_.begin(); }
         iterator end() const         { return values_.end(); }
@@ -78,12 +87,12 @@ namespace assign_detail
 
         operator impl_type() const
         {
-            return values_;        
+            return values_;
         }
+
         template< template<class,class,class> class Seq, class U,
-                  class CA, class A > 
-        operator Seq<U,CA,A>() const 
+                  class CA, class A >
+        operator Seq<U,CA,A>() const
         {
             Seq<U,CA,A> result;
             result.transfer( result.end(), values_ );
@@ -92,25 +101,41 @@ namespace assign_detail
         }
 
         template< class PtrContainer >
-        std::auto_ptr<PtrContainer> convert( const PtrContainer* c ) const
+#if defined(BOOST_NO_AUTO_PTR)
+        std::unique_ptr<PtrContainer>
+#else
+        std::auto_ptr<PtrContainer>
+#endif 
+               convert( const PtrContainer* c ) const
         {
+#if defined(BOOST_NO_AUTO_PTR)
+            std::unique_ptr<PtrContainer> res( new PtrContainer() );
+#else
             std::auto_ptr<PtrContainer> res( new PtrContainer() );
+#endif 
             while( !empty() )
-                res->insert( res->end(), 
+                res->insert( res->end(),
                              values_.pop_back().release() );
             return res;
         }
 
         template< class PtrContainer >
-        std::auto_ptr<PtrContainer> to_container( const PtrContainer& c ) const
+#if defined(BOOST_NO_AUTO_PTR)
+        std::unique_ptr<PtrContainer>
+#else
+        std::auto_ptr<PtrContainer>
+#endif 
+        to_container( const PtrContainer& c ) const
         {
-            return convert( &c ); 
+            return convert( &c );
         }
-        
+
     protected:
         void push_back( T* r ) { values_.push_back( r ); }
-        
+
     public:
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
         generic_ptr_list& operator()()
         {
             this->push_back( new T() );
@@ -123,12 +148,12 @@ namespace assign_detail
             this->push_back( new T(u) );
             return *this;
         }
-        
-       
+
+
 #ifndef BOOST_ASSIGN_MAX_PARAMS // use user's value
 #define BOOST_ASSIGN_MAX_PARAMS 5
-#endif        
-#define BOOST_ASSIGN_MAX_PARAMETERS (BOOST_ASSIGN_MAX_PARAMS - 1) 
+#endif
+#define BOOST_ASSIGN_MAX_PARAMETERS (BOOST_ASSIGN_MAX_PARAMS - 1)
 #define BOOST_ASSIGN_PARAMS1(n) BOOST_PP_ENUM_PARAMS(n, class U)
 #define BOOST_ASSIGN_PARAMS2(n) BOOST_PP_ENUM_BINARY_PARAMS(n, U, const& u)
 #define BOOST_ASSIGN_PARAMS3(n) BOOST_PP_ENUM_PARAMS(n, u)
@@ -142,27 +167,44 @@ namespace assign_detail
         return *this; \
     } \
     /**/
-        
+
 #include BOOST_PP_LOCAL_ITERATE()
 
+#else
+        template< class... Us >
+        generic_ptr_list& operator()(Us&&... us)
+        {
+            this->push_back(new T(boost::forward<Us>(us)...));
+            return *this;
+        }
+#endif
+
+
+
     }; // class 'generic_ptr_list'
 
 } // namespace 'assign_detail'
 
 namespace assign
 {
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
     template< class T >
     inline assign_detail::generic_ptr_list<T>
     ptr_list_of()
     {
-        return assign_detail::generic_ptr_list<T>()();
+        assign_detail::generic_ptr_list<T> gpl;
+        gpl();
+        return gpl;
     }
-    
+
     template< class T, class U >
-    inline assign_detail::generic_ptr_list<T> 
+    inline assign_detail::generic_ptr_list<T>
     ptr_list_of( const U& t )
     {
-        return assign_detail::generic_ptr_list<T>()( t );
+        assign_detail::generic_ptr_list<T> gpl;
+        gpl( t );
+        return gpl;
     }
 
 
@@ -175,13 +217,25 @@ namespace assign
         return assign_detail::generic_ptr_list<T>()(u, BOOST_ASSIGN_PARAMS3(n)); \
     } \
     /**/
-    
+
 #include BOOST_PP_LOCAL_ITERATE()
 
+#else
+    template< class T, class... Us >
+    inline assign_detail::generic_ptr_list<T>
+    ptr_list_of(Us&&... us)
+    {
+        assign_detail::generic_ptr_list<T> gpl;
+        gpl(boost::forward<Us>(us)...);
+        return gpl;
+    }
+
+#endif
 
 } // namespace 'assign'
 } // namespace 'boost'
 
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 
 #undef BOOST_ASSIGN_PARAMS1
 #undef BOOST_ASSIGN_PARAMS2
@@ -189,3 +243,5 @@ namespace assign
 #undef BOOST_ASSIGN_MAX_PARAMETERS
 
 #endif
+
+#endif