SRS-control 0.1.4
Loading...
Searching...
No Matches
DataWriter.hpp
Go to the documentation of this file.
1#pragma once
2
5#ifdef HAS_ROOT
7#endif
9#include <boost/thread/future.hpp>
10#include <concepts>
11#include <cstddef>
12#include <map>
13#include <memory>
14#include <optional>
15#include <spdlog/spdlog.h>
16
20#include <string>
21#include <string_view>
22#include <utility>
23#include <vector>
24
25namespace srs::workflow
26{
27 class Handler;
28} // namespace srs::workflow
29
30namespace srs::writer
31{
32 template <typename T>
33 concept WriterVisitor =
34#ifdef HAS_ROOT
35 requires(T visitor, BinaryFile& binary_file, BinaryFile& UDP_file, BinaryFile& JSON_file, RootFile& root_file)
36#else
37 requires(T visitor, BinaryFile& binary_file, BinaryFile& UDP_file, BinaryFile& JSON_file)
38#endif
39 {
40 { visitor(std::string_view{}, binary_file) } -> std::same_as<void>;
41#ifdef HAS_ROOT
42 { visitor(std::string_view{}, root_file) } -> std::same_as<void>;
43#endif
44 { visitor(std::string_view{}, UDP_file) } -> std::same_as<void>;
45 { visitor(std::string_view{}, JSON_file) } -> std::same_as<void>;
46 };
47
48 class Manager
49 {
50 public:
51 using enum DataWriterOption;
53
54 explicit Manager(workflow::Handler* processor);
55
57 Manager(const Manager&) = delete;
58 Manager& operator=(const Manager&) = delete;
59 Manager(Manager&&) = default;
60 Manager& operator=(Manager&&) = default;
61
62 void write_with(auto make_future);
63 void wait_for_finished();
64 void reset() { write_futures_.clear(); }
65 void set_output_filenames(const std::vector<std::string>& filenames);
66 [[nodiscard]] auto get_binary_writers() const -> const auto& { return binary_files_; }
67 void do_for_each_writer(WriterVisitor auto visitor);
68 void do_for_each_writer(WriterVisitor auto visitor) const;
69
70 // Getter:
71 [[nodiscard]] auto is_convert_required(process::DataConvertOptions dependee) const -> bool;
72 [[nodiscard]] auto generate_conversion_req_map() const -> std::map<process::DataConvertOptions, bool>;
73
74 private:
75 // std::map<process::DataConvertOptions, std::size_t> convert_count_map_{
76 // process::EMPTY_CONVERT_OPTION_COUNT_MAP.begin(),
77 // process::EMPTY_CONVERT_OPTION_COUNT_MAP.end()
78 // };
79 std::map<std::string, std::unique_ptr<BinaryFile>> binary_files_;
80 std::map<std::string, std::unique_ptr<UDP>> udp_files_;
81 std::map<std::string, std::unique_ptr<Json>> json_files_;
82#ifdef HAS_ROOT
83 std::map<std::string, std::unique_ptr<RootFile>> root_files_;
84#endif
86 std::vector<boost::unique_future<std::optional<std::size_t>>> write_futures_;
87
88 auto add_binary_file(const std::string& filename, process::DataConvertOptions prev_conversion) -> bool;
89 auto add_udp_file(const std::string& filename, process::DataConvertOptions prev_conversion) -> bool;
90 auto add_root_file(const std::string& filename, process::DataConvertOptions prev_conversion) -> bool;
91 auto add_json_file(const std::string& filename, process::DataConvertOptions prev_conversion) -> bool;
92
93 template <typename WriterType>
94 void write_to_files(std::map<std::string, std::unique_ptr<WriterType>>& writers, auto make_future)
95 {
96 for (auto& [key, writer] : writers)
97 {
98 auto fut = make_future(*writer);
99 write_futures_.emplace_back(std::move(fut));
100 }
101 }
102
103 template <typename WriterType>
104 void for_each_file(std::map<std::string, std::unique_ptr<WriterType>>& writers, auto visitor)
105 {
106 for (auto& [key, writer] : writers)
107 {
108 visitor(key, *writer);
109 }
110 }
111 template <typename WriterType>
112 void for_each_file(const std::map<std::string, std::unique_ptr<WriterType>>& writers, auto visitor) const
113 {
114 for (const auto& [key, writer] : writers)
115 {
116 visitor(key, *writer);
117 }
118 }
119 };
120
122 {
124 for_each_file(udp_files_, visitor);
125 for_each_file(json_files_, visitor);
126#ifdef HAS_ROOT
127 for_each_file(root_files_, visitor);
128#endif
129 }
130
132 {
134 for_each_file(udp_files_, visitor);
135 for_each_file(json_files_, visitor);
136#ifdef HAS_ROOT
137 for_each_file(root_files_, visitor);
138#endif
139 }
140
141 void Manager::write_with(auto make_future)
142 {
143 write_to_files(binary_files_, make_future);
144 write_to_files(udp_files_, make_future);
145 write_to_files(json_files_, make_future);
146#ifdef HAS_ROOT
147 write_to_files(root_files_, make_future);
148#endif
149 }
150} // namespace srs::writer
DataConvertOptions
Manager(Manager &&)=default
Manager(workflow::Handler *processor)
Manager & operator=(Manager &&)=default
auto add_root_file(const std::string &filename, process::DataConvertOptions prev_conversion) -> bool
Manager(const Manager &)=delete
std::map< std::string, std::unique_ptr< BinaryFile > > binary_files_
auto is_convert_required(process::DataConvertOptions dependee) const -> bool
std::map< std::string, std::unique_ptr< Json > > json_files_
auto generate_conversion_req_map() const -> std::map< process::DataConvertOptions, bool >
Manager & operator=(const Manager &)=delete
void set_output_filenames(const std::vector< std::string > &filenames)
auto get_binary_writers() const -> const auto &
std::map< std::string, std::unique_ptr< UDP > > udp_files_
auto add_udp_file(const std::string &filename, process::DataConvertOptions prev_conversion) -> bool
void write_to_files(std::map< std::string, std::unique_ptr< WriterType > > &writers, auto make_future)
auto add_binary_file(const std::string &filename, process::DataConvertOptions prev_conversion) -> bool
workflow::Handler * workflow_handler_
std::vector< boost::unique_future< std::optional< std::size_t > > > write_futures_
auto add_json_file(const std::string &filename, process::DataConvertOptions prev_conversion) -> bool
void do_for_each_writer(WriterVisitor auto visitor)
void for_each_file(const std::map< std::string, std::unique_ptr< WriterType > > &writers, auto visitor) const
void write_with(auto make_future)
void for_each_file(std::map< std::string, std::unique_ptr< WriterType > > &writers, auto visitor)