emlabcpp
modern opinionated embedded C++ library
register_handler.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include "./converter.h"
27 
28 namespace emlabcpp::protocol
29 {
30 
35 template < typename Map >
37 {
38  using map_type = Map;
39  using key_type = typename map_type::key_type;
40 
41  static constexpr std::size_t max_size = map_type::max_value_size;
42 
43  using message_type = typename map_type::message_type;
44 
45  template < key_type Key >
46  using reg_value_type = typename map_type::template reg_value_type< Key >;
47 
48  template < key_type Key >
49  using reg_def_type = typename map_type::template reg_def_type< Key >;
50 
51  template < key_type Key >
53  {
54  using def = converter_for< reg_def_type< Key >, Map::endianess >;
55 
57  static_assert( def::size_type::max_val <= max_size );
58  bounded const used = def::serialize_at(
59  std::span< std::byte, def::size_type::max_val >( res ), val );
60  res.resize( *used );
61  return res;
62  }
63 
64  // TODO: what happens if the key is bad?
65  static message_type select( map_type const& m, key_type key )
66  {
67  return m.with_register( key, [&]< typename RegType >( RegType const& reg ) {
68  return serialize< RegType::key >( reg.value );
69  } );
70  }
71 
72  template < key_type Key >
73  static std::variant< reg_value_type< Key >, error_record >
75  {
76  using def = converter_for< reg_def_type< Key >, Map::endianess >;
77 
79  view_n( msg.begin(), std::min( def::max_size, msg.size() ) ) );
80  if ( !opt_view )
81  return error_record{ SIZE_ERR, 0 };
83  auto sres = def::deserialize( *opt_view, res );
84  if ( sres.has_error() )
85  return error_record{ *sres.get_error(), sres.used };
86  return res;
87  }
88 
89  static std::optional< error_record >
91  {
92  std::optional< error_record > res;
93  m.with_register( key, [&]< typename RegType >( RegType& reg ) {
94  match(
95  extract< RegType::key >( buff ),
96  [&]( error_record const& err ) {
97  res = err;
98  },
99  [&]( auto const& val ) {
100  reg.value = val;
101  } );
102  } );
103  return res;
104  }
105 };
106 
107 } // namespace emlabcpp::protocol
static std::optional< bounded_view > make(view< Iterator > v)
Definition: bounded_view.h:67
The bounded class represents a wrapper over type T constrained between MinVal and MaxVal as compile-t...
Definition: bounded.h:44
Generic class to represent view of some container.
Definition: view.h:41
constexpr Iterator begin() const
Start of the dataset iterator.
Definition: view.h:104
constexpr size_type size() const
Size of the view over dataset uses std::ranges::distance() to tell the size.
Definition: view.h:135
MIT License.
Definition: multiplexer.h:33
static constexpr T deserialize(std::span< std::byte const, max_size > const &buffer)
Definition: serializer.h:81
static constexpr void serialize_at(std::span< std::byte, max_size > buffer, T item)
Definition: serializer.h:76
static constexpr auto SIZE_ERR
Definition: error.h:44
static constexpr std::size_t max_size
Definition: serializer.h:73
decltype(converter_for_impl< D, E >()) converter_for
Definition: converter.h:54
Definition: error.h:39
key_type_buffer key_type
Definition: base.h:47
decltype(auto) match(Variant &&var, Callables &&... cals)
Definition: match.h:55
constexpr view< Iter > view_n(Iter begin, std::size_t const n)
Creates view over 'n' items of dataset starting at 'begin' This does not check validity of the range!
Definition: view.h:198
T res
Definition: algorithm.h:505
constexpr Derived const & min(vec_point_base< Derived, N > const &a, vec_point_base< Derived, N > const &b)
Definition: vec_point_base.h:236
Handler for serialization and extraction of datatypes used by the register_map.
Definition: register_handler.h:37
typename map_type::template reg_def_type< Key > reg_def_type
Definition: register_handler.h:49
static message_type serialize(reg_value_type< Key > val)
Definition: register_handler.h:52
typename map_type::key_type key_type
Definition: register_handler.h:39
static message_type select(map_type const &m, key_type key)
Definition: register_handler.h:65
static std::optional< error_record > insert(map_type &m, key_type key, view< std::byte const * > const &buff)
Definition: register_handler.h:90
static constexpr std::size_t max_size
Definition: register_handler.h:41
static std::variant< reg_value_type< Key >, error_record > extract(view< std::byte const * > const &msg)
Definition: register_handler.h:74
Map map_type
Definition: register_handler.h:38
typename map_type::message_type message_type
Definition: register_handler.h:43
typename map_type::template reg_value_type< Key > reg_value_type
Definition: register_handler.h:46