Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RPage.hxx
Go to the documentation of this file.
1/// \file ROOT/RPage.hxx
2/// \ingroup NTuple ROOT7
3/// \author Jakob Blomer <jblomer@cern.ch>
4/// \date 2018-10-09
5/// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback
6/// is welcome!
7
8/*************************************************************************
9 * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
10 * All rights reserved. *
11 * *
12 * For the licensing terms see $ROOTSYS/LICENSE. *
13 * For the list of contributors see $ROOTSYS/README/CREDITS. *
14 *************************************************************************/
15
16#ifndef ROOT7_RPage
17#define ROOT7_RPage
18
19#include <ROOT/RNTupleUtil.hxx>
20
21#include <cstddef>
22#include <cstdint>
23
24namespace ROOT {
25namespace Experimental {
26
27namespace Detail {
28
29// clang-format off
30/**
31\class ROOT::Experimental::Detail::RPage
32\ingroup NTuple
33\brief A page is a slice of a column that is mapped into memory
34
35The page provides an opaque memory buffer for uncompressed, unpacked data. It does not interpret
36the contents but it does now about the size (and thus the number) of the elements inside as well as the element
37number range within the backing column/cluster. The memory buffer is not managed by the page. It is normally registered
38with the page pool and allocated/freed by the page storage.
39*/
40// clang-format on
41class RPage {
42public:
43 /**
44 * Stores information about the cluster in which this page resides.
45 */
47 private:
48 /// The cluster number
50 /// The first element index of the column in this cluster
52 public:
53 RClusterInfo() = default;
54 RClusterInfo(NTupleSize_t id, NTupleSize_t indexOffset) : fId(id), fIndexOffset(indexOffset) {}
55 NTupleSize_t GetId() const { return fId; }
57 };
58
59private:
61 void *fBuffer;
67
68public:
70 {}
71 RPage(ColumnId_t columnId, void* buffer, ClusterSize_t::ValueType capacity, ClusterSize_t::ValueType elementSize)
72 : fColumnId(columnId), fBuffer(buffer), fCapacity(capacity), fElementSize(elementSize), fNElements(0),
74 {}
75 ~RPage() = default;
76
77 ColumnId_t GetColumnId() const { return fColumnId; }
78 /// The total space available in the page
80 /// The space taken by column elements in the buffer
89 }
90 const RClusterInfo& GetClusterInfo() const { return fClusterInfo; }
91
92 bool Contains(NTupleSize_t globalIndex) const {
93 return (globalIndex >= fRangeFirst) && (globalIndex < fRangeFirst + NTupleSize_t(fNElements));
94 }
95
96 bool Contains(const RClusterIndex &clusterIndex) const {
97 if (fClusterInfo.GetId() != clusterIndex.GetClusterId())
98 return false;
99 auto clusterRangeFirst = ClusterSize_t(fRangeFirst - fClusterInfo.GetIndexOffset());
100 return (clusterIndex.GetIndex() >= clusterRangeFirst) &&
101 (clusterIndex.GetIndex() < clusterRangeFirst + fNElements);
102 }
103
104 void* GetBuffer() const { return fBuffer; }
105 /// Return a pointer after the last element that has space for nElements new elements. If there is not enough capacity,
106 /// return nullptr
108 auto offset = GetSize();
109 auto nbyte = nElements * fElementSize;
110 if (offset + nbyte > fCapacity) {
111 return nullptr;
112 }
113 fNElements += nElements;
114 return static_cast<unsigned char *>(fBuffer) + offset;
115 }
116 /// Seek the page to a certain position of the column
117 void SetWindow(const NTupleSize_t rangeFirst, const RClusterInfo &clusterInfo) {
118 fClusterInfo = clusterInfo;
119 fRangeFirst = rangeFirst;
120 }
121 /// Forget all currently stored elements (size == 0) and set a new starting index.
122 void Reset(NTupleSize_t rangeFirst) { fNElements = 0; fRangeFirst = rangeFirst; }
123 void ResetCluster(const RClusterInfo &clusterInfo) { fNElements = 0; fClusterInfo = clusterInfo; }
124
125 bool IsNull() const { return fBuffer == nullptr; }
126 bool operator ==(const RPage &other) const { return fBuffer == other.fBuffer; }
127 bool operator !=(const RPage &other) const { return !(*this == other); }
128};
129
130} // namespace Detail
131
132} // namespace Experimental
133} // namespace ROOT
134
135#endif
XFontStruct * id
Definition TGX11.cxx:109
Stores information about the cluster in which this page resides.
Definition RPage.hxx:46
DescriptorId_t fId
The cluster number.
Definition RPage.hxx:49
RClusterInfo(NTupleSize_t id, NTupleSize_t indexOffset)
Definition RPage.hxx:54
NTupleSize_t fIndexOffset
The first element index of the column in this cluster.
Definition RPage.hxx:51
A page is a slice of a column that is mapped into memory.
Definition RPage.hxx:41
ClusterSize_t::ValueType GetClusterRangeLast() const
Definition RPage.hxx:87
ClusterSize_t::ValueType GetElementSize() const
Definition RPage.hxx:82
ClusterSize_t::ValueType GetCapacity() const
The total space available in the page.
Definition RPage.hxx:79
ClusterSize_t::ValueType GetNElements() const
Definition RPage.hxx:83
ColumnId_t GetColumnId() const
Definition RPage.hxx:77
bool Contains(NTupleSize_t globalIndex) const
Definition RPage.hxx:92
const RClusterInfo & GetClusterInfo() const
Definition RPage.hxx:90
RPage(ColumnId_t columnId, void *buffer, ClusterSize_t::ValueType capacity, ClusterSize_t::ValueType elementSize)
Definition RPage.hxx:71
ClusterSize_t::ValueType fNElements
Definition RPage.hxx:64
bool operator==(const RPage &other) const
Definition RPage.hxx:126
void SetWindow(const NTupleSize_t rangeFirst, const RClusterInfo &clusterInfo)
Seek the page to a certain position of the column.
Definition RPage.hxx:117
void ResetCluster(const RClusterInfo &clusterInfo)
Definition RPage.hxx:123
ClusterSize_t::ValueType fCapacity
Definition RPage.hxx:62
ClusterSize_t::ValueType fElementSize
Definition RPage.hxx:63
void Reset(NTupleSize_t rangeFirst)
Forget all currently stored elements (size == 0) and set a new starting index.
Definition RPage.hxx:122
NTupleSize_t GetGlobalRangeFirst() const
Definition RPage.hxx:84
bool Contains(const RClusterIndex &clusterIndex) const
Definition RPage.hxx:96
NTupleSize_t GetGlobalRangeLast() const
Definition RPage.hxx:85
void * TryGrow(ClusterSize_t::ValueType nElements)
Return a pointer after the last element that has space for nElements new elements.
Definition RPage.hxx:107
ClusterSize_t::ValueType GetClusterRangeFirst() const
Definition RPage.hxx:86
bool operator!=(const RPage &other) const
Definition RPage.hxx:127
ClusterSize_t::ValueType GetSize() const
The space taken by column elements in the buffer.
Definition RPage.hxx:81
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
DescriptorId_t GetClusterId() const
ClusterSize_t::ValueType GetIndex() const
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
RClusterSize ClusterSize_t
constexpr ColumnId_t kInvalidColumnId
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
std::int64_t ColumnId_t
Uniquely identifies a physical column within the scope of the current process, used to tag pages.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...