16 #ifndef ROOT7_RNTupleView
17 #define ROOT7_RNTupleView
26 #include <unordered_map>
29 namespace Experimental {
39 class RNTupleGlobalRange {
41 const NTupleSize_t fStart;
42 const NTupleSize_t fEnd;
44 class RIterator :
public std::iterator<std::forward_iterator_tag, NTupleSize_t> {
46 using iterator = RIterator;
47 NTupleSize_t fIndex = kInvalidNTupleIndex;
49 RIterator() =
default;
50 explicit RIterator(NTupleSize_t index) : fIndex(index) {}
51 ~RIterator() =
default;
53 iterator operator++(
int) {
auto r = *
this; fIndex++;
return r; }
54 iterator& operator++() { ++fIndex;
return *
this; }
55 reference operator* () {
return fIndex; }
56 pointer operator->() {
return &fIndex; }
57 bool operator==(
const iterator& rh)
const {
return fIndex == rh.fIndex; }
58 bool operator!=(
const iterator& rh)
const {
return fIndex != rh.fIndex; }
61 RNTupleGlobalRange(NTupleSize_t start, NTupleSize_t end) : fStart(start), fEnd(end) {}
62 RIterator begin() {
return RIterator(fStart); }
63 RIterator end() {
return RIterator(fEnd); }
74 class RNTupleClusterRange {
76 const DescriptorId_t fClusterId;
77 const ClusterSize_t::ValueType fStart;
78 const ClusterSize_t::ValueType fEnd;
80 class RIterator :
public std::iterator<std::forward_iterator_tag, RClusterIndex> {
82 using iterator = RIterator;
85 RIterator() =
default;
86 explicit RIterator(
const RClusterIndex &index) : fIndex(index) {}
87 ~RIterator() =
default;
89 iterator operator++(
int) {
auto r = *
this; fIndex++;
return r; }
90 iterator& operator++() { fIndex++;
return *
this; }
91 reference operator* () {
return fIndex; }
92 pointer operator->() {
return &fIndex; }
93 bool operator==(
const iterator& rh)
const {
return fIndex == rh.fIndex; }
94 bool operator!=(
const iterator& rh)
const {
return fIndex != rh.fIndex; }
97 RNTupleClusterRange(DescriptorId_t clusterId, ClusterSize_t::ValueType start, ClusterSize_t::ValueType end)
98 : fClusterId(clusterId), fStart(start), fEnd(end) {}
99 RIterator begin() {
return RIterator(RClusterIndex(fClusterId, fStart)); }
100 RIterator end() {
return RIterator(RClusterIndex(fClusterId, fEnd)); }
123 template <
typename T>
125 friend class RNTupleReader;
126 friend class RNTupleViewCollection;
133 Detail::RFieldValue fValue;
135 RNTupleView(DescriptorId_t fieldId, Detail::RPageSource* pageSource)
136 : fField(pageSource->GetDescriptor().GetFieldDescriptor(fieldId).GetFieldName()), fValue(fField.GenerateValue())
138 Detail::RFieldFuse::Connect(fieldId, *pageSource, fField);
139 std::unordered_map<const Detail::RFieldBase *, DescriptorId_t> field2Id;
140 field2Id[&fField] = fieldId;
141 for (
auto &f : fField) {
142 auto subFieldId = pageSource->GetDescriptor().FindFieldId(f.GetName(), field2Id[f.GetParent()]);
143 Detail::RFieldFuse::Connect(subFieldId, *pageSource, f);
144 field2Id[&f] = subFieldId;
149 RNTupleView(
const RNTupleView& other) =
delete;
150 RNTupleView(RNTupleView&& other) =
default;
151 RNTupleView& operator=(
const RNTupleView& other) =
delete;
152 RNTupleView& operator=(RNTupleView&& other) =
default;
153 ~RNTupleView() { fField.DestroyValue(fValue); }
155 const T& operator()(NTupleSize_t globalIndex) {
156 fField.Read(globalIndex, &fValue);
157 return *fValue.Get<T>();
160 const T& operator()(
const RClusterIndex &clusterIndex) {
161 fField.Read(clusterIndex, &fValue);
162 return *fValue.Get<T>();
169 class RNTupleView<float> {
170 friend class RNTupleReader;
171 friend class RNTupleViewCollection;
174 RField<float> fField;
175 RNTupleView(DescriptorId_t fieldId, Detail::RPageSource* pageSource)
176 : fField(pageSource->GetDescriptor().GetFieldDescriptor(fieldId).GetFieldName())
178 Detail::RFieldFuse::Connect(fieldId, *pageSource, fField);
182 RNTupleView(
const RNTupleView& other) =
delete;
183 RNTupleView(RNTupleView&& other) =
default;
184 RNTupleView& operator=(
const RNTupleView& other) =
delete;
185 RNTupleView& operator=(RNTupleView&& other) =
default;
186 ~RNTupleView() =
default;
188 float operator()(NTupleSize_t globalIndex) {
return *fField.Map(globalIndex); }
189 float operator()(
const RClusterIndex &clusterIndex) {
return *fField.Map(clusterIndex); }
194 class RNTupleView<double> {
195 friend class RNTupleReader;
196 friend class RNTupleViewCollection;
199 RField<double> fField;
200 RNTupleView(DescriptorId_t fieldId, Detail::RPageSource* pageSource)
201 : fField(pageSource->GetDescriptor().GetFieldDescriptor(fieldId).GetFieldName())
203 Detail::RFieldFuse::Connect(fieldId, *pageSource, fField);
207 RNTupleView(
const RNTupleView& other) =
delete;
208 RNTupleView(RNTupleView&& other) =
default;
209 RNTupleView& operator=(
const RNTupleView& other) =
delete;
210 RNTupleView& operator=(RNTupleView&& other) =
default;
211 ~RNTupleView() =
default;
213 double operator()(NTupleSize_t globalIndex) {
return *fField.Map(globalIndex); }
214 double operator()(
const RClusterIndex &clusterIndex) {
return *fField.Map(clusterIndex); }
219 class RNTupleView<std::int32_t> {
220 friend class RNTupleReader;
221 friend class RNTupleViewCollection;
224 RField<std::int32_t> fField;
225 RNTupleView(DescriptorId_t fieldId, Detail::RPageSource* pageSource)
226 : fField(pageSource->GetDescriptor().GetFieldDescriptor(fieldId).GetFieldName())
228 Detail::RFieldFuse::Connect(fieldId, *pageSource, fField);
232 RNTupleView(
const RNTupleView& other) =
delete;
233 RNTupleView(RNTupleView&& other) =
default;
234 RNTupleView& operator=(
const RNTupleView& other) =
delete;
235 RNTupleView& operator=(RNTupleView&& other) =
default;
236 ~RNTupleView() =
default;
238 std::int32_t operator()(NTupleSize_t globalIndex) {
return *fField.Map(globalIndex); }
239 std::int32_t operator()(
const RClusterIndex &clusterIndex) {
return *fField.Map(clusterIndex); }
243 class RNTupleView<ClusterSize_t> {
244 friend class RNTupleReader;
245 friend class RNTupleViewCollection;
248 RField<ClusterSize_t> fField;
249 RNTupleView(DescriptorId_t fieldId, Detail::RPageSource* pageSource)
250 : fField(pageSource->GetDescriptor().GetFieldDescriptor(fieldId).GetFieldName())
252 Detail::RFieldFuse::Connect(fieldId, *pageSource, fField);
256 RNTupleView(
const RNTupleView& other) =
delete;
257 RNTupleView(RNTupleView&& other) =
default;
258 RNTupleView& operator=(
const RNTupleView& other) =
delete;
259 RNTupleView& operator=(RNTupleView&& other) =
default;
260 ~RNTupleView() =
default;
262 ClusterSize_t operator()(NTupleSize_t globalIndex) {
return *fField.Map(globalIndex); }
263 ClusterSize_t operator()(
const RClusterIndex &clusterIndex) {
return *fField.Map(clusterIndex); }
274 class RNTupleViewCollection :
public RNTupleView<ClusterSize_t> {
275 friend class RNTupleReader;
278 Detail::RPageSource* fSource;
279 DescriptorId_t fCollectionFieldId;
281 RNTupleViewCollection(DescriptorId_t fieldId, Detail::RPageSource* source)
282 : RNTupleView<ClusterSize_t>(fieldId, source)
284 , fCollectionFieldId(fieldId)
288 RNTupleViewCollection(
const RNTupleViewCollection& other) =
delete;
289 RNTupleViewCollection(RNTupleViewCollection&& other) =
default;
290 RNTupleViewCollection& operator=(
const RNTupleViewCollection& other) =
delete;
291 RNTupleViewCollection& operator=(RNTupleViewCollection&& other) =
default;
292 ~RNTupleViewCollection() =
default;
294 RNTupleClusterRange GetViewRange(NTupleSize_t globalIndex) {
296 RClusterIndex collectionStart;
297 fField.GetCollectionInfo(globalIndex, &collectionStart, &size);
298 return RNTupleClusterRange(collectionStart.GetClusterId(), collectionStart.GetIndex(),
299 collectionStart.GetIndex() + size);
301 RNTupleClusterRange GetViewRange(
const RClusterIndex &clusterIndex) {
303 RClusterIndex collectionStart;
304 fField.GetCollectionInfo(clusterIndex, &collectionStart, &size);
305 return RNTupleClusterRange(collectionStart.GetClusterId(), collectionStart.GetIndex(),
306 collectionStart.GetIndex() + size);
309 template <
typename T>
310 RNTupleView<T> GetView(std::string_view fieldName) {
311 auto fieldId = fSource->GetDescriptor().FindFieldId(fieldName, fCollectionFieldId);
312 return RNTupleView<T>(fieldId, fSource);
314 RNTupleViewCollection GetViewCollection(std::string_view fieldName) {
315 auto fieldId = fSource->GetDescriptor().FindFieldId(fieldName, fCollectionFieldId);
316 return RNTupleViewCollection(fieldId, fSource);
319 ClusterSize_t operator()(NTupleSize_t globalIndex) {
321 RClusterIndex collectionStart;
322 fField.GetCollectionInfo(globalIndex, &collectionStart, &size);
325 ClusterSize_t operator()(
const RClusterIndex &clusterIndex) {
327 RClusterIndex collectionStart;
328 fField.GetCollectionInfo(clusterIndex, &collectionStart, &size);