63std::pair<std::unique_ptr<uint8_t[]>,
size_t>
MakeBuffer(
size_t pagesize,
64 PageHeaderT pageheader,
67 static_assert(std::is_void<GroupT>::value || std::is_integral<GroupT>::value,
68 "Invalid group type");
69 auto totalSize = dataset.size() *
sizeof(
typename ListT::value_type);
70 totalSize += o2::algorithm::pageparser::sizeofGroupHeader<GroupT>();
71 auto maxElementsPerPage = pagesize - (
sizeof(pageheader) + o2::algorithm::pageparser::sizeofGroupHeader<GroupT>());
72 maxElementsPerPage /=
sizeof(
typename ListT::value_type);
74 if (std::is_void<GroupT>::value || !GroupHeaderPerPage) {
77 totalSize +=
sizeof(PageHeaderT);
79 }
while (nPages * pagesize < totalSize);
81 auto nRequiredPages = dataset.size() / maxElementsPerPage;
82 if (dataset.size() % maxElementsPerPage > 0) {
85 totalSize = (nRequiredPages > 0 ? nRequiredPages : 1) * pagesize;
88 auto buffer = std::make_unique<uint8_t[]>(totalSize);
89 memset(
buffer.get(), 0, totalSize);
91 unsigned position = 0;
93 GroupT* groupHeader =
nullptr;
94 size_t nElementsInCurrentGroup = 0;
95 for (
auto element : dataset) {
96 if (GroupHeaderPerPage && nElementsInCurrentGroup == maxElementsPerPage) {
100 nElementsInCurrentGroup = 0;
101 if (position % pagesize) {
102 target += pagesize - (position % pagesize);
103 position += pagesize - (position % pagesize);
106 auto source =
reinterpret_cast<uint8_t*
>(&element);
107 auto copySize =
sizeof(
typename ListT::value_type);
108 if ((position % pagesize) == 0) {
109 memcpy(
target, &pageheader,
sizeof(PageHeaderT));
110 position +=
sizeof(PageHeaderT);
111 target +=
sizeof(PageHeaderT);
113 if (!std::is_void<GroupT>::value &&
114 (position % pagesize) ==
sizeof(
PageHeader) &&
115 (GroupHeaderPerPage || position < pagesize)) {
118 groupHeader =
reinterpret_cast<GroupT*
>(
target);
119 position += o2::algorithm::pageparser::sizeofGroupHeader<GroupT>();
120 target += o2::algorithm::pageparser::sizeofGroupHeader<GroupT>();
122 ++nElementsInCurrentGroup;
123 if ((position % pagesize) + copySize > pagesize) {
124 copySize -= ((position % pagesize) + copySize) - pagesize;
128 position += copySize;
132 copySize =
sizeof(
typename ListT::value_type) - copySize;
134 memcpy(
target, &pageheader,
sizeof(PageHeaderT));
135 position +=
sizeof(PageHeaderT);
136 target +=
sizeof(PageHeaderT);
139 position += copySize;
142 if (!std::is_void<GroupT>::value) {
146 std::pair<std::unique_ptr<uint8_t[]>,
size_t>
result;
148 result.second = totalSize;
187 constexpr unsigned pagesize = 128;
188 std::vector<ClusterData> dataset;
194 const RawParser parser(
buffer.first.get(),
buffer.second);
196 unsigned dataidx = 0;
197 for (
auto i : parser) {
199 BOOST_REQUIRE(
i == dataset[dataidx++]);
202 std::vector<RawParser::value_type> linearizedData;
203 linearizedData.insert(linearizedData.begin(), parser.begin(), parser.end());
205 for (
auto i : linearizedData) {
206 BOOST_REQUIRE(
i == dataset[dataidx++]);
211 std::vector<std::pair<unsigned, unsigned>> xvalues;
212 for (
auto&
i : writer) {
213 i.x = (dataidx * 3) % 7;
214 xvalues.emplace_back(
i.x, dataidx);
220 for (
auto i : parser) {
222 BOOST_REQUIRE(
i.x == xvalues[dataidx++].first);
228 using DataSetT = std::vector<ClusterData>;
232 runParserTest<DataSetT, PageHeader, int, 128, false>(dataset);
233 runParserTest<DataSetT, PageHeader, int, 100, false>(dataset);
234 runParserTest<DataSetT, PageHeader, int, 89, false>(dataset);
239 using DataSetT = std::vector<ClusterData>;
243 runParserTest<DataSetT, PageHeader, int, 128, true>(dataset);
244 runParserTest<DataSetT, PageHeader, int, 100, true>(dataset);
245 runParserTest<DataSetT, PageHeader, int, 89, true>(dataset);
void FillData(ListT &dataset, unsigned entries)
void runParserTest(const DataSetT &dataset)
BOOST_AUTO_TEST_CASE(test_pageparser)
std::pair< std::unique_ptr< uint8_t[]>, size_t > MakeBuffer(size_t pagesize, PageHeaderT pageheader, const ListT &dataset)