Skip to content

Commit 06bd32a

Browse files
committed
Added forceful reserve before assignment.
1 parent 526f3e5 commit 06bd32a

1 file changed

Lines changed: 33 additions & 2 deletions

File tree

include/comms/util/details/AssignHelper.h

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)