@@ -49,6 +49,13 @@ class AssignHelper
4949 template <typename ... TParams>
5050 using UnknownTag = comms::details::tag::Tag4<>;
5151
52+ template <typename ... TParams>
53+ using HasReserveTag = comms::details::tag::Tag5<>;
54+
55+ template <typename ... TParams>
56+ using NoReserveTag = comms::details::tag::Tag6<>;
57+
58+
5259 template <typename T>
5360 using ConstructorTag =
5461 typename comms::util::LazyShallowConditional<
@@ -78,6 +85,15 @@ class AssignHelper
7885 T
7986 >;
8087
88+ template <typename T>
89+ using ReserveTag =
90+ typename comms::util::LazyShallowConditional<
91+ comms::util::detect::hasReserveFunc<T>()
92+ >::template Type<
93+ HasReserveTag,
94+ NoReserveTag
95+ >;
96+
8197 template <typename T, typename TIter, typename ... TParams>
8298 static void assignInternal (T& obj, TIter from, TIter to, UseAssignTag<TParams...>)
8399 {
@@ -116,10 +132,25 @@ class AssignHelper
116132 using ObjType = typename std::decay<decltype (obj)>::type;
117133 using ConstPointerType = typename ObjType::const_pointer;
118134 using PointerType = typename ObjType::pointer;
135+ auto len = static_cast <std::size_t >(std::distance (from, to));
119136 auto fromPtr = const_cast <PointerType>(reinterpret_cast <ConstPointerType>(&(*from)));
120- auto toPtr = fromPtr + std::distance (from, to); // const_cast<PointerType>(reinterpret_cast<ConstPointerType>(&(*to)));
137+ auto toPtr = fromPtr + len;
138+ reserveInternal (obj, len, ReserveTag<ObjType>());
121139 assignInternal (obj, fromPtr, toPtr, UsePtrSizeConstructorTag<TParams...>());
122- }
140+ }
141+
142+ template <typename T, typename ... TParams>
143+ static void reserveInternal (T& obj, std::size_t len, HasReserveTag<TParams...>)
144+ {
145+ obj.reserve (len);
146+ }
147+
148+ template <typename T, typename ... TParams>
149+ static void reserveInternal (T& obj, std::size_t len, NoReserveTag<TParams...>)
150+ {
151+ static_cast <void >(obj);
152+ static_cast <void >(len);
153+ }
123154};
124155
125156} // namespace details
0 commit comments