-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathSIOBlock.cc.jinja2
102 lines (83 loc) · 3.22 KB
/
SIOBlock.cc.jinja2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{% import "macros/utils.jinja2" as utils %}
{% import "macros/sioblocks.jinja2" as macros %}
// AUTOMATICALLY GENERATED FILE - DO NOT EDIT
#include "{{ incfolder }}{{ class.bare_type }}SIOBlock.h"
#include "{{ incfolder }}{{ class.bare_type }}Collection.h"
#include "podio/CollectionBuffers.h"
#include <sio/block.h>
#include <sio/io_device.h>
#include <sio/version.h>
{{ utils.namespace_open(class.namespace) }}
{% with block_class = class.bare_type + 'SIOBlock' %}
void {{ block_class }}::read(sio::read_device& device, sio::version_type) {
if (m_subsetColl) {
m_buffers.references->emplace_back(std::make_unique<std::vector<podio::ObjectID>>());
} else {
{% for relation in OneToManyRelations + OneToOneRelations %}
m_buffers.references->emplace_back(std::make_unique<std::vector<podio::ObjectID>>());
{% endfor %}
}
if (not m_subsetColl) {
unsigned size(0);
device.data( size );
m_buffers.data = new std::vector<{{ class.full_type }}Data>(size);
auto* dataVec = m_buffers.dataAsVector<{{ class.full_type }}Data>();
podio::handlePODDataSIO(device, dataVec->data(), size);
// m_buffers.data = dataVec;
}
//---- read ref collections -----
auto* refCols = m_buffers.references;
for( auto& refC : *refCols ){
unsigned size{0};
device.data( size ) ;
refC->resize(size) ;
podio::handlePODDataSIO( device , refC->data(), size ) ;
}
{% if VectorMembers %}
{% for member in VectorMembers %}
// auto {{ member.name }}Buffers = new std::vector<{{ member.full_type }}>();
// m_buffers.vectorMembers->emplace_back("{{ member.full_type }}", &{{ member.name }}Buffers);
m_buffers.vectorMembers->emplace_back("{{ member.full_type }}", new std::vector<{{ member.full_type }}>());
{% endfor %}
//---- read vector members
auto* vecMemInfo = m_buffers.vectorMembers;
unsigned size{0};
{% for member in VectorMembers %}
{{ macros.vector_member_read(member, loop.index0) }}
{% endfor %}
{% endif %}
}
void {{ block_class }}::write(sio::write_device& device) {
if (not m_subsetColl) {
auto* dataVec = podio::CollectionWriteBuffers::asVector<{{ class.full_type }}Data>(m_buffers.data);
unsigned size = dataVec->size() ;
device.data( size ) ;
podio::handlePODDataSIO( device , dataVec->data(), size ) ;
}
//---- write ref collections -----
auto* refCols = m_buffers.references;
for( auto& refC : *refCols ){
unsigned size = refC->size() ;
device.data( size ) ;
podio::handlePODDataSIO( device , refC->data(), size ) ;
}
{% if VectorMembers %}
//---- write vector members
auto* vecMemInfo = m_buffers.vectorMembers;
unsigned size{0};
{% for member in VectorMembers %}
{{ macros.vector_member_write(member, loop.index0) }}
{% endfor %}
{% endif %}
}
void {{ block_class }}::createBuffers(bool subsetColl) {
m_subsetColl = subsetColl;
m_buffers.references = new podio::CollRefCollection();
m_buffers.vectorMembers = new podio::VectorMembersInfo();
m_buffers.createCollection = [](podio::CollectionReadBuffers buffers, bool isSubsetColl) {
{{ class.bare_type }}CollectionData data(buffers, isSubsetColl);
return std::make_unique<{{ class.bare_type }}Collection>(std::move(data), isSubsetColl);
};
}
{% endwith %}
{{ utils.namespace_close(class.namespace) }}