Logo ROOT  
Reference Guide
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
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:108
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
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...
Definition: RNTupleUtil.hxx:83
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.
Definition: RNTupleUtil.hxx:43
RClusterSize ClusterSize_t
Definition: RNTupleUtil.hxx:58
constexpr ColumnId_t kInvalidColumnId
Definition: RNTupleUtil.hxx:76
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
Definition: RNTupleUtil.hxx:79
std::int64_t ColumnId_t
Uniquely identifies a physical column within the scope of the current process, used to tag pages.
Definition: RNTupleUtil.hxx:75
VSD Structures.
Definition: StringConv.hxx:21