32namespace Experimental {
122 template <
typename CppT>
125 auto column = std::unique_ptr<RColumn>(
new RColumn(
type, columnIdx, representationIdx));
126 column->fElement = RColumnElementBase::Generate<CppT>(
type);
149 std::memcpy(dst, from,
fElement->GetSize());
155 void AppendV(
const void *from, std::size_t count)
160 for (
unsigned i = 0; i < count; ++i) {
161 Append(
static_cast<const unsigned char *
>(from) +
fElement->GetSize() * i);
178 std::memcpy(dst, from,
fElement->GetSize() * count);
190 const auto elemSize =
fElement->GetSize();
193 std::memcpy(to, from, elemSize);
201 const auto elemSize =
fElement->GetSize();
204 std::memcpy(to, from, elemSize);
214 const auto elemSize =
fElement->GetSize();
217 std::memcpy(to, from, elemSize * count);
220 std::memcpy(to, from, elemSize * nBatch);
221 auto tail =
static_cast<unsigned char *
>(to) + nBatch * elemSize;
222 ReadV(globalIndex + nBatch, count - nBatch, tail);
233 const auto elemSize =
fElement->GetSize();
236 std::memcpy(to, from, elemSize * count);
239 std::memcpy(to, from, elemSize * nBatch);
240 auto tail =
static_cast<unsigned char *
>(to) + nBatch * elemSize;
245 template <
typename CppT>
249 return MapV<CppT>(globalIndex, nItems);
252 template <
typename CppT>
256 return MapV<CppT>(clusterIndex, nItems);
259 template <
typename CppT>
271 template <
typename CppT>
309 idxStart = *Map<ClusterSize_t>(globalIndex - 1);
310 idxEnd = *Map<ClusterSize_t>(globalIndex);
314 idxEnd = *Map<ClusterSize_t>(globalIndex);
316 idxStart = (globalIndex == selfOffset) ? 0 : *Map<ClusterSize_t>(globalIndex - 1);
319 idxEnd = *Map<ClusterSize_t>(globalIndex);
321 *collectionSize = idxEnd - idxStart;
328 auto idxStart = (
index == 0) ? 0 : *Map<ClusterSize_t>(clusterIndex - 1);
329 auto idxEnd = *Map<ClusterSize_t>(clusterIndex);
330 *collectionSize = idxEnd - idxStart;
337 auto varSwitch = Map<RColumnSwitch>(globalIndex);
339 *tag = varSwitch->GetTag();
#define R__unlikely(expr)
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
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 Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
A column element encapsulates the translation between basic C++ types and their column representation...
A column is a storage-backed array of a simple, fixed-size type, from which pages can be mapped into ...
RColumn(const RColumn &)=delete
std::size_t fLastGoodTeamIdx
Points into fTeam to the column that successfully returned the last page.
RPageStorage::ColumnHandle_t GetHandleSink() const
void Read(RClusterIndex clusterIndex, void *to)
void ConnectPageSink(DescriptorId_t fieldId, RPageSink &pageSink, NTupleSize_t firstElementIndex=0U)
Connect the column to a page sink.
std::unique_ptr< RColumnElementBase > fElement
Used to pack and unpack pages on writing/reading.
void HandleWritePageIfFull()
Used in Append() and AppendV() to handle the case when the main page reached the target size.
NTupleSize_t GetGlobalIndex(RClusterIndex clusterIndex)
RColumnElementBase * GetElement() const
RPageRef fReadPageRef
The currently mapped page for reading.
bool TryMapPage(NTupleSize_t globalIndex)
void MapPage(RClusterIndex clusterIndex)
void MapPage(NTupleSize_t globalIndex)
void GetCollectionInfo(RClusterIndex clusterIndex, RClusterIndex *collectionStart, ClusterSize_t *collectionSize)
ColumnId_t fColumnIdSource
The column id is used to find matching pages with content when reading.
void ReadV(RClusterIndex clusterIndex, const ClusterSize_t::ValueType count, void *to)
int fWritePageIdx
Index of the current write page.
CppT * Map(const NTupleSize_t globalIndex)
RPageSource * GetPageSource() const
RPageSource * fPageSource
static std::unique_ptr< RColumn > Create(EColumnType type, std::uint32_t columnIdx, std::uint16_t representationIdx)
void AppendV(const void *from, std::size_t count)
void Append(const void *from)
CppT * Map(RClusterIndex clusterIndex)
CppT * MapV(RClusterIndex clusterIndex, NTupleSize_t &nItems)
RColumn & operator=(const RColumn &)=delete
bool ReadPageContains(RClusterIndex clusterIndex) const
RPageStorage::ColumnHandle_t fHandleSource
NTupleSize_t fNElements
The number of elements written resp. available in the column.
std::uint16_t GetRepresentationIndex() const
void ReadV(const NTupleSize_t globalIndex, const ClusterSize_t::ValueType count, void *to)
std::vector< RColumn * > fTeam
The column team is a set of columns that serve the same column index for different representation IDs...
void Read(const NTupleSize_t globalIndex, void *to)
EColumnType GetType() const
std::uint32_t fIndex
Columns belonging to the same field are distinguished by their order.
std::uint32_t GetIndex() const
std::uint16_t fBitsOnStorage
ColumnId_t GetColumnIdSource() const
void ConnectPageSource(DescriptorId_t fieldId, RPageSource &pageSource)
Connect the column to a page source.
std::uint32_t fApproxNElementsPerPage
For writing, the targeted number of elements, given by fApproxNElementsPerPage (in the write options)...
RPageSink * GetPageSink() const
void GetCollectionInfo(const NTupleSize_t globalIndex, RClusterIndex *collectionStart, ClusterSize_t *collectionSize)
For offset columns only, look at the two adjacent values that define a collection's coordinates.
CppT * MapV(const NTupleSize_t globalIndex, NTupleSize_t &nItems)
void MergeTeams(RColumn &other)
std::uint16_t fRepresentationIndex
Fields can have multiple column representations, distinguished by representation index.
void GetSwitchInfo(NTupleSize_t globalIndex, RClusterIndex *varIndex, std::uint32_t *tag)
Get the currently active cluster id.
RPageStorage::ColumnHandle_t fHandleSink
void FlushShadowWritePage()
When the main write page surpasses the 50% fill level, the (full) shadow write page gets flushed.
RPage fWritePage[2]
A set of open pages into which new elements are being written.
NTupleSize_t GetNElements() const
bool ReadPageContains(NTupleSize_t globalIndex) const
NTupleSize_t GetFirstElementIndex() const
RPageStorage::ColumnHandle_t GetHandleSource() const
RClusterIndex GetClusterIndex(NTupleSize_t globalIndex)
NTupleSize_t fFirstElementIndex
Global index of the first element in this column; usually == 0, unless it is a deferred column.
std::uint16_t GetBitsOnStorage() const
Abstract interface to write data into an ntuple.
virtual void CommitPage(ColumnHandle_t columnHandle, const RPage &page)=0
Write a page to the storage. The column must have been added before.
Abstract interface to read data from an ntuple.
NTupleSize_t GetIndexOffset() const
NTupleSize_t GetId() const
A page is a slice of a column that is mapped into memory.
void Reset(NTupleSize_t rangeFirst)
Forget all currently stored elements (size == 0) and set a new starting index.
void * GrowUnchecked(ClusterSize_t::ValueType nElements)
Called during writing: returns a pointer after the last element and increases the element counter in ...
ClusterSize_t::ValueType GetClusterRangeFirst() const
NTupleSize_t GetGlobalRangeFirst() const
const RClusterInfo & GetClusterInfo() const
std::uint32_t GetNElements() const
bool Contains(NTupleSize_t globalIndex) const
ClusterSize_t::ValueType GetClusterRangeLast() const
NTupleSize_t GetGlobalRangeLast() const
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.
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...
Wrap the integer in a struct in order to avoid template specialization clash with std::uint64_t.