11#include "comms/details/tag.h"
31 template <
typename T,
typename TIter>
32 static void assign(T& obj, TIter from, TIter to)
34 using ObjType =
typename std::decay<
decltype(obj)>::type;
35 static_assert(!std::is_same<Tag<ObjType>, UnknownTag<> >::value,
"Assignment to provided type is not supported");
36 assignInternal(obj, from, to, Tag<ObjType>());
40 template <
typename... TParams>
41 using UseAssignTag = comms::details::tag::Tag1<>;
43 template <
typename... TParams>
44 using UsePtrSizeConstructorTag = comms::details::tag::Tag2<>;
46 template <
typename... TParams>
47 using StdSpanTag = comms::details::tag::Tag3<>;
49 template <
typename... TParams>
50 using UnknownTag = comms::details::tag::Tag4<>;
52 template <
typename... TParams>
53 using HasReserveTag = comms::details::tag::Tag5<>;
55 template <
typename... TParams>
56 using NoReserveTag = comms::details::tag::Tag6<>;
60 using ConstructorTag =
61 typename comms::util::LazyShallowConditional<
62 comms::util::detect::hasPtrSizeConstructor<T>()
64 UsePtrSizeConstructorTag,
69 using SpanConstructorTag =
70 typename comms::util::LazyShallowConditional<
71 comms::util::detect::details::IsStdSpan<T>::Value
80 typename comms::util::LazyShallowConditional<
81 comms::util::detect::hasAssignFunc<T>()
90 typename comms::util::LazyShallowConditional<
91 comms::util::detect::hasReserveFunc<T>()
97 template <
typename T,
typename TIter,
typename... TParams>
98 static void assignInternal(T& obj, TIter from, TIter to, UseAssignTag<TParams...>)
100 using ObjType =
typename std::decay<
decltype(obj)>::type;
101 auto len =
static_cast<std::size_t
>(std::distance(from, to));
102 reserveInternal(obj, len, ReserveTag<ObjType>());
103 obj.assign(from, to);
106 template <
typename T,
typename TIter,
typename... TParams>
107 static void assignInternal(T& obj, TIter from, TIter to, UsePtrSizeConstructorTag<TParams...>)
109 using IterType =
typename std::decay<TIter>::type;
110 using IterTag =
typename std::iterator_traits<IterType>::iterator_category;
111 static_assert(std::is_base_of<std::random_access_iterator_tag, IterTag>::value,
112 "Only random access iterator is supported for provided type assignments");
114 auto diff = std::distance(from, to);
116 static constexpr bool Invalid_iterators_used_for_assignment =
false;
117 static_cast<void>(Invalid_iterators_used_for_assignment);
122 using ObjType =
typename std::decay<
decltype(obj)>::type;
129 obj = ObjType(&(*from),
static_cast<std::size_t
>(diff));
132 template <
typename T,
typename TIter,
typename... TParams>
133 static void assignInternal(T& obj, TIter from, TIter to, StdSpanTag<TParams...>)
135 using ObjType =
typename std::decay<
decltype(obj)>::type;
136 using ConstPointerType =
typename ObjType::const_pointer;
137 using PointerType =
typename ObjType::pointer;
138 auto fromPtr =
const_cast<PointerType
>(
reinterpret_cast<ConstPointerType
>(&(*from)));
139 auto toPtr = fromPtr + std::distance(from, to);
140 assignInternal(obj, fromPtr, toPtr, UsePtrSizeConstructorTag<TParams...>());
143 template <
typename T,
typename... TParams>
144 static void reserveInternal(T& obj, std::size_t len, HasReserveTag<TParams...>)
149 template <
typename T,
typename... TParams>
150 static void reserveInternal(T& obj, std::size_t len, NoReserveTag<TParams...>)
152 static_cast<void>(obj);
153 static_cast<void>(len);
This file contains classes required for generic custom assertion functionality.
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
void assign(T &obj, TIter from, TIter to)
Assigns a new value to provided object.
Definition assign.h:39
Main namespace for all classes / functions of COMMS library.
Replacement to some types from standard type_traits.
Various compile-time detection functions of whether specific member functions and/or types exist.