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#include <memory>
24
25namespace ROOT {
26namespace Experimental {
27namespace Internal {
28
29// clang-format off
30/**
31\class ROOT::Experimental::Internal::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 static constexpr size_t kPageZeroSize = 64 * 1024;
44
45 /**
46 * Stores information about the cluster in which this page resides.
47 */
49 private:
50 /// The cluster number
52 /// The first element index of the column in this cluster
54 public:
55 RClusterInfo() = default;
56 RClusterInfo(NTupleSize_t id, NTupleSize_t indexOffset) : fId(id), fIndexOffset(indexOffset) {}
57 NTupleSize_t GetId() const { return fId; }
59 };
60
61private:
63 void *fBuffer;
64 std::uint32_t fElementSize;
65 std::uint32_t fNElements;
66 /// The capacity of the page in number of elements
67 std::uint32_t fMaxElements;
70
71public:
74 {}
75 RPage(ColumnId_t columnId, void* buffer, ClusterSize_t::ValueType elementSize, ClusterSize_t::ValueType maxElements)
76 : fColumnId(columnId), fBuffer(buffer), fElementSize(elementSize), fNElements(0), fMaxElements(maxElements),
78 {}
79 ~RPage() = default;
80
81 ColumnId_t GetColumnId() const { return fColumnId; }
82 /// The space taken by column elements in the buffer
83 std::uint32_t GetNBytes() const { return fElementSize * fNElements; }
84 std::uint32_t GetNElements() const { return fNElements; }
85 std::uint32_t GetMaxElements() const { return fMaxElements; }
91 }
92 const RClusterInfo& GetClusterInfo() const { return fClusterInfo; }
93
94 bool Contains(NTupleSize_t globalIndex) const {
95 return (globalIndex >= fRangeFirst) && (globalIndex < fRangeFirst + NTupleSize_t(fNElements));
96 }
97
98 bool Contains(RClusterIndex clusterIndex) const
99 {
100 if (fClusterInfo.GetId() != clusterIndex.GetClusterId())
101 return false;
102 auto clusterRangeFirst = ClusterSize_t(fRangeFirst - fClusterInfo.GetIndexOffset());
103 return (clusterIndex.GetIndex() >= clusterRangeFirst) &&
104 (clusterIndex.GetIndex() < clusterRangeFirst + fNElements);
105 }
106
107 void* GetBuffer() const { return fBuffer; }
108 /// Called during writing: returns a pointer after the last element and increases the element counter
109 /// in anticipation of the caller filling nElements in the page. It is the responsibility of the caller
110 /// to prevent page overflows, i.e. that fNElements + nElements <= fMaxElements
112 auto offset = GetNBytes();
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 /// Used by virtual page sources to map the physical column and cluster IDs to ther virtual counterparts
126 void ChangeIds(DescriptorId_t columnId, DescriptorId_t clusterId)
127 {
128 fColumnId = columnId;
130 }
131
132 /// Make a 'zero' page for column `columnId` (that is comprised of 0x00 bytes only). The caller is responsible for
133 /// invoking `GrowUnchecked()` and `SetWindow()` as appropriate.
135 {
136 return RPage{columnId, const_cast<void *>(GetPageZeroBuffer()), elementSize,
137 /*maxElements=*/(kPageZeroSize / elementSize)};
138 }
139 /// Return a pointer to the page zero buffer used if there is no on-disk data for a particular deferred column
140 static const void *GetPageZeroBuffer();
141
142 bool IsNull() const { return fBuffer == nullptr; }
143 bool IsPageZero() const { return fBuffer == GetPageZeroBuffer(); }
144 bool IsEmpty() const { return fNElements == 0; }
145 bool operator ==(const RPage &other) const { return fBuffer == other.fBuffer; }
146 bool operator !=(const RPage &other) const { return !(*this == other); }
147}; // class RPage
148
149} // namespace Internal
150} // namespace Experimental
151} // namespace ROOT
152
153#endif
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
Stores information about the cluster in which this page resides.
Definition RPage.hxx:48
NTupleSize_t fIndexOffset
The first element index of the column in this cluster.
Definition RPage.hxx:53
RClusterInfo(NTupleSize_t id, NTupleSize_t indexOffset)
Definition RPage.hxx:56
DescriptorId_t fId
The cluster number.
Definition RPage.hxx:51
A page is a slice of a column that is mapped into memory.
Definition RPage.hxx:41
void ResetCluster(const RClusterInfo &clusterInfo)
Definition RPage.hxx:123
bool operator!=(const RPage &other) const
Definition RPage.hxx:146
void Reset(NTupleSize_t rangeFirst)
Forget all currently stored elements (size == 0) and set a new starting index.
Definition RPage.hxx:122
void * GrowUnchecked(ClusterSize_t::ValueType nElements)
Called during writing: returns a pointer after the last element and increases the element counter in ...
Definition RPage.hxx:111
bool operator==(const RPage &other) const
Definition RPage.hxx:145
ClusterSize_t::ValueType GetClusterRangeFirst() const
Definition RPage.hxx:88
static constexpr size_t kPageZeroSize
Definition RPage.hxx:43
NTupleSize_t GetGlobalRangeFirst() const
Definition RPage.hxx:86
const RClusterInfo & GetClusterInfo() const
Definition RPage.hxx:92
bool Contains(RClusterIndex clusterIndex) const
Definition RPage.hxx:98
ColumnId_t GetColumnId() const
Definition RPage.hxx:81
static RPage MakePageZero(ColumnId_t columnId, ClusterSize_t::ValueType elementSize)
Make a 'zero' page for column columnId (that is comprised of 0x00 bytes only).
Definition RPage.hxx:134
std::uint32_t GetNBytes() const
The space taken by column elements in the buffer.
Definition RPage.hxx:83
std::uint32_t fMaxElements
The capacity of the page in number of elements.
Definition RPage.hxx:67
std::uint32_t GetNElements() const
Definition RPage.hxx:84
bool Contains(NTupleSize_t globalIndex) const
Definition RPage.hxx:94
void SetWindow(const NTupleSize_t rangeFirst, const RClusterInfo &clusterInfo)
Seek the page to a certain position of the column.
Definition RPage.hxx:117
void ChangeIds(DescriptorId_t columnId, DescriptorId_t clusterId)
Used by virtual page sources to map the physical column and cluster IDs to ther virtual counterparts.
Definition RPage.hxx:126
ClusterSize_t::ValueType GetClusterRangeLast() const
Definition RPage.hxx:89
NTupleSize_t GetGlobalRangeLast() const
Definition RPage.hxx:87
RPage(ColumnId_t columnId, void *buffer, ClusterSize_t::ValueType elementSize, ClusterSize_t::ValueType maxElements)
Definition RPage.hxx:75
static const void * GetPageZeroBuffer()
Return a pointer to the page zero buffer used if there is no on-disk data for a particular deferred c...
Definition RPage.cxx:18
std::uint32_t GetMaxElements() const
Definition RPage.hxx:85
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.
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.