SRS-control 0.1.4
Loading...
Searching...
No Matches
ProtoSerializer.hpp
Go to the documentation of this file.
1#pragma once
2
5#include "srs/data/message.pb.h"
7#include <cassert>
8#include <concepts>
9#include <cstddef>
10#include <google/protobuf/message_lite.h>
11#include <spdlog/spdlog.h>
12#include <string>
13#include <string_view>
14#include <utility>
15#include <vector>
16
17namespace srs::process
18{
19 template <typename Converter, DataConvertOptions Conversion>
20 class ProtoSerializerBase : public ConverterTask<Conversion, const proto::Data*, std::string_view>
21 {
22 public:
23 explicit ProtoSerializerBase(std::string name, Converter converter, std::size_t n_lines = 1)
24 : ConverterTask<Conversion, const proto::Data*, std::string_view>{ name,
26 n_lines }
27 , name_{ std::move(name) }
28 , converter_{ converter }
29 {
30 output_data_.resize(n_lines);
31 }
33
38 ~ProtoSerializerBase() { spdlog::debug("Shutting down {:?} serializer.", name_); }
39
40 [[nodiscard]] auto operator()(std::size_t line_num) const -> Base::OutputType
41 {
42 assert(line_num < Base::get_n_lines());
43 return output_data_[line_num];
44 }
45
46 auto run(const OutputTo<typename Base::InputType> auto& prev_data_converter, std::size_t line_number)
48 {
49 assert(line_number < Base::get_n_lines());
50 output_data_[line_number].clear();
51 const auto* input_data = prev_data_converter(line_number);
52 static_assert(std::same_as<decltype(input_data), const proto::Data*>);
53 converter_(*input_data, output_data_[line_number]);
54 return this->operator()(line_number);
55 }
56
57 private:
58 std::string name_;
59 std::vector<std::string> output_data_;
60 Converter converter_;
61 };
62
64 {
65 public:
66 auto operator()(const proto::Data& proto_data, std::string& output_data) -> int;
67 };
68
69 class ProtoSerializer : public ProtoSerializerBase<protobuf_deserializer_converter, DataConvertOptions::proto>
70 {
71 public:
72 explicit ProtoSerializer(std::size_t n_lines)
73 : ProtoSerializerBase{ "ProtoSerializer", protobuf_deserializer_converter{}, n_lines }
74 {
75 }
76 };
77
79 {
80 public:
81 auto operator()(const proto::Data& proto_data, std::string& output_data) -> int;
82 };
83
85 : public ProtoSerializerBase<protobuf_delim_deserializer_converter, DataConvertOptions::proto_frame>
86 {
87 public:
88 explicit ProtoDelimSerializer(std::size_t n_lines)
89 : ProtoSerializerBase{ "ProtoSerializer(delim)", protobuf_delim_deserializer_converter{}, n_lines }
90 {
91 }
92 };
93} // namespace srs::process
auto get_n_lines() const -> std::size_t
std::expected< OutputType, std::string_view > RunResult
ConverterTask(std::string_view name, DataConvertOptions prev_convert, std::size_t n_lines=1)
ProtoDelimSerializer(std::size_t n_lines)
std::vector< std::string > output_data_
auto operator()(std::size_t line_num) const -> Base::OutputType
ProtoSerializerBase & operator=(ProtoSerializerBase &&)=delete
ProtoSerializerBase(ProtoSerializerBase &&)=delete
ConverterTask< Conversion, const proto::Data *, std::string_view > Base
ProtoSerializerBase(const ProtoSerializerBase &)=delete
ProtoSerializerBase & operator=(const ProtoSerializerBase &)=delete
auto run(const OutputTo< typename Base::InputType > auto &prev_data_converter, std::size_t line_number) -> Base::RunResult
ProtoSerializerBase(std::string name, Converter converter, std::size_t n_lines=1)
ProtoSerializer(std::size_t n_lines)
auto operator()(const proto::Data &proto_data, std::string &output_data) -> int
auto operator()(const proto::Data &proto_data, std::string &output_data) -> int