From 84154ce67ba66c392b1f90d0b437ff45e1990c14 Mon Sep 17 00:00:00 2001 From: Jesse Johnson Date: Mon, 9 Jan 2017 20:39:43 -0800 Subject: [PATCH] Add default reserve size option --- .../poly_collection/detail/poly_collection.hpp | 49 ++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/include/boost/poly_collection/detail/poly_collection.hpp b/include/boost/poly_collection/detail/poly_collection.hpp index d591c3d..fecee4d 100644 --- a/include/boost/poly_collection/detail/poly_collection.hpp +++ b/include/boost/poly_collection/detail/poly_collection.hpp @@ -145,6 +145,8 @@ class poly_collection using local_iterator_impl= detail::local_iterator_impl; + size_type mDefaultReserve = 0; + public: using iterator=iterator_impl; using const_iterator=iterator_impl; @@ -525,6 +527,11 @@ class poly_collection return capacity(typeid(T)); } + void set_default_reserve(size_type n) + { + mDefaultReserve = n; + } + void reserve(size_type n) { for(auto& x:map)x.second.reserve(n); @@ -906,6 +913,12 @@ class poly_collection friend bool operator==( const poly_collection&,const poly_collection&); + template =nullptr> + void _reserve(size_type n,const_segment_map_iterator it) + { + segment(it).reserve(n); + } + template< typename T, enable_if_acceptable =nullptr, @@ -916,8 +929,13 @@ class poly_collection auto it=map.find(subtypeid(x)); if(it!=map.end())return it; else if(subtypeid(x)!=typeid(T))throw unregistered_type{subtypeid(x)}; - else return map.insert( - {typeid(T),segment_type::template make(get_allocator())}).first; + else + { + segment_type seg=segment_type::template make(get_allocator()); + auto iter=map.insert({typeid(T),seg}).first; + if(mDefaultReserve)_reserve(mDefaultReserve,iter); + return iter; + } } template< @@ -929,8 +947,13 @@ class poly_collection { auto it=map.find(typeid(T)); if(it!=map.end())return it; - else return map.insert( - {typeid(T),segment_type::template make(get_allocator())}).first; + else + { + segment_type seg=segment_type::template make(get_allocator()); + auto iter = map.insert({typeid(T),seg}).first; + if(mDefaultReserve)_reserve(mDefaultReserve,iter); + return iter; + } } template< @@ -965,8 +988,13 @@ class poly_collection { auto it=map.find(subtypeid(x)); if(it!=map.end())return it; - else return map.insert( - {subtypeid(x),segment_type::make_from_prototype(seg)}).first; + else + { + segment_type seg=segment_type::make_from_prototype(seg); + auto iter=map.insert({subtypeid(x),seg}).first; + if(mDefaultReserve)_reserve(mDefaultReserve,iter); + return iter; + } } template @@ -974,8 +1002,13 @@ class poly_collection { auto it=map.find(typeid(T)); if(it!=map.end())return it; - else return map.insert( - {typeid(T),segment_type::template make(get_allocator())}).first; + else + { + segment_type seg=segment_type::template make(get_allocator()); + auto iter=map.insert({typeid(T),seg}).first; + if(mDefaultReserve)_reserve(mDefaultReserve,iter); + return iter; + } } const_segment_map_iterator get_map_iterator_for(const std::type_info& info)