17#ifndef CYBER_DATA_FUSION_ALL_LATEST_H_
18#define CYBER_DATA_FUSION_ALL_LATEST_H_
40 using FusionDataType = std::tuple<std::shared_ptr<M0>, std::shared_ptr<M1>,
41 std::shared_ptr<M2>, std::shared_ptr<M3>>;
48 : buffer_m0_(buffer_0),
52 buffer_fusion_(buffer_m0_.channel_id(),
54 buffer_0.Buffer()->Capacity() - uint64_t(1))) {
55 buffer_m0_.
Buffer()->SetFusionCallback(
56 [
this](
const std::shared_ptr<M0>& m0) {
57 std::shared_ptr<M1> m1;
58 std::shared_ptr<M2> m2;
59 std::shared_ptr<M3> m3;
61 !buffer_m3_.Latest(m3)) {
65 auto data = std::make_shared<FusionDataType>(m0, m1, m2, m3);
66 std::lock_guard<std::mutex> lg(buffer_fusion_.
Buffer()->Mutex());
67 buffer_fusion_.
Buffer()->Fill(data);
71 bool Fusion(uint64_t* index, std::shared_ptr<M0>& m0, std::shared_ptr<M1>& m1,
72 std::shared_ptr<M2>& m2, std::shared_ptr<M3>& m3)
override {
73 std::shared_ptr<FusionDataType> fusion_data;
74 if (!buffer_fusion_.
Fetch(index, fusion_data)) {
77 m0 = std::get<0>(*fusion_data);
78 m1 = std::get<1>(*fusion_data);
79 m2 = std::get<2>(*fusion_data);
80 m3 = std::get<3>(*fusion_data);
92template <
typename M0,
typename M1,
typename M2>
94 using FusionDataType =
95 std::tuple<std::shared_ptr<M0>, std::shared_ptr<M1>, std::shared_ptr<M2>>;
101 : buffer_m0_(buffer_0),
102 buffer_m1_(buffer_1),
103 buffer_m2_(buffer_2),
104 buffer_fusion_(buffer_m0_.channel_id(),
106 buffer_0.Buffer()->Capacity() - uint64_t(1))) {
107 buffer_m0_.
Buffer()->SetFusionCallback(
108 [
this](
const std::shared_ptr<M0>& m0) {
109 std::shared_ptr<M1> m1;
110 std::shared_ptr<M2> m2;
115 auto data = std::make_shared<FusionDataType>(m0, m1, m2);
116 std::lock_guard<std::mutex> lg(buffer_fusion_.
Buffer()->Mutex());
117 buffer_fusion_.
Buffer()->Fill(data);
121 bool Fusion(uint64_t* index, std::shared_ptr<M0>& m0, std::shared_ptr<M1>& m1,
122 std::shared_ptr<M2>& m2)
override {
123 std::shared_ptr<FusionDataType> fusion_data;
124 if (!buffer_fusion_.
Fetch(index, fusion_data)) {
127 m0 = std::get<0>(*fusion_data);
128 m1 = std::get<1>(*fusion_data);
129 m2 = std::get<2>(*fusion_data);
140template <
typename M0,
typename M1>
142 using FusionDataType = std::tuple<std::shared_ptr<M0>, std::shared_ptr<M1>>;
147 : buffer_m0_(buffer_0),
148 buffer_m1_(buffer_1),
149 buffer_fusion_(buffer_m0_.channel_id(),
151 buffer_0.Buffer()->Capacity() - uint64_t(1))) {
152 buffer_m0_.
Buffer()->SetFusionCallback(
153 [
this](
const std::shared_ptr<M0>& m0) {
154 std::shared_ptr<M1> m1;
155 if (!buffer_m1_.
Latest(m1)) {
159 auto data = std::make_shared<FusionDataType>(m0, m1);
160 std::lock_guard<std::mutex> lg(buffer_fusion_.
Buffer()->Mutex());
161 buffer_fusion_.
Buffer()->Fill(data);
165 bool Fusion(uint64_t* index, std::shared_ptr<M0>& m0,
166 std::shared_ptr<M1>& m1)
override {
167 std::shared_ptr<FusionDataType> fusion_data;
168 if (!buffer_fusion_.
Fetch(index, fusion_data)) {
171 m0 = std::get<0>(*fusion_data);
172 m1 = std::get<1>(*fusion_data);
bool Latest(std::shared_ptr< T > &m)
std::shared_ptr< BufferType > Buffer() const
bool Fetch(uint64_t *index, std::shared_ptr< T > &m)
bool Fusion(uint64_t *index, std::shared_ptr< M0 > &m0, std::shared_ptr< M1 > &m1, std::shared_ptr< M2 > &m2) override
AllLatest(const ChannelBuffer< M0 > &buffer_0, const ChannelBuffer< M1 > &buffer_1, const ChannelBuffer< M2 > &buffer_2)
bool Fusion(uint64_t *index, std::shared_ptr< M0 > &m0, std::shared_ptr< M1 > &m1) override
AllLatest(const ChannelBuffer< M0 > &buffer_0, const ChannelBuffer< M1 > &buffer_1)
bool Fusion(uint64_t *index, std::shared_ptr< M0 > &m0, std::shared_ptr< M1 > &m1, std::shared_ptr< M2 > &m2, std::shared_ptr< M3 > &m3) override
AllLatest(const ChannelBuffer< M0 > &buffer_0, const ChannelBuffer< M1 > &buffer_1, const ChannelBuffer< M2 > &buffer_2, const ChannelBuffer< M3 > &buffer_3)