12#include "comms/details/tag.h"
31 template <
typename TFieldTo,
typename TFieldFrom>
32 static TFieldTo cast(
const TFieldFrom& field)
34 return castInternal<TFieldTo>(field, Tag<TFieldFrom, TFieldTo>());
39 template <
typename... TParams>
40 using StaticCastTag = comms::details::tag::Tag1<>;
42 template <
typename... TParams>
43 using WriteReadTag = comms::details::tag::Tag2<>;
45 template <
typename TFieldFrom,
typename TFieldTo>
47 std::is_convertible<typename TFieldFrom::ValueType, typename TFieldTo::ValueType>;
49 template <
typename TField>
51 std::integral_constant<
53 std::is_enum<typename TField::ValueType>::value ||
54 std::is_integral<typename TField::ValueType>::value
57 template <
typename TFieldFrom,
typename TFieldTo>
59 std::integral_constant<
61 Convertible<TFieldFrom, TFieldTo>::value ||
62 (IsIntegral<TFieldFrom>::value && IsIntegral<TFieldTo>::value)
65 template <
typename TFieldFrom,
typename TFieldTo>
67 typename comms::util::LazyShallowConditional<
68 UseStaticCast<TFieldFrom, TFieldTo>::value
74 template <
typename TFieldTo,
typename TFieldFrom,
typename... TParams>
75 static TFieldTo castInternal(
const TFieldFrom& field, StaticCastTag<TParams...>)
78 result.value() =
static_cast<typename TFieldTo::ValueType
>(field.value());
82 template <
typename TFieldTo,
typename TFieldFrom,
typename... TParams>
83 static TFieldTo castInternal(
const TFieldFrom& field, WriteReadTag<TParams...>)
85 static_assert(TFieldFrom::minLength() <= TFieldTo::maxLength(),
"Casting between specified fields will fail .");
87 static const auto MaxBufSize = TFieldFrom::maxLength();
88 std::uint8_t buf[MaxBufSize] = {0};
89 auto* writeIter = &buf[0];
90 auto es = field.write(writeIter, MaxBufSize);
96 auto len =
static_cast<std::size_t
>(std::distance(&buf[0], writeIter));
100 const auto* readIter = &buf[0];
101 es = result.read(readIter, len);
102 static_cast<void>(es);
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
This file contain definition of error statuses used by comms module.
Main namespace for all classes / functions of COMMS library.
@ Success
Used to indicate successful outcome of the operation.
Replacement to some types from standard type_traits.