]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/container/detail/advanced_insert_int.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / container / detail / advanced_insert_int.hpp
index 28e7ae953fb73201aa8488c9ba2f5d79234d8bf4..585b8ce0ef6208d4310b66aa80fd012798258634 100644 (file)
@@ -49,17 +49,17 @@ struct move_insert_range_proxy
    typedef typename allocator_traits<Allocator>::size_type size_type;
    typedef typename allocator_traits<Allocator>::value_type value_type;
 
-   explicit move_insert_range_proxy(FwdIt first)
+   BOOST_CONTAINER_FORCEINLINE explicit move_insert_range_proxy(FwdIt first)
       :  first_(first)
    {}
 
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
    {
       this->first_ = ::boost::container::uninitialized_move_alloc_n_source
          (a, this->first_, n, p);
    }
 
-   void copy_n_and_update(Allocator &, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n)
    {
       this->first_ = ::boost::container::move_n_source(this->first_, n, p);
    }
@@ -74,16 +74,16 @@ struct insert_range_proxy
    typedef typename allocator_traits<Allocator>::size_type size_type;
    typedef typename allocator_traits<Allocator>::value_type value_type;
 
-   explicit insert_range_proxy(FwdIt first)
+   BOOST_CONTAINER_FORCEINLINE explicit insert_range_proxy(FwdIt first)
       :  first_(first)
    {}
 
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
    {
       this->first_ = ::boost::container::uninitialized_copy_alloc_n_source(a, this->first_, n, p);
    }
 
-   void copy_n_and_update(Allocator &, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n)
    {
       this->first_ = ::boost::container::copy_n_source(this->first_, n, p);
    }
@@ -98,17 +98,19 @@ struct insert_n_copies_proxy
    typedef typename allocator_traits<Allocator>::size_type size_type;
    typedef typename allocator_traits<Allocator>::value_type value_type;
 
-   explicit insert_n_copies_proxy(const value_type &v)
+   BOOST_CONTAINER_FORCEINLINE explicit insert_n_copies_proxy(const value_type &v)
       :  v_(v)
    {}
 
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
    {  boost::container::uninitialized_fill_alloc_n(a, v_, n, p);  }
 
-   void copy_n_and_update(Allocator &, Iterator p, size_type n) const
+   BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) const
    {
-      for (; 0 < n; --n, ++p){
+      while (n){
+         --n;
          *p = v_;
+         ++p;
       }
    }
 
@@ -121,18 +123,21 @@ struct insert_value_initialized_n_proxy
    typedef ::boost::container::allocator_traits<Allocator> alloc_traits;
    typedef typename allocator_traits<Allocator>::size_type size_type;
    typedef typename allocator_traits<Allocator>::value_type value_type;
+   typedef typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type storage_t;
 
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
    {  boost::container::uninitialized_value_init_alloc_n(a, n, p);  }
 
    void copy_n_and_update(Allocator &a, Iterator p, size_type n) const
    {
-      for (; 0 < n; --n, ++p){
-         typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
+      while (n){
+         --n;
+         storage_t v;
          value_type *vp = reinterpret_cast<value_type *>(v.data);
          alloc_traits::construct(a, vp);
          value_destructor<Allocator> on_exit(a, *vp); (void)on_exit;
          *p = ::boost::move(*vp);
+         ++p;
       }
    }
 };
@@ -143,19 +148,22 @@ struct insert_default_initialized_n_proxy
    typedef ::boost::container::allocator_traits<Allocator> alloc_traits;
    typedef typename allocator_traits<Allocator>::size_type size_type;
    typedef typename allocator_traits<Allocator>::value_type value_type;
+   typedef typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type storage_t;
 
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
    {  boost::container::uninitialized_default_init_alloc_n(a, n, p);  }
 
    void copy_n_and_update(Allocator &a, Iterator p, size_type n) const
    {
       if(!is_pod<value_type>::value){
-         for (; 0 < n; --n, ++p){
+         while (n){
+            --n;
             typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
             value_type *vp = reinterpret_cast<value_type *>(v.data);
             alloc_traits::construct(a, vp, default_init);
             value_destructor<Allocator> on_exit(a, *vp); (void)on_exit;
             *p = ::boost::move(*vp);
+            ++p;
          }
       }
    }
@@ -168,17 +176,19 @@ struct insert_copy_proxy
    typedef typename alloc_traits::size_type size_type;
    typedef typename alloc_traits::value_type value_type;
 
-   explicit insert_copy_proxy(const value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_copy_proxy(const value_type &v)
       :  v_(v)
    {}
 
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
    {
       BOOST_ASSERT(n == 1);  (void)n;
       alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), v_);
    }
 
-   void copy_n_and_update(Allocator &, Iterator p, size_type n) const
+   BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) const
    {
       BOOST_ASSERT(n == 1);  (void)n;
       *p = v_;
@@ -195,6 +205,8 @@ struct insert_move_proxy
    typedef typename alloc_traits::size_type size_type;
    typedef typename alloc_traits::value_type value_type;
 
+   static const bool single_value = true;
+
    BOOST_CONTAINER_FORCEINLINE explicit insert_move_proxy(value_type &v)
       :  v_(v)
    {}
@@ -215,13 +227,13 @@ struct insert_move_proxy
 };
 
 template<class It, class Allocator>
-insert_move_proxy<Allocator, It> get_insert_value_proxy(BOOST_RV_REF(typename boost::container::iterator_traits<It>::value_type) v)
+BOOST_CONTAINER_FORCEINLINE insert_move_proxy<Allocator, It> get_insert_value_proxy(BOOST_RV_REF(typename boost::container::iterator_traits<It>::value_type) v)
 {
    return insert_move_proxy<Allocator, It>(v);
 }
 
 template<class It, class Allocator>
-insert_copy_proxy<Allocator, It> get_insert_value_proxy(const typename boost::container::iterator_traits<It>::value_type &v)
+BOOST_CONTAINER_FORCEINLINE insert_copy_proxy<Allocator, It> get_insert_value_proxy(const typename boost::container::iterator_traits<It>::value_type &v)
 {
    return insert_copy_proxy<Allocator, It>(v);
 }
@@ -243,19 +255,20 @@ struct insert_nonmovable_emplace_proxy
    typedef boost::container::allocator_traits<Allocator>   alloc_traits;
    typedef typename alloc_traits::size_type        size_type;
    typedef typename alloc_traits::value_type       value_type;
-
    typedef typename build_number_seq<sizeof...(Args)>::type index_tuple_t;
 
-   explicit insert_nonmovable_emplace_proxy(BOOST_FWD_REF(Args)... args)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_nonmovable_emplace_proxy(BOOST_FWD_REF(Args)... args)
       : args_(args...)
    {}
 
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
    {  this->priv_uninitialized_copy_some_and_update(a, index_tuple_t(), p, n);  }
 
    private:
    template<std::size_t ...IdxPack>
-   void priv_uninitialized_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void priv_uninitialized_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
    {
       BOOST_ASSERT(n == 1); (void)n;
       alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), ::boost::forward<Args>(get<IdxPack>(this->args_))... );
@@ -275,23 +288,24 @@ struct insert_emplace_proxy
    typedef typename base_t::size_type              size_type;
    typedef typename base_t::index_tuple_t          index_tuple_t;
 
-   explicit insert_emplace_proxy(BOOST_FWD_REF(Args)... args)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(BOOST_FWD_REF(Args)... args)
       : base_t(::boost::forward<Args>(args)...)
    {}
 
-   void copy_n_and_update(Allocator &a, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, size_type n)
    {  this->priv_copy_some_and_update(a, index_tuple_t(), p, n);  }
 
    private:
 
    template<std::size_t ...IdxPack>
-   void priv_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
+   BOOST_CONTAINER_FORCEINLINE void priv_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
    {
       BOOST_ASSERT(n ==1); (void)n;
       typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
       value_type *vp = reinterpret_cast<value_type *>(v.data);
-      alloc_traits::construct(a, vp,
-         ::boost::forward<Args>(get<IdxPack>(this->args_))...);
+      alloc_traits::construct(a, vp, ::boost::forward<Args>(get<IdxPack>(this->args_))...);
       BOOST_TRY{
          *p = ::boost::move(*vp);
       }
@@ -309,7 +323,9 @@ template<class Allocator, class Iterator>
 struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
    : public insert_move_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy(typename boost::container::allocator_traits<Allocator>::value_type &&v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(typename boost::container::allocator_traits<Allocator>::value_type &&v)
    : insert_move_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -323,7 +339,10 @@ struct insert_emplace_proxy<Allocator, Iterator
    >
    : public insert_copy_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
+
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_copy_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -332,7 +351,9 @@ template<class Allocator, class Iterator>
 struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &>
    : public insert_copy_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_copy_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -343,7 +364,9 @@ struct insert_emplace_proxy<Allocator, Iterator
    >
    : public insert_copy_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_copy_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -366,16 +389,18 @@ struct insert_nonmovable_emplace_proxy##N\
    typedef typename alloc_traits::size_type size_type;\
    typedef typename alloc_traits::value_type value_type;\
    \
-   explicit insert_nonmovable_emplace_proxy##N(BOOST_MOVE_UREF##N)\
+   static const bool single_value = true;\
+   \
+   BOOST_CONTAINER_FORCEINLINE explicit insert_nonmovable_emplace_proxy##N(BOOST_MOVE_UREF##N)\
       BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N {}\
    \
-   void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)\
+   BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)\
    {\
       BOOST_ASSERT(n == 1); (void)n;\
       alloc_traits::construct(a, boost::movelib::iterator_to_raw_pointer(p) BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\
    }\
    \
-   void copy_n_and_update(Allocator &, Iterator, size_type)\
+   BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator, size_type)\
    {  BOOST_ASSERT(false);   }\
    \
    protected:\
@@ -392,14 +417,15 @@ struct insert_emplace_proxy_arg##N\
    typedef typename base_t::size_type size_type;\
    typedef boost::container::allocator_traits<Allocator> alloc_traits;\
    \
-   explicit insert_emplace_proxy_arg##N(BOOST_MOVE_UREF##N)\
+   static const bool single_value = true;\
+   \
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg##N(BOOST_MOVE_UREF##N)\
       : base_t(BOOST_MOVE_FWD##N){}\
    \
-   void copy_n_and_update(Allocator &a, Iterator p, size_type n)\
+   BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, size_type n)\
    {\
       BOOST_ASSERT(n == 1); (void)n;\
       typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\
-      BOOST_ASSERT((((size_type)(&v)) % alignment_of<value_type>::value) == 0);\
       value_type *vp = reinterpret_cast<value_type *>(v.data);\
       alloc_traits::construct(a, vp BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\
       BOOST_TRY{\
@@ -424,7 +450,9 @@ template<class Allocator, class Iterator>
 struct insert_emplace_proxy_arg1<Allocator, Iterator, ::boost::rv<typename boost::container::allocator_traits<Allocator>::value_type> >
    : public insert_move_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_move_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -433,7 +461,9 @@ template<class Allocator, class Iterator>
 struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
    : public insert_copy_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_copy_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -445,7 +475,9 @@ template<class Allocator, class Iterator>
 struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
    : public insert_move_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &&v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &&v)
    : insert_move_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -459,7 +491,9 @@ struct insert_emplace_proxy_arg1<Allocator, Iterator
    >
    : public insert_copy_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_copy_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -468,7 +502,9 @@ template<class Allocator, class Iterator>
 struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &>
    : public insert_copy_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_copy_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -479,7 +515,9 @@ struct insert_emplace_proxy_arg1<Allocator, Iterator
    >
    : public insert_copy_proxy<Allocator, Iterator>
 {
-   explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
+   static const bool single_value = true;
+
+   BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
    : insert_copy_proxy<Allocator, Iterator>(v)
    {}
 };
@@ -490,6 +528,40 @@ struct insert_emplace_proxy_arg1<Allocator, Iterator
 
 #endif   // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 
+namespace boost { namespace container { namespace dtl {
+
+template <class T>
+struct has_single_value
+{
+   private:
+   struct two {char array_[2];};
+   template<bool Arg> struct wrapper;
+   template <class U> static two test(int, ...);
+   template <class U> static char test(int, const wrapper<U::single_value>*);
+   public:
+   static const bool value = sizeof(test<T>(0, 0)) == 1;
+   void dummy(){}
+};
+
+template<class InsertionProxy, bool = has_single_value<InsertionProxy>::value>
+struct is_single_value_proxy_impl
+{
+   static const bool value = InsertionProxy::single_value;
+};
+
+template<class InsertionProxy>
+struct is_single_value_proxy_impl<InsertionProxy, false>
+{
+   static const bool value = false;
+};
+
+template<class InsertionProxy>
+struct is_single_value_proxy
+   : is_single_value_proxy_impl<InsertionProxy>
+{};
+
+}}}   //namespace boost { namespace container { namespace dtl {
+
 #include <boost/container/detail/config_end.hpp>
 
 #endif //#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP