BmnRoot
Loading...
Searching...
No Matches
StorableTimeslice.h
Go to the documentation of this file.
1// Copyright 2013 Jan de Cuveland <cmail@cuveland.de>
4// #pragma once#
5
6#ifndef STTS_H
7#define STTS_H 1
8
9#include "ArchiveDescriptor.h"
10#include "StorableMicroslice.h"
11#include "Timeslice.h"
12
13#include <algorithm> // std::copy
14#include <boost/serialization/access.hpp>
15#include <boost/serialization/vector.hpp>
16#include <cstdint>
17#include <fstream>
18#include <vector>
19// Note: <fstream> has to precede boost/serialization includes for non-obvious
20// reasons to avoid segfault similar to
21// http://lists.debian.org/debian-hppa/2009/11/msg00069.html
22
23namespace fles
24{
25
26// template <class Base, class Derived, ArchiveType archive_type>
27// class InputArchive;
28// template <class Base, class Derived, ArchiveType archive_type>
29// class InputArchiveLoop;
30
35{
36 public:
37 StorableTimeslice(); // KAA - moved from private
41 // void operator=(const StorableTimeslice&) = delete;
44
45 // /// Construct by copying from given Timeslice object.
46 // StorableTimeslice(const Timeslice& ts);
47
56
58 uint32_t append_component(uint64_t num_microslices, uint64_t /* dummy */ = 0)
59 {
62 ts_desc.offset = 0;
64
65 std::vector<uint8_t> data;
66 for (uint64_t m = 0; m < num_microslices; ++m) {
68 uint8_t* desc_bytes = reinterpret_cast<uint8_t*>(&desc);
69 data.insert(data.end(), desc_bytes, desc_bytes + sizeof(MicrosliceDescriptor));
70 }
71
72 ts_desc.size = data.size();
73 desc_.push_back(ts_desc);
74 data_.push_back(data);
75 uint32_t component = timeslice_descriptor_.num_components++;
76
77 init_pointers();
78 return component;
79 }
80
82 uint64_t append_microslice(uint32_t component,
83 uint64_t microslice,
85 const uint8_t* content)
86 {
87 assert(component < timeslice_descriptor_.num_components);
88 std::vector<uint8_t>& this_data = data_[component];
89 TimesliceComponentDescriptor& this_desc = desc_[component];
90
91 assert(microslice < this_desc.num_microslices);
92 uint8_t* desc_bytes = reinterpret_cast<uint8_t*>(&descriptor);
93
94 // set offset relative to first microslice
95 if (microslice > 0) {
96 uint64_t offset = this_data.size() - this_desc.num_microslices * sizeof(MicrosliceDescriptor);
97 uint64_t first_offset = reinterpret_cast<MicrosliceDescriptor*>(this_data.data())->offset;
98 descriptor.offset = offset + first_offset;
99 }
100
101 std::copy(desc_bytes, desc_bytes + sizeof(MicrosliceDescriptor),
102 &this_data[microslice * sizeof(MicrosliceDescriptor)]);
103
104 this_data.insert(this_data.end(), content, content + descriptor.size);
105 this_desc.size = this_data.size();
106
107 init_pointers();
108 return microslice;
109 }
110
112 uint64_t append_microslice(uint32_t component, uint64_t microslice, StorableMicroslice& m)
113 {
114 return append_microslice(component, microslice, m.desc(), m.content());
115 }
116
117 private:
120 friend class InputArchiveLoop<Timeslice, StorableTimeslice, ArchiveType::TimesliceArchive>;
122
123 template<class Archive>
124 void serialize(Archive& ar, const unsigned int /* version */)
125 {
126 ar & timeslice_descriptor_;
127 ar & data_;
128 ar & desc_;
129
130 init_pointers();
131 }
132
133 void init_pointers()
134 {
135 data_ptr_.resize(num_components());
136 desc_ptr_.resize(num_components());
137 for (size_t c = 0; c < num_components(); ++c) {
138 desc_ptr_[c] = &desc_[c];
139 data_ptr_[c] = data_[c].data();
140 }
141 }
142
143 std::vector<std::vector<uint8_t>> data_;
144 std::vector<TimesliceComponentDescriptor> desc_;
145};
146
147} // namespace fles
148#endif // STTS_H
__m128 m
Definition P4_F32vec4.h:27
The StorableMicroslice class contains the data of a single microslice.
The StorableTimeslice class contains the data of a single timeslice.
uint32_t append_component(uint64_t num_microslices, uint64_t=0)
Append a single component to fill using append_microslice.
uint64_t append_microslice(uint32_t component, uint64_t microslice, MicrosliceDescriptor descriptor, const uint8_t *content)
Append a single microslice using given descriptor and content.
friend class boost::serialization::access
uint64_t append_microslice(uint32_t component, uint64_t microslice, StorableMicroslice &m)
Append a single microslice object.
StorableTimeslice(uint32_t num_core_microslices, uint64_t index=UINT64_MAX, uint64_t ts_pos=UINT64_MAX)
Construct and initialize empty timeslice to fill using append_component.
The Timeslice class provides read access to the data of a timeslice.
Definition Timeslice.h:28
uint64_t num_components() const
Retrieve the number of components (contributing input channels).
Definition Timeslice.h:42
uint64_t num_microslices(uint64_t component) const
Retrieve the total number of microslices.
Definition Timeslice.h:39
const MicrosliceDescriptor & descriptor(uint64_t component, uint64_t microslice) const
Retrieve the descriptor of a given microslice.
Definition Timeslice.h:52
const uint8_t * content(uint64_t component, uint64_t microslice) const
Retrieve a pointer to the data content of a given microslice.
Definition Timeslice.h:45
TimesliceDescriptor timeslice_descriptor_
The timeslice descriptor.
Definition Timeslice.h:78
std::vector< uint8_t * > data_ptr_
A vector of pointers to the data content, one per timeslice component.
Definition Timeslice.h:81
uint64_t num_core_microslices() const
Retrieve the number of core microslices.
Definition Timeslice.h:36
std::vector< TimesliceComponentDescriptor * > desc_ptr_
A vector of pointers to the microslice descriptors, one per timeslice component.
Definition Timeslice.h:85
uint64_t index() const
Retrieve the timeslice index.
Definition Timeslice.h:33
Defines the fles::ArchiveDescriptor class.
Defines the fles::StorableMicroslice class.
Defines the fles::Timeslice abstract base class.
Main FLES namespace.
ArchiveType
The archive type enum (e.g., timeslice, microslice)
Microslice descriptor struct.
uint32_t size
Content size (bytes)
uint64_t offset
Offset in event buffer (bytes)
Timeslice component descriptor struct.
uint64_t num_microslices
Number of microslices.
uint64_t size
Size (in bytes) of corresponding data.
uint64_t offset
Start offset (in bytes) of corresponding data.
uint64_t index
Global index of this timeslice.
uint32_t num_core_microslices
Number of core microslices.
uint64_t ts_pos
Start offset (in items) of this timeslice.
uint32_t num_components
Number of components (contributing input channels)