26 #include "../algorithm.h"
27 #include "../assert.h"
38 template <
typename, std::endian >
41 template <
typename, std::endian >
44 template <
typename D, std::endian E >
53 template <
typename D, std::endian E >
58 template <
typename T >
60 {
T::max_size } -> std::convertible_to< std::size_t >;
62 requires bounded_derived< typename T::size_type >;
64 {
T::serialize_at( buff, item ) } -> std::same_as< typename T::size_type >;
69 template < base_type D, std::endian Endianess >
76 static constexpr
bool is_big_endian =
Endianess == std::endian::big;
78 static constexpr
auto&
bget(
auto& buffer, std::size_t
const i )
80 return buffer[is_big_endian ? i :
max_size - 1 - i];
103 template <
typename D, std::endian E,
typename T >
106 auto iter = buffer.begin();
109 for (
auto const& item :
data ) {
110 std::span< std::byte, max_size >
const sub_view{ iter,
max_size };
114 std::advance( iter, *sub_bused );
116 auto const used =
static_cast< std::size_t
>(
std::distance( buffer.begin(), iter ) );
120 template <
typename D, std::endian E,
typename T >
126 std::size_t offset = 0;
128 for ( std::size_t
const i :
range(
data.size() ) ) {
129 if ( offset > buffer.size() )
131 std::span
const subspan = buffer.subspan( offset );
134 if ( sres.has_error() ) {
144 template < convertible D, std::
size_t N, std::endian Endianess >
163 std::size_t
const used = serialize_range< D, Endianess >( buffer,
view{ item } );
172 return deserialize_range< D, Endianess >( buffer,
view{ value } );
189 auto iter = buffer.begin();
191 for_each_index<
sizeof...( Ds ) >( [&iter, &item]< std::size_t i >() {
192 using sub_converter =
195 std::span< std::byte, sub_converter::max_size >
const sub_view{
201 std::advance( iter, *bused );
210 template < std::
size_t I >
216 std::size_t offset = 0;
217 mark const* err =
nullptr;
220 [&offset, &err, &value, &buffer]< std::size_t i >() {
221 if ( offset > buffer.size() ) {
225 std::span
const subspan = buffer.subspan( offset );
232 if ( sres.has_error() ) {
233 err = sres.get_error();
258 "Number of items for variant is limited by the size of one byte - 256 items" );
259 static_assert( fixedly_sized< id_type > );
266 buffer.template first< id_size >(),
static_cast< id_type >( item.index() ) );
269 [&buffer, &item]< std::size_t i >() ->
size_type {
271 std::variant_alternative_t< i, def_type >,
275 return bounded_constant< id_converter::max_size > +
277 buffer.template subspan<
280 *std::get_if< i >( &item ) );
285 template < std::
size_t I >
293 if ( subres.has_error() )
296 auto subspan = buffer.subspan< id_size >();
301 [&
res, &subres, &subspan, &
id, &value]< std::size_t i >() {
306 subspan, value.template emplace< i >() );
307 res.used += subres.used;
315 template < std::endian Endianess >
335 template < convertible T, std::endian Endianess >
341 static constexpr std::size_t min_size = traits::min_size;
344 static_assert( fixedly_sized< presence_type > );
360 buffer.template first< presence_size >(), not_present );
363 buffer.template first< presence_size >(), is_present );
367 buffer.template subspan< presence_size, sub_converter::max_size >(),
376 buffer.first< presence_size >(), is_present_v );
377 if ( subres.has_error() )
380 if ( is_present_v == not_present )
383 std::span
const subspan = buffer.subspan( presence_size );
386 res.used += subres.used;
391 template < std::
size_t N, std::endian Endianess >
398 static constexpr
bool is_big_endian =
Endianess == std::endian::big;
400 static constexpr
auto&
bget(
auto& buffer, std::size_t
const i )
402 return buffer[is_big_endian ? i :
max_size - 1 - i];
409 std::bitset< 8 >
byte;
410 for ( std::size_t
const j :
range( 8u ) )
411 byte[j] = item[i * 8 + j];
412 bget( buffer, i ) =
static_cast< std::byte >(
byte.to_ulong() );
423 std::bitset< 8 >
byte =
static_cast< uint8_t
>( bget( buffer, i ) );
424 for ( std::size_t
const j :
range( 8u ) )
425 value[i * 8 + j] =
byte[j];
431 template < std::
size_t N, std::endian Endianess >
436 static constexpr std::size_t min_size = traits_type::min_size;
440 static_assert( fixedly_sized< msg_size_type > );
448 buffer.template first< msg_size_size >(),
451 std::copy( item.begin(), item.end(), buffer.begin() + msg_size_size );
464 if ( subres.has_error() )
466 if ( buffer.size() < subres.used + size )
470 value.resize( size );
472 buffer.begin() +
static_cast< std::ptrdiff_t
>( subres.used ),
480 template < std::
size_t N, std::endian Endianess >
490 for ( std::size_t
const i :
range( item.size() ) )
501 if ( buffer.size() >
N )
503 value.resize( buffer.size() );
504 std::copy( buffer.begin(), buffer.end(), value.begin() );
510 template < convertible D, auto Offset, std::endian Endianess >
536 template < quantity_derived D, std::endian Endianess >
544 static_assert( convertible< inner_type > );
565 template < convertible D, D Min, D Max, std::endian Endianess >
585 if ( subres.has_error() )
588 auto opt_val = value_type::make( sub_val );
596 template < convertible CounterDef, convertible D, std::endian Endianess >
602 static constexpr std::size_t min_size =
613 static_assert( fixedly_sized< CounterDef > );
621 buffer.template last< sub_converter::max_size >(), item );
623 buffer.template first< counter_size >(),
625 return vused + cused;
633 if ( cres.has_error() )
635 if ( buffer.size() < cres.used + size )
639 subres.used += cres.used;
644 template < auto V, std::endian Endianess >
665 if ( subres.has_error() )
673 template <
typename... Ds, std::endian
Endianess >
679 static constexpr std::size_t min_size = traits::min_size;
688 [&buffer, &item]< std::size_t i >() ->
size_type {
692 auto* val_ptr = std::get_if< i >( &item );
694 buffer.template subspan<
698 return tag_used + used;
703 template < std::
size_t I >
707 template < std::
size_t I >
710 template < std::
size_t I >
717 until_index<
sizeof...( Ds ) >( [&buffer, &value, &
res]< std::size_t i >() ->
bool {
720 if ( tag_res.has_error() )
724 buffer.subspan( tag_res.used ), value.template emplace< i >() );
725 res.used += tag_res.used;
732 template <
typename... Ds, std::endian
Endianess >
746 [&buffer, &item]< std::size_t i >() ->
size_type {
748 std::variant_alternative_t< i, def_variant >,
751 buffer.template subspan< 0, sub_converter::max_size >(),
752 std::get< i >( item ) );
757 template < std::
size_t I >
766 bool const got_match =
767 until_index<
sizeof...( Ds ) >( [&buffer, &
res, &value]< std::size_t i >() {
769 buffer, value.template emplace< i >() );
783 template < std::endian Endianess,
typename D, std::endian ParentEndianess >
789 template < std::derived_from< converter_def_type_base > D, std::endian Endianess >
794 template < std::
size_t N, std::endian Endianess >
812 std::size_t
const size = item.size();
815 buffer.template first< counter_size >(),
static_cast< counter_type >( size ) );
818 item.begin(), size,
reinterpret_cast< char*
>( buffer.data() + counter_size ) );
832 if ( subres.has_error() )
834 if ( buffer.size() < subres.used + size )
839 buffer.begin() +
static_cast< std::ptrdiff_t
>( subres.used ),
841 reinterpret_cast< std::byte*
>( value.begin() ) );
847 template <
typename Rep,
typename Ratio, std::endian Endianess >
857 static constexpr std::size_t min_size = traits::min_size;
877 template < std::endian Endianess >
902 if ( subres.has_error() )
909 template <
typename T, std::
size_t N, std::endian Endianess >
922 static_assert( fixedly_sized< counter_type > );
932 buffer.template first< counter_size >(),
936 serialize_range< T, Endianess >( buffer.subspan( counter_size ),
view{ item } );
937 used += counter_size;
949 if ( subres.has_error() )
951 while ( value.size() !=
count && value.size() < value.max_size() )
952 value.emplace_back();
954 buffer.subspan( counter_size ),
view{ value } );
955 res.used += counter_size;
960 template < decomposable T, std::endian Endianess >
966 static constexpr std::size_t min_size = traits::min_size;
985 if ( subres.has_error() )
987 value = compose< T >( val );
992 template <
typename T, std::endian Endianess >
997 static constexpr std::size_t
min_size = traits::min_size;
1004 std::memcpy( buffer.begin(), &item,
sizeof(
value_type ) );
1013 std::memcpy( &value, buffer.begin(),
sizeof(
value_type ) );
#define EMLABCPP_ASSERT(cond)
MIT License.
Definition: assert.h:38
The bounded class represents a wrapper over type T constrained between MinVal and MaxVal as compile-t...
Definition: bounded.h:44
static std::optional< bounded< T, min_val, max_val > > make(U val)
Creates an optional bounded value if the input value is within the allowed range.
Definition: bounded.h:81
Protocol library has custom type that represents message, however this is just simple overaly over st...
Definition: message.h:40
Sizeless message is class that behaves in a same way as normal message, however it is serialized diff...
Definition: message.h:183
Data container for up to N elements.
Definition: static_vector.h:36
Generic class to represent view of some container.
Definition: view.h:41
MIT License.
Definition: multiplexer.h:33
std::size_t serialize_range(std::span< std::byte > const buffer, view< T const * > const &data)
Definition: converter.h:104
static constexpr auto GROUP_ERR
no item of group matched the content of message
Definition: error.h:56
static constexpr auto BIGSIZE_ERR
too much bytes left in the message for the item
Definition: error.h:48
requires(std::is_enum_v< T >) struct serializer< T
static constexpr T deserialize(std::span< std::byte const, max_size > const &buffer)
Definition: serializer.h:81
decltype(traits_for_impl< D >()) traits_for
Definition: traits.h:59
Endianess
Definition: serializer.h:70
static constexpr void serialize_at(std::span< std::byte, max_size > buffer, T item)
Definition: serializer.h:76
bounded< std::size_t, max_size, max_size > size_type
Definition: serializer.h:74
static constexpr auto SIZE_ERR
Definition: error.h:44
auto converter_for_impl()
Definition: converter.h:45
static constexpr auto BOUNDS_ERR
value in the message is outside of the range of bounded type
Definition: error.h:50
static constexpr std::size_t max_size
Definition: serializer.h:73
concept convertible
This concepts limits types to types that can be declared, that is the overload of 'traits_for' is ful...
Definition: traits.h:67
decltype(converter_for_impl< D, E >()) converter_for
Definition: converter.h:54
static constexpr auto UNDEFVAR_ERR
variant id is outside of the range for defined variant
Definition: error.h:52
conversion_result deserialize_range(std::span< std::byte const > const &buffer, view< T * > const &data)
Definition: converter.h:122
static constexpr auto BADVAL_ERR
parsed value is not correct, such as constant
Definition: error.h:54
concept converter_check
converter_check<T> concept verifies that 'T' is valid overload of converter.
Definition: converter.h:59
Definition: converter.h:42
converter<T,E> structure defines how type T should be serialized and deserialized.
Definition: converter.h:39
Serializes values from definitions Ds to std::variant.
Definition: base.h:89
Creates a segment starting with counter defined by CounterDef, this counter limits how many bytes are...
Definition: base.h:104
std::variant< int64_t, float, bool, string_buffer > value_type
Definition: base.h:51
constexpr std::size_t count(Container &&cont, UnaryCallable &&f=std::identity())
Applies the predicate 'f(x)' to each element of container 'cont' and returns the count of items,...
Definition: algorithm.h:234
length distance
Definition: physical_quantity.h:129
constexpr pointer data() noexcept
Returns pointer to first item of the storage.
Definition: static_storage.h:108
constexpr bool until_index(PredicateCallable &&f)
Executes predicate f() with template argument of type 'std::size_t', which ranges from 0 to i until f...
Definition: algorithm.h:488
constexpr void for_each_index(NullCallable &&f)
Executes unary callable f() with template argument of type 'std::size_t', which ranges from 0 to N.
Definition: algorithm.h:466
void copy(Container &&cont, Iterator iter)
Definition: algorithm.h:455
decltype(auto) visit_index(Visitor &&vis, Variant const &var)
Definition: visit.h:35
T value_type
Definition: static_storage.h:100
T res
Definition: algorithm.h:505
constexpr Derived max(vec_point_base< Derived, N > const &a, vec_point_base< Derived, N > const &b)
Definition: vec_point_base.h:229
constexpr view< iterators::numeric_iterator< Numeric > > range(Numeric from, Numeric to)
Builds numeric view over interval [from, to)
Definition: range.h:34
N
Definition: static_storage.h:97
concept with_value_type
Definition: concepts.h:182
physical_quantity< 0, 0, 0, 0, 0, 0, 0, 0, 1 > byte
Definition: physical_quantity.h:118
constexpr std::tuple decompose(T &&)
Definition: decompose.h:104
converter_for< tuple_type, Endianess > sub_converter
Definition: converter.h:971
typename traits::value_type value_type
Definition: converter.h:964
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:981
traits_for< T > traits
Definition: converter.h:963
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:974
typename traits::tuple_type tuple_type
Definition: converter.h:970
std::size_t used
Definition: base.h:41
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:91
converter_for< inner_type, Endianess > sub_converter
Definition: converter.h:546
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:550
typename traits_for< D >::value_type value_type
Definition: converter.h:72
typename D::value_type inner_type
Definition: converter.h:542
static constexpr auto & bget(auto &buffer, std::size_t const i)
Definition: converter.h:78
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type item)
Definition: converter.h:84
converter_for< D, Endianess > sub_converter
Definition: converter.h:571
typename traits_for< bounded< D, Min, Max > >::value_type value_type
Definition: converter.h:568
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:581
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:575
typename sub_converter::size_type size_type
Definition: converter.h:572
traits_for< error_record > traits
Definition: converter.h:880
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:888
converter_for< std::size_t, Endianess > offset_converter
Definition: converter.h:883
typename traits::value_type value_type
Definition: converter.h:881
converter_for< mark, Endianess > mark_converter
Definition: converter.h:882
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:898
converter_for< std::variant_alternative_t< I, def_variant >, Endianess > nth_converter
Definition: converter.h:759
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:743
std::variant< Ds... > def_variant
Definition: converter.h:739
typename traits_for< group< Ds... > >::value_type value_type
Definition: converter.h:735
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:762
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:460
typename traits_type::msg_size_type msg_size_type
Definition: converter.h:439
typename traits_type::value_type value_type
Definition: converter.h:435
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:445
converter_for< msg_size_type, Endianess > msg_size_converter
Definition: converter.h:441
traits_for< message< N > > traits_type
Definition: converter.h:434
typename counter_converter::size_type counter_size_type
Definition: converter.h:608
typename traits_for< sized_buffer< CounterDef, D > >::value_type value_type
Definition: converter.h:599
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:618
converter_for< D, Endianess > sub_converter
Definition: converter.h:605
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:629
typename counter_converter::value_type counter_type
Definition: converter.h:609
converter_for< CounterDef, Endianess > counter_converter
Definition: converter.h:607
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:488
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:499
typename traits_for< sizeless_message< N > >::value_type value_type
Definition: converter.h:483
converter_for< T, Endianess > sub_converter
Definition: converter.h:918
typename traits_for< static_vector< T, N > >::value_type value_type
Definition: converter.h:912
typename traits_for< static_vector< T, N > >::counter_type counter_type
Definition: converter.h:916
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:945
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:929
converter_for< counter_type, Endianess > counter_converter
Definition: converter.h:917
typename sub_converter::size_type sub_size_type
Definition: converter.h:152
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:170
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
In both methods, we create the bounded size without properly checking that it the bounded type was ma...
Definition: converter.h:161
typename traits_for< std::array< D, N > >::value_type value_type
Definition: converter.h:147
converter_for< D, Endianess > sub_converter
Definition: converter.h:151
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:418
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:406
static constexpr auto & bget(auto &buffer, std::size_t const i)
Definition: converter.h:400
typename traits_for< std::bitset< N > >::value_type value_type
Definition: converter.h:394
typename traits::rep_traits rep_traits
Definition: converter.h:853
converter_for< Rep, Endianess > rep_converter
Definition: converter.h:854
typename traits::value_type value_type
Definition: converter.h:851
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:868
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:862
traits_for< std::chrono::duration< Rep, Ratio > > traits
Definition: converter.h:850
static constexpr conversion_result deserialize(std::span< std::byte const > const &, value_type const &)
Definition: converter.h:329
std::monostate value_type
Definition: converter.h:318
static constexpr size_type serialize_at(std::span< std::byte, 0 > const, value_type const &)
Definition: converter.h:323
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &opt_val)
Definition: converter.h:356
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:372
converter_for< T, Endianess > sub_converter
Definition: converter.h:348
converter_for< presence_type, Endianess > presence_converter
Definition: converter.h:346
typename traits::presence_type presence_type
Definition: converter.h:342
typename sub_converter::size_type sub_size
Definition: converter.h:349
traits_for< std::optional< T > > traits
Definition: converter.h:338
std::optional< T > value_type
Definition: converter.h:339
converter_for< std::tuple_element_t< I, def_type >, Endianess > nth_converter
Definition: converter.h:211
std::tuple< Ds... > def_type
Definition: converter.h:179
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:187
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:214
typename traits_for< def_type >::value_type value_type
Definition: converter.h:181
converter_for< id_type, Endianess > id_converter
Definition: converter.h:253
uint8_t id_type
Definition: converter.h:252
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:289
std::variant< Ds... > def_type
Definition: converter.h:247
typename traits_for< def_type >::value_type value_type
Definition: converter.h:248
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:263
converter_for< std::variant_alternative_t< I, def_type >, Endianess > nth_converter
Definition: converter.h:286
traits_for< string_buffer< N > > traits
Definition: converter.h:797
typename traits::counter_type counter_type
Definition: converter.h:803
converter_for< counter_type, Endianess > counter_converter
Definition: converter.h:804
converter_for< typename value_type::base_type, Endianess > sub_converter
Definition: converter.h:807
static constexpr size_type serialize_at(std::span< std::byte, max_size > const buffer, value_type const &item)
Definition: converter.h:810
typename traits::value_type value_type
Definition: converter.h:799
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
TODO: duplication between this, messages, and static_vector.
Definition: converter.h:828
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &)
Definition: converter.h:655
typename sub_converter::size_type size_type
Definition: converter.h:652
typename traits_for< tag< V > >::value_type value_type
Definition: converter.h:647
converter_for< decltype(V), Endianess > sub_converter
Definition: converter.h:650
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &)
Definition: converter.h:661
typename traits::value_type value_type
Definition: converter.h:677
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:685
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:714
converter_for< nth_tag< I >, Endianess > nth_tag_converter
Definition: converter.h:711
traits_for< tag_group< Ds... > > traits
Definition: converter.h:676
converter_for< std::variant_alternative_t< I, def_variant >, Endianess > nth_converter
Definition: converter.h:705
std::variant< Ds... > def_variant
Definition: converter.h:681
typename sub_converter::size_type size_type
Definition: converter.h:517
converter_for< D, Endianess > sub_converter
Definition: converter.h:516
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:526
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:520
typename traits_for< value_offset< D, Offset > >::value_type value_type
Definition: converter.h:513
Follows a set of special data types used for definition of protocol.
Definition: base.h:79
Definition: converter.h:994
static constexpr std::size_t max_size
Definition: converter.h:998
typename traits::value_type value_type
Definition: converter.h:996
static constexpr size_type serialize_at(std::span< std::byte, max_size > buffer, value_type const &item)
Definition: converter.h:1002
static constexpr std::size_t min_size
Definition: converter.h:997
traits_for< T > traits
Definition: converter.h:995
static constexpr conversion_result deserialize(std::span< std::byte const > const &buffer, value_type &value)
Definition: converter.h:1008
static constexpr T deserialize(std::span< std::byte const, max_size > const &buffer)
Definition: serializer.h:56
static constexpr void serialize_at(std::span< std::byte, max_size > buffer, T item)
Definition: serializer.h:48
tuple is high levle alternative to use just 'std::tuple' that is more friendly for standalone protoco...
Definition: tuple.h:43
The value defined by D present in the message is offseted by Offset.
Definition: base.h:113