diff --git a/tree/ntuple/CMakeLists.txt b/tree/ntuple/CMakeLists.txt index 37e8c98c8d10b..d9b4e6d21c297 100644 --- a/tree/ntuple/CMakeLists.txt +++ b/tree/ntuple/CMakeLists.txt @@ -49,7 +49,6 @@ SOURCES v7/src/RColumnElement.cxx v7/src/RField.cxx v7/src/RFieldVisitor.cxx - v7/src/REntry.cxx v7/src/RMiniFile.cxx v7/src/RNTuple.cxx v7/src/RNTupleAnchor.cxx diff --git a/tree/ntuple/v7/inc/ROOT/REntry.hxx b/tree/ntuple/v7/inc/ROOT/REntry.hxx index 5d12c470b4929..e63304a570920 100644 --- a/tree/ntuple/v7/inc/ROOT/REntry.hxx +++ b/tree/ntuple/v7/inc/ROOT/REntry.hxx @@ -50,23 +50,20 @@ class REntry { std::uint64_t fModelId = 0; /// Corresponds to the top-level fields of the linked model std::vector fValues; - /// The objects involed in serialization and deserialization might be used long after the entry is gone: - /// hence the shared pointer - std::vector> fValuePtrs; // Creation of entries is done by the RNTupleModel class REntry() = default; explicit REntry(std::uint64_t modelId) : fModelId(modelId) {} - void AddValue(Detail::RFieldBase::RValue &&value); + void AddValue(Detail::RFieldBase::RValue &&value) { fValues.emplace_back(std::move(value)); } /// While building the entry, adds a new value to the list and return the value's shared pointer - template - std::shared_ptr AddValue(RField* field, ArgsT&&... args) { + template + std::shared_ptr AddValue(RField &field, ArgsT &&...args) + { auto ptr = std::make_shared(std::forward(args)...); - fValues.emplace_back(field->BindValue(ptr)); - fValuePtrs.emplace_back(ptr); + fValues.emplace_back(field.BindValue(ptr)); return ptr; } diff --git a/tree/ntuple/v7/inc/ROOT/RNTuple.hxx b/tree/ntuple/v7/inc/ROOT/RNTuple.hxx index 886fa74c95d74..adcf8a466cbd5 100644 --- a/tree/ntuple/v7/inc/ROOT/RNTuple.hxx +++ b/tree/ntuple/v7/inc/ROOT/RNTuple.hxx @@ -200,12 +200,12 @@ public: std::unique_ptr Clone() { return std::make_unique(fSource->Clone()); } ~RNTupleReader(); - RNTupleModel *GetModel(); NTupleSize_t GetNEntries() const { return fSource->GetNEntries(); } + const RNTupleModel &GetModel(); /// Returns a cached copy of the page source descriptor. The returned pointer remains valid until the next call /// to LoadEntry or to any of the views returned from the reader. - const RNTupleDescriptor *GetDescriptor(); + const RNTupleDescriptor &GetDescriptor(); /// Prints a detailed summary of the ntuple, including a list of fields. /// @@ -250,7 +250,7 @@ public: fModel = fSource->GetSharedDescriptorGuard()->GenerateModel(); ConnectModel(*fModel); } - LoadEntry(index, *fModel->GetDefaultEntry()); + LoadEntry(index, fModel->GetDefaultEntry()); } /// Fills a user provided entry after checking that the entry has been instantiated from the ntuple model void LoadEntry(NTupleSize_t index, REntry &entry) { entry.Read(index); } @@ -463,7 +463,7 @@ public: /// The simplest user interface if the default entry that comes with the ntuple model is used. /// \return The number of uncompressed bytes written. - std::size_t Fill() { return fFillContext.Fill(*fFillContext.fModel->GetDefaultEntry()); } + std::size_t Fill() { return fFillContext.Fill(fFillContext.fModel->GetDefaultEntry()); } /// Multiple entries can have been instantiated from the ntuple model. This method will perform /// a light check whether the entry comes from the ntuple's own model. /// \return The number of uncompressed bytes written. diff --git a/tree/ntuple/v7/inc/ROOT/RNTupleModel.hxx b/tree/ntuple/v7/inc/ROOT/RNTupleModel.hxx index 888e08ca781de..186278dc35d21 100644 --- a/tree/ntuple/v7/inc/ROOT/RNTupleModel.hxx +++ b/tree/ntuple/v7/inc/ROOT/RNTupleModel.hxx @@ -157,18 +157,20 @@ public: /// Upon completion, `BeginUpdate()` can be called again to begin a new set of changes. void CommitUpdate(); - void AddField(std::unique_ptr field); - template - void AddField(const NameWithDescription_t &fieldNameDesc, T *fromWhere) + template + std::shared_ptr MakeField(const NameWithDescription_t &fieldNameDesc, ArgsT &&...args) { - fOpenChangeset.fModel.AddField(fieldNameDesc, fromWhere); + auto objPtr = fOpenChangeset.fModel.MakeField(fieldNameDesc, std::forward(args)...); auto fieldZero = fOpenChangeset.fModel.fFieldZero.get(); auto it = std::find_if(fieldZero->begin(), fieldZero->end(), [&](const auto &f) { return f.GetName() == fieldNameDesc.fName; }); R__ASSERT(it != fieldZero->end()); fOpenChangeset.fAddedFields.emplace_back(&(*it)); + return objPtr; } + void AddField(std::unique_ptr field); + RResult AddProjectedField(std::unique_ptr field, std::function mapping); }; @@ -260,8 +262,7 @@ public: /// }); /// ~~~ template - std::shared_ptr MakeField(const NameWithDescription_t &fieldNameDesc, - ArgsT&&... args) + std::shared_ptr MakeField(const NameWithDescription_t &fieldNameDesc, ArgsT &&...args) { EnsureNotFrozen(); EnsureValidFieldName(fieldNameDesc.fName); @@ -269,7 +270,7 @@ public: field->SetDescription(fieldNameDesc.fDescription); std::shared_ptr ptr; if (fDefaultEntry) - ptr = fDefaultEntry->AddValue(field.get(), std::forward(args)...); + ptr = fDefaultEntry->AddValue(*field, std::forward(args)...); fFieldZero->Attach(std::move(field)); return ptr; } @@ -279,34 +280,11 @@ public: /// Throws an exception if the field is null. void AddField(std::unique_ptr field); - /// Throws an exception if fromWhere is null. - template - void AddField(const NameWithDescription_t &fieldNameDesc, T* fromWhere) { - EnsureNotFrozen(); - EnsureNotBare(); - if (!fromWhere) - throw RException(R__FAIL("null field fromWhere")); - EnsureValidFieldName(fieldNameDesc.fName); - - auto field = std::make_unique>(fieldNameDesc.fName); - field->SetDescription(fieldNameDesc.fDescription); - fDefaultEntry->AddValue(field->BindValue(std::shared_ptr(fromWhere, [](void *) {}))); - fFieldZero->Attach(std::move(field)); - } - /// Adds a top-level field based on existing fields. The mapping function is called with the qualified field names /// of the provided field and the subfields. It should return the qualified field names used as a mapping source. /// Projected fields can only be used for models used to write data. RResult AddProjectedField(std::unique_ptr field, std::function mapping); - - template - T *Get(std::string_view fieldName) const - { - EnsureNotBare(); - return fDefaultEntry->GetPtr(fieldName).get(); - } - const RProjectedFields &GetProjectedFields() const { return *fProjectedFields; } void Freeze(); @@ -325,7 +303,11 @@ public: /// In a bare entry, all values point to nullptr. The resulting entry shall use BindValue() in order /// set memory addresses to be serialized / deserialized std::unique_ptr CreateBareEntry() const; - REntry *GetDefaultEntry() const; + /// Calls the given field's GenerateBulk() method. Throws an exception if no field with the given name exists. + Detail::RFieldBase::RBulk GenerateBulk(std::string_view fieldName) const; + + REntry &GetDefaultEntry(); + const REntry &GetDefaultEntry() const; /// Non-const access to the root field is used to commit clusters during writing /// and to set the on-disk field IDs when connecting a model to a page source or sink. diff --git a/tree/ntuple/v7/src/REntry.cxx b/tree/ntuple/v7/src/REntry.cxx deleted file mode 100644 index 9d287cbc51220..0000000000000 --- a/tree/ntuple/v7/src/REntry.cxx +++ /dev/null @@ -1,24 +0,0 @@ -/// \file REntry.cxx -/// \ingroup NTuple ROOT7 -/// \author Jakob Blomer -/// \date 2018-10-15 -/// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback -/// is welcome! - -/************************************************************************* - * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. * - * All rights reserved. * - * * - * For the licensing terms see $ROOTSYS/LICENSE. * - * For the list of contributors see $ROOTSYS/README/CREDITS. * - *************************************************************************/ - -#include -#include - -#include - -void ROOT::Experimental::REntry::AddValue(Detail::RFieldBase::RValue &&value) -{ - fValues.emplace_back(std::move(value)); -} diff --git a/tree/ntuple/v7/src/RNTuple.cxx b/tree/ntuple/v7/src/RNTuple.cxx index 28458ec68f039..5cf57f5016559 100644 --- a/tree/ntuple/v7/src/RNTuple.cxx +++ b/tree/ntuple/v7/src/RNTuple.cxx @@ -152,13 +152,13 @@ ROOT::Experimental::RNTupleReader::OpenFriends(std::span ntuples) return std::make_unique(std::make_unique("_friends", sources)); } -ROOT::Experimental::RNTupleModel *ROOT::Experimental::RNTupleReader::GetModel() +const ROOT::Experimental::RNTupleModel &ROOT::Experimental::RNTupleReader::GetModel() { if (!fModel) { fModel = fSource->GetSharedDescriptorGuard()->GenerateModel(); ConnectModel(*fModel); } - return fModel.get(); + return *fModel; } void ROOT::Experimental::RNTupleReader::PrintInfo(const ENTupleInfo what, std::ostream &output) @@ -235,16 +235,16 @@ ROOT::Experimental::RNTupleReader *ROOT::Experimental::RNTupleReader::GetDisplay void ROOT::Experimental::RNTupleReader::Show(NTupleSize_t index, std::ostream &output) { auto reader = GetDisplayReader(); - auto entry = reader->GetModel()->GetDefaultEntry(); + const auto &entry = reader->GetModel().GetDefaultEntry(); reader->LoadEntry(index); output << "{"; - for (auto iValue = entry->begin(); iValue != entry->end();) { + for (auto iValue = entry.begin(); iValue != entry.end();) { output << std::endl; RPrintValueVisitor visitor(*iValue, output, 1 /* level */); iValue->GetField().AcceptVisitor(visitor); - if (++iValue == entry->end()) { + if (++iValue == entry.end()) { output << std::endl; break; } else { @@ -254,12 +254,12 @@ void ROOT::Experimental::RNTupleReader::Show(NTupleSize_t index, std::ostream &o output << "}" << std::endl; } -const ROOT::Experimental::RNTupleDescriptor *ROOT::Experimental::RNTupleReader::GetDescriptor() +const ROOT::Experimental::RNTupleDescriptor &ROOT::Experimental::RNTupleReader::GetDescriptor() { auto descriptorGuard = fSource->GetSharedDescriptorGuard(); if (!fCachedDescriptor || fCachedDescriptor->GetGeneration() != descriptorGuard->GetGeneration()) fCachedDescriptor = descriptorGuard->Clone(); - return fCachedDescriptor.get(); + return *fCachedDescriptor; } //------------------------------------------------------------------------------ diff --git a/tree/ntuple/v7/src/RNTupleModel.cxx b/tree/ntuple/v7/src/RNTupleModel.cxx index b9f03a4376571..a7e29e2cea5ef 100644 --- a/tree/ntuple/v7/src/RNTupleModel.cxx +++ b/tree/ntuple/v7/src/RNTupleModel.cxx @@ -330,12 +330,20 @@ ROOT::Experimental::RNTupleModel::GetField(std::string_view fieldName) const return *f; } -ROOT::Experimental::REntry *ROOT::Experimental::RNTupleModel::GetDefaultEntry() const +ROOT::Experimental::REntry &ROOT::Experimental::RNTupleModel::GetDefaultEntry() { if (!IsFrozen()) throw RException(R__FAIL("invalid attempt to get default entry of unfrozen model")); EnsureNotBare(); - return fDefaultEntry.get(); + return *fDefaultEntry; +} + +const ROOT::Experimental::REntry &ROOT::Experimental::RNTupleModel::GetDefaultEntry() const +{ + if (!IsFrozen()) + throw RException(R__FAIL("invalid attempt to get default entry of unfrozen model")); + EnsureNotBare(); + return *fDefaultEntry; } std::unique_ptr ROOT::Experimental::RNTupleModel::CreateEntry() const @@ -362,6 +370,18 @@ std::unique_ptr ROOT::Experimental::RNTupleModel::Cr return entry; } +ROOT::Experimental::Detail::RFieldBase::RBulk +ROOT::Experimental::RNTupleModel::GenerateBulk(std::string_view fieldName) const +{ + if (!IsFrozen()) + throw RException(R__FAIL("invalid attempt to create bulk of unfrozen model")); + + auto f = FindField(fieldName); + if (!f) + throw RException(R__FAIL("no such field: " + std::string(fieldName))); + return f->GenerateBulk(); +} + void ROOT::Experimental::RNTupleModel::Unfreeze() { if (!IsFrozen()) diff --git a/tree/ntuple/v7/test/ntuple_basics.cxx b/tree/ntuple/v7/test/ntuple_basics.cxx index d9b3e8fffcce5..47f465ec8b591 100644 --- a/tree/ntuple/v7/test/ntuple_basics.cxx +++ b/tree/ntuple/v7/test/ntuple_basics.cxx @@ -31,19 +31,19 @@ TEST(RNTuple, ReconstructModel) auto modelReconstructed = source.GetSharedDescriptorGuard()->GenerateModel(); try { - modelReconstructed->GetDefaultEntry()->GetPtr("xyz"); + modelReconstructed->GetDefaultEntry().GetPtr("xyz"); FAIL() << "invalid field name should throw"; } catch (const RException &err) { EXPECT_THAT(err.what(), testing::HasSubstr("invalid field name")); } - auto vecPtr = modelReconstructed->GetDefaultEntry()->GetPtr>>("nnlo"); + auto vecPtr = modelReconstructed->GetDefaultEntry().GetPtr>>("nnlo"); EXPECT_TRUE(vecPtr != nullptr); // Don't crash vecPtr->push_back(std::vector{1.0}); - auto array = modelReconstructed->GetDefaultEntry()->GetPtr>("array"); + auto array = modelReconstructed->GetDefaultEntry().GetPtr>("array"); EXPECT_TRUE(array != nullptr); auto variant = - modelReconstructed->GetDefaultEntry()->GetPtr>>("variant"); + modelReconstructed->GetDefaultEntry().GetPtr>>("variant"); EXPECT_TRUE(variant != nullptr); } @@ -105,6 +105,7 @@ TEST(RNTuple, WriteRead) auto wrKlass = modelWrite->MakeField("klass"); wrKlass->s = "abc"; + modelWrite->Freeze(); auto modelRead = modelWrite->Clone(); { @@ -113,13 +114,13 @@ TEST(RNTuple, WriteRead) ntuple.Fill(); } - auto rdSignal = modelRead->Get("signal"); - auto rdPt = modelRead->Get("pt"); - auto rdEnergy = modelRead->Get("energy"); - auto rdTag = modelRead->Get("tag"); - auto rdJets = modelRead->Get>("jets"); - auto rdNnlo = modelRead->Get>>("nnlo"); - auto rdKlass = modelRead->Get("klass"); + auto rdSignal = modelRead->GetDefaultEntry().GetPtr("signal"); + auto rdPt = modelRead->GetDefaultEntry().GetPtr("pt"); + auto rdEnergy = modelRead->GetDefaultEntry().GetPtr("energy"); + auto rdTag = modelRead->GetDefaultEntry().GetPtr("tag"); + auto rdJets = modelRead->GetDefaultEntry().GetPtr>("jets"); + auto rdNnlo = modelRead->GetDefaultEntry().GetPtr>>("nnlo"); + auto rdKlass = modelRead->GetDefaultEntry().GetPtr("klass"); RNTupleReader ntuple(std::move(modelRead), std::make_unique("myNTuple", fileGuard.GetPath(), RNTupleReadOptions())); @@ -178,8 +179,8 @@ TEST(RNTuple, FileAnchor) EXPECT_EQ(1U, readerA->GetNEntries()); EXPECT_EQ(1U, readerB->GetNEntries()); - auto a = readerA->GetModel()->Get("a"); - auto b = readerB->GetModel()->Get("b"); + auto a = readerA->GetModel().GetDefaultEntry().GetPtr("a"); + auto b = readerB->GetModel().GetDefaultEntry().GetPtr("b"); readerA->LoadEntry(0); readerB->LoadEntry(0); EXPECT_EQ(42, *a); @@ -203,6 +204,7 @@ TEST(RNTuple, Clusters) wrFourVec->at(2) = 2.0; wrFourVec->at(3) = 3.0; + modelWrite->Freeze(); auto modelRead = modelWrite->Clone(); { @@ -222,10 +224,10 @@ TEST(RNTuple, Clusters) ntuple.Fill(); } - auto rdPt = modelRead->Get("pt"); - auto rdTag = modelRead->Get("tag"); - auto rdNnlo = modelRead->Get>>("nnlo"); - auto rdFourVec = modelRead->Get>("fourVec"); + auto rdPt = modelRead->GetDefaultEntry().GetPtr("pt"); + auto rdTag = modelRead->GetDefaultEntry().GetPtr("tag"); + auto rdNnlo = modelRead->GetDefaultEntry().GetPtr>>("nnlo"); + auto rdFourVec = modelRead->GetDefaultEntry().GetPtr>("fourVec"); RNTupleReader ntuple(std::move(modelRead), std::make_unique("myNTuple", fileGuard.GetPath(), RNTupleReadOptions())); @@ -281,7 +283,7 @@ TEST(RNTuple, ClusterEntries) auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); // 100 entries / 5 entries per cluster - EXPECT_EQ(20, ntuple->GetDescriptor()->GetNClusters()); + EXPECT_EQ(20, ntuple->GetDescriptor().GetNClusters()); } TEST(RNTuple, PageSize) @@ -302,7 +304,7 @@ TEST(RNTuple, PageSize) } auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto &col0_pages = ntuple->GetDescriptor()->GetClusterDescriptor(0).GetPageRange(0); + const auto &col0_pages = ntuple->GetDescriptor().GetClusterDescriptor(0).GetPageRange(0); // 1000 column elements / 50 elements per page EXPECT_EQ(20, col0_pages.fPageInfos.size()); } @@ -340,13 +342,6 @@ TEST(RNTupleModel, EnforceValidFieldNames) } catch (const RException& err) { EXPECT_THAT(err.what(), testing::HasSubstr("field name 'pt' already exists")); } - try { - float num = 10.0; - model->AddField("pt", &num); - FAIL() << "repeated field names should throw"; - } catch (const RException& err) { - EXPECT_THAT(err.what(), testing::HasSubstr("field name 'pt' already exists")); - } // MakeCollection try { @@ -370,9 +365,6 @@ TEST(RNTupleModel, FieldDescriptions) auto pt = model->MakeField({"pt", "transverse momentum"}, 42.0); - float num = 10.0; - model->AddField({"mass", "mass"}, &num); - auto charge = std::make_unique>(RField("charge")); charge->SetDescription("electric charge"); model->AddField(std::move(charge)); @@ -383,13 +375,12 @@ TEST(RNTupleModel, FieldDescriptions) auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); std::vector fieldDescriptions; - for (auto &f : ntuple->GetDescriptor()->GetTopLevelFields()) { + for (auto &f : ntuple->GetDescriptor().GetTopLevelFields()) { fieldDescriptions.push_back(f.GetFieldDescription()); } - ASSERT_EQ(3, fieldDescriptions.size()); + ASSERT_EQ(2u, fieldDescriptions.size()); EXPECT_EQ(std::string("transverse momentum"), fieldDescriptions[0]); - EXPECT_EQ(std::string("mass"), fieldDescriptions[1]); - EXPECT_EQ(std::string("electric charge"), fieldDescriptions[2]); + EXPECT_EQ(std::string("electric charge"), fieldDescriptions[1]); } TEST(RNTupleModel, CollectionFieldDescriptions) @@ -405,7 +396,7 @@ TEST(RNTupleModel, CollectionFieldDescriptions) } auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto &muon_desc = *ntuple->GetDescriptor()->GetTopLevelFields().begin(); + const auto &muon_desc = *ntuple->GetDescriptor().GetTopLevelFields().begin(); EXPECT_EQ(std::string("muons after basic selection"), muon_desc.GetFieldDescription()); } @@ -486,12 +477,6 @@ TEST(RNTuple, NullSafety) } catch (const RException& err) { EXPECT_THAT(err.what(), testing::HasSubstr("null field")); } - try { - model->AddField("pt", nullptr); - FAIL() << "null fields should throw"; - } catch (const RException& err) { - EXPECT_THAT(err.what(), testing::HasSubstr("null field fromWhere")); - } // RNTupleReader and RNTupleWriter FileRaii fileGuard("test_ntuple_null_safety.root"); @@ -571,13 +556,6 @@ TEST(RNTuple, ModelId) } catch (const RException &err) { EXPECT_THAT(err.what(), testing::HasSubstr("invalid attempt to modify frozen model")); } - try { - float dummy; - m1->AddField("pt", &dummy); - FAIL() << "changing frozen model should throw"; - } catch (const RException &err) { - EXPECT_THAT(err.what(), testing::HasSubstr("invalid attempt to modify frozen model")); - } EXPECT_NE(m1->GetModelId(), m2->GetModelId()); // Freeze() should be idempotent call @@ -638,7 +616,7 @@ TEST(RNTuple, BareEntry) EXPECT_THAT(err.what(), testing::HasSubstr("invalid attempt to use default entry of bare model")); } try { - model.Get("pt"); + model.GetDefaultEntry().GetPtr("pt"); FAIL() << "accessing default entry of bare model should throw"; } catch (const RException &err) { EXPECT_THAT(err.what(), testing::HasSubstr("invalid attempt to use default entry of bare model")); @@ -659,9 +637,9 @@ TEST(RNTuple, BareEntry) auto ntuple = RNTupleReader::Open("ntpl", fileGuard.GetPath()); ASSERT_EQ(2U, ntuple->GetNEntries()); ntuple->LoadEntry(0); - EXPECT_EQ(1.0, *ntuple->GetModel()->GetDefaultEntry()->GetPtr("pt")); + EXPECT_EQ(1.0, *ntuple->GetModel().GetDefaultEntry().GetPtr("pt")); ntuple->LoadEntry(1); - EXPECT_EQ(2.0, *ntuple->GetModel()->GetDefaultEntry()->GetPtr("pt")); + EXPECT_EQ(2.0, *ntuple->GetModel().GetDefaultEntry().GetPtr("pt")); } namespace ROOT::Experimental::Internal { @@ -713,7 +691,7 @@ TEST(RNTuple, ReadCallback) model->AddField(std::move(fieldKlass)); auto ntuple = RNTupleReader::Open(std::move(model), "f", fileGuard.GetPath()); - auto rdKlass = ntuple->GetModel()->GetDefaultEntry()->GetPtr("klass"); + auto rdKlass = ntuple->GetModel().GetDefaultEntry().GetPtr("klass"); EXPECT_EQ(2U, ntuple->GetNEntries()); ntuple->LoadEntry(0); EXPECT_EQ(1337.0, rdKlass->a); diff --git a/tree/ntuple/v7/test/ntuple_bulk.cxx b/tree/ntuple/v7/test/ntuple_bulk.cxx index e3f4a938fbd72..27274d31f9afc 100644 --- a/tree/ntuple/v7/test/ntuple_bulk.cxx +++ b/tree/ntuple/v7/test/ntuple_bulk.cxx @@ -14,26 +14,20 @@ TEST(RNTupleBulk, Simple) } auto reader = RNTupleReader::Open("ntpl", fileGuard.GetPath()); - // TODO(jblomer): find a better way to expose the GenerateBulk method of the target field - std::unique_ptr bulk; - for (auto &f : reader->GetModel()->GetFieldZero()) { - if (f.GetName() != "int") - continue; - bulk = std::make_unique(f.GenerateBulk()); - } + RFieldBase::RBulk bulk = reader->GetModel().GenerateBulk("int"); auto mask = std::make_unique(10); std::fill(mask.get(), mask.get() + 10, true); - auto intArr5 = static_cast(bulk->ReadBulk(RClusterIndex(0, 0), mask.get(), 5)); + auto intArr5 = static_cast(bulk.ReadBulk(RClusterIndex(0, 0), mask.get(), 5)); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, intArr5[i]); } - auto intArr1 = static_cast(bulk->ReadBulk(RClusterIndex(0, 1), mask.get(), 1)); + auto intArr1 = static_cast(bulk.ReadBulk(RClusterIndex(0, 1), mask.get(), 1)); EXPECT_EQ(1, intArr1[0]); EXPECT_EQ(static_cast(intArr5) + 1, static_cast(intArr1)); - auto intArr10 = static_cast(bulk->ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); + auto intArr10 = static_cast(bulk.ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(i, intArr10[i]); } @@ -53,32 +47,27 @@ TEST(RNTupleBulk, Complex) } auto reader = RNTupleReader::Open("ntpl", fileGuard.GetPath()); - std::unique_ptr bulk; - for (auto &f : reader->GetModel()->GetFieldZero()) { - if (f.GetName() != "S") - continue; - bulk = std::make_unique(f.GenerateBulk()); - } + RFieldBase::RBulk bulk = reader->GetModel().GenerateBulk("S"); auto mask = std::make_unique(10); for (unsigned int i = 0; i < 10; ++i) mask[i] = (i % 2 == 0); - auto SArr5 = static_cast(bulk->ReadBulk(RClusterIndex(0, 0), mask.get(), 5)); + auto SArr5 = static_cast(bulk.ReadBulk(RClusterIndex(0, 0), mask.get(), 5)); for (int i = 0; i < 5; ++i) { EXPECT_FLOAT_EQ((i % 2 == 0) ? float(i) : 0.0, SArr5[i].a); } - auto SArr1 = static_cast(bulk->ReadBulk(RClusterIndex(0, 1), mask.get() + 1, 1)); + auto SArr1 = static_cast(bulk.ReadBulk(RClusterIndex(0, 1), mask.get() + 1, 1)); EXPECT_FLOAT_EQ(0.0, SArr1[0].a); EXPECT_EQ(static_cast(SArr5) + 1, static_cast(SArr1)); - SArr1 = static_cast(bulk->ReadBulk(RClusterIndex(0, 1), mask.get(), 1)); + SArr1 = static_cast(bulk.ReadBulk(RClusterIndex(0, 1), mask.get(), 1)); EXPECT_FLOAT_EQ(1.0, SArr1[0].a); EXPECT_EQ(static_cast(SArr5) + 1, static_cast(SArr1)); for (unsigned int i = 0; i < 10; ++i) mask[i] = !mask[i]; - auto SArr10 = static_cast(bulk->ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); + auto SArr10 = static_cast(bulk.ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); for (int i = 0; i < 10; ++i) { EXPECT_FLOAT_EQ((i % 2 == 0) ? 0.0 : float(i), SArr10[i].a); } @@ -105,21 +94,16 @@ TEST(RNTupleBulk, CardinalityField) } auto reader = RNTupleReader::Open("ntpl", fileGuard.GetPath()); + const auto &model = reader->GetModel(); - std::unique_ptr bulk32; - std::unique_ptr bulk64; - for (auto &f : reader->GetModel()->GetFieldZero()) { - if (f.GetName() == "card32") - bulk32 = std::make_unique(f.GenerateBulk()); - if (f.GetName() == "card64") - bulk64 = std::make_unique(f.GenerateBulk()); - } + RFieldBase::RBulk bulk32 = model.GenerateBulk("card32"); + RFieldBase::RBulk bulk64 = model.GenerateBulk("card64"); auto mask = std::make_unique(10); std::fill(mask.get(), mask.get() + 10, false /* the cardinality field optimization should ignore the mask */); - auto card32Arr = static_cast(bulk32->ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); - auto card64Arr = static_cast(bulk64->ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); + auto card32Arr = static_cast(bulk32.ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); + auto card64Arr = static_cast(bulk64.ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(i, card32Arr[i]); EXPECT_EQ(i, card64Arr[i]); @@ -152,26 +136,19 @@ TEST(RNTupleBulk, RVec) } auto reader = RNTupleReader::Open("ntpl", fileGuard.GetPath()); + const auto &model = reader->GetModel(); - std::unique_ptr bulkI; - std::unique_ptr bulkS; - std::unique_ptr bulkVI; - for (auto &f : reader->GetModel()->GetFieldZero()) { - if (f.GetName() == "vint") - bulkI = std::make_unique(f.GenerateBulk()); - if (f.GetName() == "vs") - bulkS = std::make_unique(f.GenerateBulk()); - if (f.GetName() == "vvint") - bulkVI = std::make_unique(f.GenerateBulk()); - } + RFieldBase::RBulk bulkI = model.GenerateBulk("vint"); + RFieldBase::RBulk bulkS = model.GenerateBulk("vs"); + RFieldBase::RBulk bulkVI = model.GenerateBulk("vvint"); auto mask = std::make_unique(10); std::fill(mask.get(), mask.get() + 10, true); mask[1] = false; // the RVec field optimization should ignore the mask - auto iArr = static_cast(bulkI->ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); - auto sArr = static_cast *>(bulkS->ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); - auto viArr = static_cast *>(bulkVI->ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); + auto iArr = static_cast(bulkI.ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); + auto sArr = static_cast *>(bulkS.ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); + auto viArr = static_cast *>(bulkVI.ReadBulk(RClusterIndex(0, 0), mask.get(), 10)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(i, iArr[i].size()); EXPECT_EQ(i == 1 ? 0 : i, sArr[i].size()); diff --git a/tree/ntuple/v7/test/ntuple_descriptor.cxx b/tree/ntuple/v7/test/ntuple_descriptor.cxx index fadcfc76aea68..da9ce12263bbe 100644 --- a/tree/ntuple/v7/test/ntuple_descriptor.cxx +++ b/tree/ntuple/v7/test/ntuple_descriptor.cxx @@ -267,14 +267,14 @@ TEST(RNTupleDescriptor, QualifiedFieldName) } auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto desc = ntuple->GetDescriptor(); - EXPECT_TRUE(desc->GetQualifiedFieldName(desc->GetFieldZeroId()).empty()); - auto fldIdInts = desc->FindFieldId("ints"); - EXPECT_STREQ("ints", desc->GetQualifiedFieldName(fldIdInts).c_str()); - auto fldIdJets = desc->FindFieldId("jets"); - auto fldIdInner = desc->FindFieldId("_0", fldIdJets); - EXPECT_STREQ("jets", desc->GetQualifiedFieldName(fldIdJets).c_str()); - EXPECT_STREQ("jets._0", desc->GetQualifiedFieldName(fldIdInner).c_str()); + const auto &desc = ntuple->GetDescriptor(); + EXPECT_TRUE(desc.GetQualifiedFieldName(desc.GetFieldZeroId()).empty()); + auto fldIdInts = desc.FindFieldId("ints"); + EXPECT_STREQ("ints", desc.GetQualifiedFieldName(fldIdInts).c_str()); + auto fldIdJets = desc.FindFieldId("jets"); + auto fldIdInner = desc.FindFieldId("_0", fldIdJets); + EXPECT_STREQ("jets", desc.GetQualifiedFieldName(fldIdJets).c_str()); + EXPECT_STREQ("jets._0", desc.GetQualifiedFieldName(fldIdInner).c_str()); } TEST(RFieldDescriptorIterable, IterateOverFieldNames) @@ -295,7 +295,7 @@ TEST(RFieldDescriptorIterable, IterateOverFieldNames) auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); // iterate over top-level fields std::vector names{}; - for (auto &f : ntuple->GetDescriptor()->GetTopLevelFields()) { + for (auto &f : ntuple->GetDescriptor().GetTopLevelFields()) { names.push_back(f.GetFieldName()); } ASSERT_EQ(names.size(), 4); @@ -304,18 +304,18 @@ TEST(RFieldDescriptorIterable, IterateOverFieldNames) EXPECT_EQ(names[2], std::string("bool_vec_vec")); EXPECT_EQ(names[3], std::string("ints")); - const auto ntuple_desc = ntuple->GetDescriptor(); - auto top_level_fields = ntuple_desc->GetTopLevelFields(); + const auto &ntuple_desc = ntuple->GetDescriptor(); + auto top_level_fields = ntuple_desc.GetTopLevelFields(); // iterate over child field ranges const auto& float_vec_desc = *top_level_fields.begin(); EXPECT_EQ(float_vec_desc.GetFieldName(), std::string("jets")); - auto float_vec_child_range = ntuple_desc->GetFieldIterable(float_vec_desc); + auto float_vec_child_range = ntuple_desc.GetFieldIterable(float_vec_desc); std::vector child_names{}; for (auto& child_field: float_vec_child_range) { child_names.push_back(child_field.GetFieldName()); // check the empty range - auto float_child_range = ntuple_desc->GetFieldIterable(child_field); + auto float_child_range = ntuple_desc.GetFieldIterable(child_field); EXPECT_EQ(float_child_range.begin(), float_child_range.end()); } ASSERT_EQ(child_names.size(), 1); @@ -328,7 +328,7 @@ TEST(RFieldDescriptorIterable, IterateOverFieldNames) EXPECT_EQ(bool_vec_vec_desc.GetFieldName(), std::string("bool_vec_vec")); child_names.clear(); - for (auto &child_field : ntuple_desc->GetFieldIterable(bool_vec_vec_desc)) { + for (auto &child_field : ntuple_desc.GetFieldIterable(bool_vec_vec_desc)) { child_names.push_back(child_field.GetFieldName()); } ASSERT_EQ(child_names.size(), 1); @@ -351,13 +351,13 @@ TEST(RFieldDescriptorIterable, SortByLambda) } auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto ntuple_desc = ntuple->GetDescriptor(); + const auto &ntuple_desc = ntuple->GetDescriptor(); auto alpha_order = [&](auto lhs, auto rhs) { - return ntuple_desc->GetFieldDescriptor(lhs).GetFieldName() < ntuple_desc->GetFieldDescriptor(rhs).GetFieldName(); + return ntuple_desc.GetFieldDescriptor(lhs).GetFieldName() < ntuple_desc.GetFieldDescriptor(rhs).GetFieldName(); }; std::vector sorted_names = {}; - for (auto &f : ntuple_desc->GetTopLevelFields(alpha_order)) { + for (auto &f : ntuple_desc.GetTopLevelFields(alpha_order)) { sorted_names.push_back(f.GetFieldName()); } ASSERT_EQ(sorted_names.size(), 4); @@ -368,7 +368,7 @@ TEST(RFieldDescriptorIterable, SortByLambda) // reverse alphabetical sorted_names.clear(); - for (auto &f : ntuple_desc->GetTopLevelFields([&](auto lhs, auto rhs) { return !alpha_order(lhs, rhs); })) { + for (auto &f : ntuple_desc.GetTopLevelFields([&](auto lhs, auto rhs) { return !alpha_order(lhs, rhs); })) { sorted_names.push_back(f.GetFieldName()); } ASSERT_EQ(sorted_names.size(), 4); @@ -379,9 +379,8 @@ TEST(RFieldDescriptorIterable, SortByLambda) // alphabetical by type name std::vector sorted_by_typename = {}; - for (auto &f : ntuple_desc->GetTopLevelFields([&](auto lhs, auto rhs) { - return ntuple_desc->GetFieldDescriptor(lhs).GetTypeName() < - ntuple_desc->GetFieldDescriptor(rhs).GetTypeName(); + for (auto &f : ntuple_desc.GetTopLevelFields([&](auto lhs, auto rhs) { + return ntuple_desc.GetFieldDescriptor(lhs).GetTypeName() < ntuple_desc.GetFieldDescriptor(rhs).GetTypeName(); })) { sorted_by_typename.push_back(f.GetFieldName()); } @@ -408,37 +407,37 @@ TEST(RColumnDescriptorIterable, IterateOverColumns) } auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto desc = ntuple->GetDescriptor(); + const auto &desc = ntuple->GetDescriptor(); // No column attached to the zero field unsigned int counter = 0; - for (const auto &c : desc->GetColumnIterable(desc->GetFieldZeroId())) { + for (const auto &c : desc.GetColumnIterable(desc.GetFieldZeroId())) { (void)c; counter++; } EXPECT_EQ(0u, counter); - const auto tagId = desc->FindFieldId("tag"); - for (const auto &c : desc->GetColumnIterable(tagId)) { + const auto tagId = desc.FindFieldId("tag"); + for (const auto &c : desc.GetColumnIterable(tagId)) { EXPECT_EQ(tagId, c.GetFieldId()); EXPECT_EQ(counter, c.GetIndex()); counter++; } EXPECT_EQ(2, counter); - const auto jetsId = desc->FindFieldId("jets"); - for (const auto &c : desc->GetColumnIterable(desc->FindFieldId("jets"))) { + const auto jetsId = desc.FindFieldId("jets"); + for (const auto &c : desc.GetColumnIterable(desc.FindFieldId("jets"))) { EXPECT_EQ(jetsId, c.GetFieldId()); counter++; } EXPECT_EQ(3, counter); counter = 0; - for (const auto &c : desc->GetColumnIterable()) { + for (const auto &c : desc.GetColumnIterable()) { (void)c; counter++; } - EXPECT_EQ(desc->GetNLogicalColumns(), counter); + EXPECT_EQ(desc.GetNLogicalColumns(), counter); } TEST(RClusterDescriptor, GetBytesOnStorage) @@ -460,11 +459,11 @@ TEST(RClusterDescriptor, GetBytesOnStorage) } auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto desc = ntuple->GetDescriptor(); + const auto &desc = ntuple->GetDescriptor(); - auto clusterID = desc->FindClusterId(0, 0); + auto clusterID = desc.FindClusterId(0, 0); ASSERT_NE(ROOT::Experimental::kInvalidDescriptorId, clusterID); - EXPECT_EQ(8 + 8 + 8 + 3, desc->GetClusterDescriptor(clusterID).GetBytesOnStorage()); + EXPECT_EQ(8 + 8 + 8 + 3, desc.GetClusterDescriptor(clusterID).GetBytesOnStorage()); } TEST(RNTupleDescriptor, Clone) @@ -483,7 +482,7 @@ TEST(RNTupleDescriptor, Clone) } auto ntuple = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto desc = ntuple->GetDescriptor(); - auto clone = desc->Clone(); - EXPECT_EQ(*desc, *clone); + const auto &desc = ntuple->GetDescriptor(); + auto clone = desc.Clone(); + EXPECT_EQ(desc, *clone); } diff --git a/tree/ntuple/v7/test/ntuple_extended.cxx b/tree/ntuple/v7/test/ntuple_extended.cxx index 55e4562264035..96b41a7519410 100644 --- a/tree/ntuple/v7/test/ntuple_extended.cxx +++ b/tree/ntuple/v7/test/ntuple_extended.cxx @@ -98,7 +98,7 @@ TEST(RNTuple, RandomAccess) RNTupleReadOptions options; options.SetClusterCache(RNTupleReadOptions::EClusterCache::kOn); auto ntuple = RNTupleReader::Open("myNTuple", fileGuard.GetPath(), options); - EXPECT_EQ(10, ntuple->GetDescriptor()->GetNClusters()); + EXPECT_EQ(10, ntuple->GetDescriptor().GetNClusters()); auto viewValue = ntuple->GetView("value"); @@ -235,7 +235,7 @@ TEST(RNTuple, LargeFile2) { auto reader = RNTupleReader::Open("small", fileGuard.GetPath()); reader->LoadEntry(0); - EXPECT_EQ(42.0f, *reader->GetModel()->GetDefaultEntry()->GetPtr("pt")); + EXPECT_EQ(42.0f, *reader->GetModel().GetDefaultEntry().GetPtr("pt")); reader = RNTupleReader::Open("large", fileGuard.GetPath()); auto viewE = reader->GetView("E"); @@ -256,7 +256,7 @@ TEST(RNTuple, LargeFile2) auto reader = RNTupleReader::Open(f->Get("small")); reader->LoadEntry(0); - EXPECT_EQ(42.0f, *reader->GetModel()->GetDefaultEntry()->GetPtr("pt")); + EXPECT_EQ(42.0f, *reader->GetModel().GetDefaultEntry().GetPtr("pt")); reader = RNTupleReader::Open(f->Get("large")); auto viewE = reader->GetView("E"); diff --git a/tree/ntuple/v7/test/ntuple_friends.cxx b/tree/ntuple/v7/test/ntuple_friends.cxx index ce4cbc9c91574..fc1454a47a73e 100644 --- a/tree/ntuple/v7/test/ntuple_friends.cxx +++ b/tree/ntuple/v7/test/ntuple_friends.cxx @@ -26,13 +26,13 @@ TEST(RPageStorageFriends, Empty) std::span ntuples; auto reader = RNTupleReader::OpenFriends(ntuples); EXPECT_EQ(0u, reader->GetNEntries()); - EXPECT_EQ(0u, reader->GetModel()->GetFieldZero().GetOnDiskId()); - EXPECT_EQ(0u, std::distance(reader->GetModel()->GetDefaultEntry()->begin(), - reader->GetModel()->GetDefaultEntry()->end())); - EXPECT_EQ(0u, reader->GetDescriptor()->GetNLogicalColumns()); - EXPECT_EQ(0u, reader->GetDescriptor()->GetNPhysicalColumns()); - EXPECT_EQ(1u, reader->GetDescriptor()->GetNFields()); // The zero field - EXPECT_EQ(0u, reader->GetDescriptor()->GetNClusters()); + EXPECT_EQ(0u, reader->GetModel().GetFieldZero().GetOnDiskId()); + EXPECT_EQ(0u, + std::distance(reader->GetModel().GetDefaultEntry().begin(), reader->GetModel().GetDefaultEntry().end())); + EXPECT_EQ(0u, reader->GetDescriptor().GetNLogicalColumns()); + EXPECT_EQ(0u, reader->GetDescriptor().GetNPhysicalColumns()); + EXPECT_EQ(1u, reader->GetDescriptor().GetNFields()); // The zero field + EXPECT_EQ(0u, reader->GetDescriptor().GetNClusters()); } diff --git a/tree/ntuple/v7/test/ntuple_limits.cxx b/tree/ntuple/v7/test/ntuple_limits.cxx index bfbb53047a554..fd19592874526 100644 --- a/tree/ntuple/v7/test/ntuple_limits.cxx +++ b/tree/ntuple/v7/test/ntuple_limits.cxx @@ -33,16 +33,16 @@ TEST(RNTuple, DISABLED_Limits_ManyFields) } auto reader = RNTupleReader::Open("myNTuple", fileGuard.GetPath()); - auto descriptor = reader->GetDescriptor(); - auto model = reader->GetModel(); + const auto &descriptor = reader->GetDescriptor(); + const auto &model = reader->GetModel(); - EXPECT_EQ(descriptor->GetNFields(), 1 + NumFields); - EXPECT_EQ(model->GetFieldZero().GetSubFields().size(), NumFields); + EXPECT_EQ(descriptor.GetNFields(), 1 + NumFields); + EXPECT_EQ(model.GetFieldZero().GetSubFields().size(), NumFields); EXPECT_EQ(reader->GetNEntries(), 1); reader->LoadEntry(0); for (int i = 0; i < NumFields; i++) { - auto valuePtr = model->GetDefaultEntry()->GetPtr("f" + std::to_string(i)); + auto valuePtr = model.GetDefaultEntry().GetPtr("f" + std::to_string(i)); EXPECT_EQ(*valuePtr, i); } } @@ -68,14 +68,14 @@ TEST(RNTuple, DISABLED_Limits_ManyClusters) } auto reader = RNTupleReader::Open("myNTuple", fileGuard.GetPath()); - auto descriptor = reader->GetDescriptor(); - auto model = reader->GetModel(); + const auto &descriptor = reader->GetDescriptor(); + const auto &model = reader->GetModel(); EXPECT_EQ(reader->GetNEntries(), NumClusters); - EXPECT_EQ(descriptor->GetNClusters(), NumClusters); - EXPECT_EQ(descriptor->GetNActiveClusters(), NumClusters); + EXPECT_EQ(descriptor.GetNClusters(), NumClusters); + EXPECT_EQ(descriptor.GetNActiveClusters(), NumClusters); - auto id = model->GetDefaultEntry()->GetPtr("id"); + auto id = model.GetDefaultEntry().GetPtr("id"); for (int i = 0; i < NumClusters; i++) { reader->LoadEntry(i); EXPECT_EQ(*id, i); @@ -103,14 +103,14 @@ TEST(RNTuple, DISABLED_Limits_ManyClusterGroups) } auto reader = RNTupleReader::Open("myNTuple", fileGuard.GetPath()); - auto descriptor = reader->GetDescriptor(); - auto model = reader->GetModel(); + const auto &descriptor = reader->GetDescriptor(); + const auto &model = reader->GetModel(); EXPECT_EQ(reader->GetNEntries(), NumClusterGroups); - EXPECT_EQ(descriptor->GetNClusterGroups(), NumClusterGroups); - EXPECT_EQ(descriptor->GetNClusters(), NumClusterGroups); + EXPECT_EQ(descriptor.GetNClusterGroups(), NumClusterGroups); + EXPECT_EQ(descriptor.GetNClusters(), NumClusterGroups); - auto id = model->GetDefaultEntry()->GetPtr("id"); + auto id = model.GetDefaultEntry().GetPtr("id"); for (int i = 0; i < NumClusterGroups; i++) { reader->LoadEntry(i); EXPECT_EQ(*id, i); diff --git a/tree/ntuple/v7/test/ntuple_merger.cxx b/tree/ntuple/v7/test/ntuple_merger.cxx index 698f2a217d3db..c0ba057328ec8 100644 --- a/tree/ntuple/v7/test/ntuple_merger.cxx +++ b/tree/ntuple/v7/test/ntuple_merger.cxx @@ -141,13 +141,13 @@ TEST(RNTupleMerger, MergeSymmetric) auto ntuple3 = RNTupleReader::Open("ntuple", fileGuard3.GetPath()); ASSERT_EQ(ntuple1->GetNEntries() + ntuple2->GetNEntries(), ntuple3->GetNEntries()); - auto foo1 = ntuple1->GetModel()->GetDefaultEntry()->GetPtr("foo"); - auto foo2 = ntuple2->GetModel()->GetDefaultEntry()->GetPtr("foo"); - auto foo3 = ntuple3->GetModel()->GetDefaultEntry()->GetPtr("foo"); + auto foo1 = ntuple1->GetModel().GetDefaultEntry().GetPtr("foo"); + auto foo2 = ntuple2->GetModel().GetDefaultEntry().GetPtr("foo"); + auto foo3 = ntuple3->GetModel().GetDefaultEntry().GetPtr("foo"); - auto bar1 = ntuple1->GetModel()->GetDefaultEntry()->GetPtr("bar"); - auto bar2 = ntuple2->GetModel()->GetDefaultEntry()->GetPtr("bar"); - auto bar3 = ntuple3->GetModel()->GetDefaultEntry()->GetPtr("bar"); + auto bar1 = ntuple1->GetModel().GetDefaultEntry().GetPtr("bar"); + auto bar2 = ntuple2->GetModel().GetDefaultEntry().GetPtr("bar"); + auto bar3 = ntuple3->GetModel().GetDefaultEntry().GetPtr("bar"); ntuple1->LoadEntry(1); ntuple2->LoadEntry(1); @@ -394,13 +394,13 @@ TEST(RNTupleMerger, MergeVector) auto ntuple3 = RNTupleReader::Open("ntuple", fileGuard3.GetPath()); ASSERT_EQ(ntuple1->GetNEntries() + ntuple2->GetNEntries(), ntuple3->GetNEntries()); - auto foo1 = ntuple1->GetModel()->GetDefaultEntry()->GetPtr>("foo"); - auto foo2 = ntuple2->GetModel()->GetDefaultEntry()->GetPtr>("foo"); - auto foo3 = ntuple3->GetModel()->GetDefaultEntry()->GetPtr>("foo"); + auto foo1 = ntuple1->GetModel().GetDefaultEntry().GetPtr>("foo"); + auto foo2 = ntuple2->GetModel().GetDefaultEntry().GetPtr>("foo"); + auto foo3 = ntuple3->GetModel().GetDefaultEntry().GetPtr>("foo"); - auto bar1 = ntuple1->GetModel()->GetDefaultEntry()->GetPtr>("bar"); - auto bar2 = ntuple2->GetModel()->GetDefaultEntry()->GetPtr>("bar"); - auto bar3 = ntuple3->GetModel()->GetDefaultEntry()->GetPtr>("bar"); + auto bar1 = ntuple1->GetModel().GetDefaultEntry().GetPtr>("bar"); + auto bar2 = ntuple2->GetModel().GetDefaultEntry().GetPtr>("bar"); + auto bar3 = ntuple3->GetModel().GetDefaultEntry().GetPtr>("bar"); ntuple1->LoadEntry(1); ntuple2->LoadEntry(1); diff --git a/tree/ntuple/v7/test/ntuple_modelext.cxx b/tree/ntuple/v7/test/ntuple_modelext.cxx index 4b0cacb7e517e..d2217a803aa18 100644 --- a/tree/ntuple/v7/test/ntuple_modelext.cxx +++ b/tree/ntuple/v7/test/ntuple_modelext.cxx @@ -49,21 +49,20 @@ TEST(RNTuple, ModelExtensionSimple) auto modelUpdater = ntuple->CreateModelUpdater(); modelUpdater->BeginUpdate(); - std::array fieldArray = refArray; - modelUpdater->AddField>("array", &fieldArray); + auto fieldArray = modelUpdater->MakeField>("array", refArray); modelUpdater->CommitUpdate(); ntuple->Fill(); *fieldPt = 1.0; - fieldArray[1] = 1337.0; + fieldArray->at(1) = 1337.0; ntuple->Fill(); } auto ntuple = RNTupleReader::Open("myNTuple", fileGuard.GetPath()); EXPECT_EQ(4U, ntuple->GetNEntries()); - EXPECT_EQ(4U, ntuple->GetDescriptor()->GetNFields()); - EXPECT_EQ(0U, GetFirstEntry(ntuple->GetModel()->GetField("pt"))); - EXPECT_EQ(2U, GetFirstEntry(ntuple->GetModel()->GetField("array"))); + EXPECT_EQ(4U, ntuple->GetDescriptor().GetNFields()); + EXPECT_EQ(0U, GetFirstEntry(ntuple->GetModel().GetField("pt"))); + EXPECT_EQ(2U, GetFirstEntry(ntuple->GetModel().GetField("array"))); auto pt = ntuple->GetView("pt"); auto array = ntuple->GetView>("array"); @@ -91,8 +90,7 @@ TEST(RNTuple, ModelExtensionInvalidUse) auto modelUpdater = ntuple->CreateModelUpdater(); modelUpdater->BeginUpdate(); - double d; - modelUpdater->AddField("d", &d); + auto d = modelUpdater->MakeField("d"); // Cannot fill if the model is not frozen EXPECT_THROW(ntuple->Fill(), ROOT::Experimental::RException); // Trying to create an entry should throw if model is not frozen @@ -111,7 +109,7 @@ TEST(RNTuple, ModelExtensionInvalidUse) auto ntuple = RNTupleReader::Open("myNTuple", fileGuard.GetPath()); EXPECT_EQ(3U, ntuple->GetNEntries()); - EXPECT_EQ(3U, ntuple->GetDescriptor()->GetNFields()); + EXPECT_EQ(3U, ntuple->GetDescriptor().GetNFields()); } TEST(RNTuple, ModelExtensionMultiple) @@ -132,39 +130,36 @@ TEST(RNTuple, ModelExtensionMultiple) auto modelUpdater = ntuple->CreateModelUpdater(); modelUpdater->BeginUpdate(); - std::vector fieldVec{0x11223344}; - modelUpdater->AddField>("vec", &fieldVec); + auto fieldVec = modelUpdater->MakeField>("vec"); + fieldVec->emplace_back(0x11223344); modelUpdater->CommitUpdate(); modelUpdater->BeginUpdate(); - float fieldFloat = 10.0; - modelUpdater->AddField("f", &fieldFloat); + auto fieldFloat = modelUpdater->MakeField("f", 10); modelUpdater->CommitUpdate(); modelUpdater->BeginUpdate(); - std::uint8_t u8 = 0x7f; - std::string str{"default"}; - modelUpdater->AddField("u8", &u8); - modelUpdater->AddField("str", &str); + auto u8 = modelUpdater->MakeField("u8", 0x7f); + auto str = modelUpdater->MakeField("str", "default"); modelUpdater->CommitUpdate(); ntuple->Fill(); *fieldPt = 12.0; - fieldFloat = 1.0; - fieldVec = refVec; - u8 = 0xaa; - str = "abcdefABCDEF1234567890!@#$%^&*()"; + *fieldFloat = 1.0; + *fieldVec = refVec; + *u8 = 0xaa; + *str = "abcdefABCDEF1234567890!@#$%^&*()"; ntuple->Fill(); } auto ntuple = RNTupleReader::Open("myNTuple", fileGuard.GetPath()); EXPECT_EQ(5U, ntuple->GetNEntries()); - EXPECT_EQ(7U, ntuple->GetDescriptor()->GetNFields()); - EXPECT_EQ(0U, GetFirstEntry(ntuple->GetModel()->GetField("pt"))); - EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel()->GetField("vec"))); - EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel()->GetField("f"))); - EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel()->GetField("u8"))); - EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel()->GetField("str"))); + EXPECT_EQ(7U, ntuple->GetDescriptor().GetNFields()); + EXPECT_EQ(0U, GetFirstEntry(ntuple->GetModel().GetField("pt"))); + EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel().GetField("vec"))); + EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel().GetField("f"))); + EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel().GetField("u8"))); + EXPECT_EQ(3U, GetFirstEntry(ntuple->GetModel().GetField("str"))); auto pt = ntuple->GetView("pt"); auto vec = ntuple->GetView>("vec"); @@ -213,8 +208,7 @@ TEST(RNTuple, ModelExtensionProject) auto ntuple = RNTupleWriter::Recreate(std::move(model), "myNTuple", fileGuard.GetPath()); auto modelUpdater = ntuple->CreateModelUpdater(); modelUpdater->BeginUpdate(); - std::vector fieldVec; - modelUpdater->AddField>("vec", &fieldVec); + auto fieldVec = modelUpdater->MakeField>("vec"); modelUpdater->CommitUpdate(); modelUpdater->BeginUpdate(); @@ -229,13 +223,13 @@ TEST(RNTuple, ModelExtensionProject) ntuple->Fill(); *fieldPt = 12.0; - fieldVec = refVec; + *fieldVec = refVec; ntuple->Fill(); } auto ntuple = RNTupleReader::Open("myNTuple", fileGuard.GetPath()); EXPECT_EQ(2U, ntuple->GetNEntries()); - EXPECT_EQ(6U, ntuple->GetDescriptor()->GetNFields()); + EXPECT_EQ(6U, ntuple->GetDescriptor().GetNFields()); auto pt = ntuple->GetView("pt"); auto aliasVec = ntuple->GetView>("aliasVec"); @@ -266,22 +260,19 @@ TEST(RNTuple, ModelExtensionRealWorld1) auto modelUpdater = ntuple->CreateModelUpdater(); modelUpdater->BeginUpdate(); - std::vector fieldVec; - double wrEnergy; - std::vector wrIndices; - modelUpdater->AddField("energy", &wrEnergy); - modelUpdater->AddField>("indices", &wrIndices); + auto wrEnergy = modelUpdater->MakeField("energy"); + auto wrIndices = modelUpdater->MakeField>("indices"); modelUpdater->CommitUpdate(); constexpr unsigned int nEvents = 60000; for (unsigned int i = 0; i < nEvents; ++i) { *wrEvent = i; - wrEnergy = rnd.Rndm() * 1000.; + *wrEnergy = rnd.Rndm() * 1000.; *wrSignal = i % 2; chksumWrite += double(*wrEvent); chksumWrite += double(*wrSignal); - chksumWrite += wrEnergy; + chksumWrite += *wrEnergy; auto nTimes = 1 + floor(rnd.Rndm() * 1000.); wrTimes->resize(nTimes); @@ -291,10 +282,10 @@ TEST(RNTuple, ModelExtensionRealWorld1) } auto nIndices = 1 + floor(rnd.Rndm() * 1000.); - wrIndices.resize(nIndices); + wrIndices->resize(nIndices); for (unsigned int n = 0; n < nIndices; ++n) { - wrIndices.at(n) = 1 + floor(rnd.Rndm() * 1000.); - chksumWrite += double(wrIndices.at(n)); + wrIndices->at(n) = 1 + floor(rnd.Rndm() * 1000.); + chksumWrite += double(wrIndices->at(n)); } ntuple->Fill(); @@ -379,14 +370,12 @@ TEST(RNTuple, ModelExtensionComplex) ntuple->CommitCluster(true /* commitClusterGroup */); modelUpdater->BeginUpdate(); - std::vector dblVec; - doubleAoA_t doubleAoA; - modelUpdater->AddField>("dblVec", &dblVec); - modelUpdater->AddField("doubleAoA", &doubleAoA); + auto dblVec = modelUpdater->MakeField>("dblVec"); + auto doubleAoA = modelUpdater->MakeField("doubleAoA"); modelUpdater->CommitUpdate(); for (unsigned int i = 10000; i < 20000; ++i) { updateInitialFields(i, *u32, *dbl); - updateLateFields1(i, dblVec, doubleAoA); + updateLateFields1(i, *dblVec, *doubleAoA); ntuple->Fill(); } @@ -395,28 +384,25 @@ TEST(RNTuple, ModelExtensionComplex) ntuple->CommitCluster(); modelUpdater->BeginUpdate(); - std::variant var; - modelUpdater->AddField>("var", &var); + auto var = modelUpdater->MakeField>("var"); modelUpdater->CommitUpdate(); for (unsigned int i = 20000; i < 30000; ++i) { updateInitialFields(i, *u32, *dbl); - updateLateFields1(i, dblVec, doubleAoA); - updateLateFields2(i, var); + updateLateFields1(i, *dblVec, *doubleAoA); + updateLateFields2(i, *var); ntuple->Fill(); } modelUpdater->BeginUpdate(); - bool b = false; - EmptyStruct noColumns{}; - modelUpdater->AddField("b", &b); - modelUpdater->AddField("noColumns", &noColumns); + auto b = modelUpdater->MakeField("b", false); + auto noColumns = modelUpdater->MakeField("noColumns"); modelUpdater->CommitUpdate(); for (unsigned int i = 30000; i < 40000; ++i) { updateInitialFields(i, *u32, *dbl); - updateLateFields1(i, dblVec, doubleAoA); - updateLateFields2(i, var); - b = !b; - chksumWrite += static_cast(b); + updateLateFields1(i, *dblVec, *doubleAoA); + updateLateFields2(i, *var); + *b = !(*b); + chksumWrite += static_cast(*b); ntuple->Fill(); } } diff --git a/tree/ntuple/v7/test/ntuple_packing.cxx b/tree/ntuple/v7/test/ntuple_packing.cxx index a2ed68eacb92c..04773c08ff28f 100644 --- a/tree/ntuple/v7/test/ntuple_packing.cxx +++ b/tree/ntuple/v7/test/ntuple_packing.cxx @@ -328,7 +328,7 @@ TEST(Packing, OnDiskEncoding) EXPECT_EQ(memcmp(sealedPage.fBuffer, expIndex64, sizeof(expIndex64)), 0); auto reader = RNTupleReader(std::move(source)); - EXPECT_EQ(EColumnType::kIndex64, reader.GetModel()->GetField("str").GetColumnRepresentative()[0]); + EXPECT_EQ(EColumnType::kIndex64, reader.GetModel().GetField("str").GetColumnRepresentative()[0]); EXPECT_EQ(2u, reader.GetNEntries()); auto viewStr = reader.GetView("str"); EXPECT_EQ(std::string("abc"), viewStr(0)); diff --git a/tree/ntuple/v7/test/ntuple_show.cxx b/tree/ntuple/v7/test/ntuple_show.cxx index 4f929c0a83dd2..704d64dcce364 100644 --- a/tree/ntuple/v7/test/ntuple_show.cxx +++ b/tree/ntuple/v7/test/ntuple_show.cxx @@ -459,9 +459,9 @@ TEST(RNTupleShow, RVecTypeErased) ROOT::RVec customStructVec{CustomStruct(), {1.f, {2.f, 3.f}, {{4.f}, {5.f}}, "foo", std::byte{0}}}; m->Freeze(); - m->GetDefaultEntry()->BindRawPtr("intVec", &intVec); - m->GetDefaultEntry()->BindRawPtr("floatVecVec", &floatVecVec); - m->GetDefaultEntry()->BindRawPtr("customStructVec", &customStructVec); + m->GetDefaultEntry().BindRawPtr("intVec", &intVec); + m->GetDefaultEntry().BindRawPtr("floatVecVec", &floatVecVec); + m->GetDefaultEntry().BindRawPtr("customStructVec", &customStructVec); auto ntuple = RNTupleWriter::Recreate(std::move(m), ntupleName, rootFileName); diff --git a/tree/ntuple/v7/test/ntuple_storage.cxx b/tree/ntuple/v7/test/ntuple_storage.cxx index d22a708eea218..866b99ee59534 100644 --- a/tree/ntuple/v7/test/ntuple_storage.cxx +++ b/tree/ntuple/v7/test/ntuple_storage.cxx @@ -72,7 +72,7 @@ TEST(RNTuple, Basics) auto ntuple = RNTupleReader::Open("f", fileGuard.GetPath()); EXPECT_EQ(3U, ntuple->GetNEntries()); - auto rdPt = ntuple->GetModel()->GetDefaultEntry()->GetPtr("pt"); + auto rdPt = ntuple->GetModel().GetDefaultEntry().GetPtr("pt"); ntuple->LoadEntry(0); EXPECT_EQ(42.0, *rdPt); @@ -118,7 +118,7 @@ TEST(RNTuple, Extended) } auto ntuple = RNTupleReader::Open("f", fileGuard.GetPath()); - auto rdVector = ntuple->GetModel()->GetDefaultEntry()->GetPtr>("vector"); + auto rdVector = ntuple->GetModel().GetDefaultEntry().GetPtr>("vector"); double chksumRead = 0.0; for (auto entryId : *ntuple) { @@ -201,18 +201,18 @@ TEST(RNTuple, PageFilling) { for (std::int16_t i = 0; i < 8; ++i) EXPECT_EQ(i, viewX(i)); - const auto desc = ntuple->GetDescriptor(); - EXPECT_EQ(3u, desc->GetNClusters()); - const auto &cd1 = desc->GetClusterDescriptor(desc->FindClusterId(0, 0)); + const auto &desc = ntuple->GetDescriptor(); + EXPECT_EQ(3u, desc.GetNClusters()); + const auto &cd1 = desc.GetClusterDescriptor(desc.FindClusterId(0, 0)); const auto &pr1 = cd1.GetPageRange(0); ASSERT_EQ(2u, pr1.fPageInfos.size()); EXPECT_EQ(2u, pr1.fPageInfos[0].fNElements); EXPECT_EQ(1u, pr1.fPageInfos[1].fNElements); - const auto &cd2 = desc->GetClusterDescriptor(desc->FindNextClusterId(cd1.GetId())); + const auto &cd2 = desc.GetClusterDescriptor(desc.FindNextClusterId(cd1.GetId())); const auto &pr2 = cd2.GetPageRange(0); ASSERT_EQ(1u, pr2.fPageInfos.size()); EXPECT_EQ(2u, pr2.fPageInfos[0].fNElements); - const auto &cd3 = desc->GetClusterDescriptor(desc->FindNextClusterId(cd2.GetId())); + const auto &cd3 = desc.GetClusterDescriptor(desc.FindNextClusterId(cd2.GetId())); const auto &pr3 = cd3.GetPageRange(0); ASSERT_EQ(2u, pr3.fPageInfos.size()); EXPECT_EQ(2u, pr3.fPageInfos[0].fNElements); @@ -258,20 +258,20 @@ TEST(RNTuple, PageFillingString) { EXPECT_EQ("01234567890123456789012", viewX(3)); EXPECT_EQ("012", viewX(4)); - const auto desc = ntuple->GetDescriptor(); - EXPECT_EQ(4u, desc->GetNClusters()); - const auto &cd1 = desc->GetClusterDescriptor(desc->FindClusterId(1, 0)); + const auto &desc = ntuple->GetDescriptor(); + EXPECT_EQ(4u, desc.GetNClusters()); + const auto &cd1 = desc.GetClusterDescriptor(desc.FindClusterId(1, 0)); const auto &pr1 = cd1.GetPageRange(1); ASSERT_EQ(1u, pr1.fPageInfos.size()); EXPECT_EQ(17u, pr1.fPageInfos[0].fNElements); - const auto &cd2 = desc->GetClusterDescriptor(desc->FindNextClusterId(cd1.GetId())); + const auto &cd2 = desc.GetClusterDescriptor(desc.FindNextClusterId(cd1.GetId())); const auto &pr2 = cd2.GetPageRange(1); ASSERT_EQ(1u, pr2.fPageInfos.size()); EXPECT_EQ(16u, pr2.fPageInfos[0].fNElements); - const auto &cd3 = desc->GetClusterDescriptor(desc->FindNextClusterId(cd2.GetId())); + const auto &cd3 = desc.GetClusterDescriptor(desc.FindNextClusterId(cd2.GetId())); const auto &pr3 = cd3.GetPageRange(1); ASSERT_EQ(0u, pr3.fPageInfos.size()); - const auto &cd4 = desc->GetClusterDescriptor(desc->FindNextClusterId(cd3.GetId())); + const auto &cd4 = desc.GetClusterDescriptor(desc.FindNextClusterId(cd3.GetId())); const auto &pr4 = cd4.GetPageRange(1); ASSERT_EQ(2u, pr4.fPageInfos.size()); EXPECT_EQ(16u, pr4.fPageInfos[0].fNElements); @@ -350,7 +350,7 @@ TEST(RPageSinkBuf, Basics) std::vector> pagePositions; std::size_t num_columns = 10; - const auto &cluster0 = ntupleBuf->GetDescriptor()->GetClusterDescriptor(0); + const auto &cluster0 = ntupleBuf->GetDescriptor().GetClusterDescriptor(0); for (std::size_t i = 0; i < num_columns; i++) { const auto &columnPages = cluster0.GetPageRange(i); for (const auto &page: columnPages.fPageInfos) { @@ -490,8 +490,8 @@ TEST(RPageSink, Empty) auto ntuple = RNTupleReader::Open("f", fileGuard.GetPath()); EXPECT_EQ(0U, ntuple->GetNEntries()); - EXPECT_EQ(0U, ntuple->GetDescriptor()->GetNClusterGroups()); - EXPECT_EQ(0U, ntuple->GetDescriptor()->GetNClusters()); + EXPECT_EQ(0U, ntuple->GetDescriptor().GetNClusterGroups()); + EXPECT_EQ(0U, ntuple->GetDescriptor().GetNClusters()); } TEST(RPageSink, MultipleClusterGroups) @@ -515,10 +515,10 @@ TEST(RPageSink, MultipleClusterGroups) } auto ntuple = RNTupleReader::Open("f", fileGuard.GetPath()); - EXPECT_EQ(2U, ntuple->GetDescriptor()->GetNClusterGroups()); - EXPECT_EQ(3U, ntuple->GetDescriptor()->GetNClusters()); + EXPECT_EQ(2U, ntuple->GetDescriptor().GetNClusterGroups()); + EXPECT_EQ(3U, ntuple->GetDescriptor().GetNClusters()); EXPECT_EQ(3U, ntuple->GetNEntries()); - auto rdPt = ntuple->GetModel()->GetDefaultEntry()->GetPtr("pt"); + auto rdPt = ntuple->GetModel().GetDefaultEntry().GetPtr("pt"); ntuple->LoadEntry(0); EXPECT_EQ(42.0, *rdPt); diff --git a/tree/ntuple/v7/test/ntuple_storage_daos.cxx b/tree/ntuple/v7/test/ntuple_storage_daos.cxx index 355250b847809..c3c1ddb7a0294 100644 --- a/tree/ntuple/v7/test/ntuple_storage_daos.cxx +++ b/tree/ntuple/v7/test/ntuple_storage_daos.cxx @@ -66,7 +66,7 @@ TEST_F(RPageStorageDaos, Basics) auto ntuple = RNTupleReader::Open(ntupleName, daosUri); EXPECT_EQ(3U, ntuple->GetNEntries()); - auto rdPt = ntuple->GetModel()->GetDefaultEntry()->GetPtr("pt"); + auto rdPt = ntuple->GetModel().GetDefaultEntry().GetPtr("pt"); ntuple->LoadEntry(0); EXPECT_EQ(42.0, *rdPt); @@ -114,7 +114,7 @@ TEST_F(RPageStorageDaos, Extended) RNTupleReadOptions options; options.SetClusterBunchSize(5); auto ntuple = RNTupleReader::Open(ntupleName, daosUri, options); - auto rdVector = ntuple->GetModel()->GetDefaultEntry()->GetPtr>("vector"); + auto rdVector = ntuple->GetModel().GetDefaultEntry().GetPtr>("vector"); double chksumRead = 0.0; for (auto entryId : *ntuple) { @@ -196,14 +196,14 @@ TEST_F(RPageStorageDaos, MultipleNTuplesPerContainer) EXPECT_EQ(3U, ntuple2->GetNEntries()); { - auto rdPt = ntuple1->GetModel()->GetDefaultEntry()->GetPtr("pt"); + auto rdPt = ntuple1->GetModel().GetDefaultEntry().GetPtr("pt"); ntuple1->LoadEntry(0); EXPECT_EQ(34.0, *rdPt); ntuple1->LoadEntry(1); EXPECT_EQ(160.0, *rdPt); } { - auto rdPt = ntuple2->GetModel()->GetDefaultEntry()->GetPtr("pt"); + auto rdPt = ntuple2->GetModel().GetDefaultEntry().GetPtr("pt"); ntuple2->LoadEntry(0); EXPECT_EQ(81.0, *rdPt); ntuple2->LoadEntry(1); @@ -255,7 +255,7 @@ TEST_F(RPageStorageDaos, CagedPages) options.SetClusterCache(RNTupleReadOptions::EClusterCache::kOn); options.SetClusterBunchSize(5); auto ntuple = RNTupleReader::Open(ntupleName, daosUri, options); - auto rdVector = ntuple->GetModel()->GetDefaultEntry()->GetPtr>("vector"); + auto rdVector = ntuple->GetModel().GetDefaultEntry().GetPtr>("vector"); double chksumRead = 0.0; for (auto entryId : *ntuple) { diff --git a/tree/ntuple/v7/test/ntuple_types.cxx b/tree/ntuple/v7/test/ntuple_types.cxx index caa4e49a1522e..1caf4a70eb485 100644 --- a/tree/ntuple/v7/test/ntuple_types.cxx +++ b/tree/ntuple/v7/test/ntuple_types.cxx @@ -56,14 +56,14 @@ TEST(RNTuple, EnumBasics) auto reader = RNTupleReader::Open("ntpl", fileGuard.GetPath()); EXPECT_EQ(1, reader->GetNEntries()); reader->LoadEntry(0); - EXPECT_EQ(kCustomEnumVal, *reader->GetModel()->GetDefaultEntry()->GetPtr("e")); - auto ptrStructWithEnums = reader->GetModel()->GetDefaultEntry()->GetPtr("swe"); + EXPECT_EQ(kCustomEnumVal, *reader->GetModel().GetDefaultEntry().GetPtr("e")); + auto ptrStructWithEnums = reader->GetModel().GetDefaultEntry().GetPtr("swe"); EXPECT_EQ(42, ptrStructWithEnums->a); EXPECT_EQ(137, ptrStructWithEnums->b); EXPECT_EQ(kCustomEnumVal, ptrStructWithEnums->e); - EXPECT_EQ(2u, reader->GetModel()->GetDefaultEntry()->GetPtr>("ve")->size()); - EXPECT_EQ(kCustomEnumVal, reader->GetModel()->GetDefaultEntry()->GetPtr>("ve")->at(0)); - EXPECT_EQ(kCustomEnumVal, reader->GetModel()->GetDefaultEntry()->GetPtr>("ve")->at(1)); + EXPECT_EQ(2u, reader->GetModel().GetDefaultEntry().GetPtr>("ve")->size()); + EXPECT_EQ(kCustomEnumVal, reader->GetModel().GetDefaultEntry().GetPtr>("ve")->at(0)); + EXPECT_EQ(kCustomEnumVal, reader->GetModel().GetDefaultEntry().GetPtr>("ve")->at(1)); } using EnumClassInts = ::testing::TypesGetModel()->GetDefaultEntry()->GetPtr("e"); + auto ptrEnum = reader->GetModel().GetDefaultEntry().GetPtr("e"); reader->LoadEntry(0); EXPECT_EQ(static_cast(0), *ptrEnum); reader->LoadEntry(1); @@ -167,8 +167,8 @@ TEST(RNTuple, ArrayField) model->AddField(RFieldBase::Create("array2", "unsigned char[4]").Unwrap()); auto ntuple = RNTupleWriter::Recreate(std::move(model), "ntuple", fileGuard.GetPath()); - auto array1_field = ntuple->GetModel().GetDefaultEntry()->GetPtr("array1"); - auto array2_field = ntuple->GetModel().GetDefaultEntry()->GetPtr("array2"); + auto array1_field = ntuple->GetModel().GetDefaultEntry().GetPtr("array1"); + auto array2_field = ntuple->GetModel().GetDefaultEntry().GetPtr("array2"); for (int i = 0; i < 2; i++) { new (struct_field.get()) StructWithArrays({{'n', 't', 'p', 'l'}, {1.0, 42.0}, {{2*i}, {2*i + 1}}}); new (array1_field.get()) float[2]{0.0f, static_cast(i)}; @@ -208,8 +208,8 @@ TEST(RNTuple, NDimArrayField) model->AddField(RFieldBase::Create("dim3", "int[1][2][3]").Unwrap()); auto ntuple = RNTupleWriter::Recreate(std::move(model), "ntuple", fileGuard.GetPath()); - auto dim2_field = ntuple->GetModel().GetDefaultEntry()->GetPtr("dim2"); - auto dim3_field = ntuple->GetModel().GetDefaultEntry()->GetPtr("dim3"); + auto dim2_field = ntuple->GetModel().GetDefaultEntry().GetPtr("dim2"); + auto dim3_field = ntuple->GetModel().GetDefaultEntry().GetPtr("dim3"); (dim2_field.get())[0][0] = 0; (dim2_field.get())[0][1] = 1; (dim2_field.get())[0][2] = 2; @@ -270,7 +270,7 @@ TEST(RNTuple, StdPair) model->AddField(std::move(myPair2)); auto ntuple = RNTupleWriter::Recreate(std::move(model), "pair_ntuple", fileGuard.GetPath()); - auto pair_field2 = ntuple->GetModel().GetDefaultEntry()->GetPtr>("myPair2"); + auto pair_field2 = ntuple->GetModel().GetDefaultEntry().GetPtr>("myPair2"); for (int i = 0; i < 2; i++) { *pair_field = {static_cast(i), std::to_string(i)}; *pair_field2 = {static_cast(i + 1), std::to_string(i + 1)}; @@ -320,9 +320,9 @@ TEST(RNTuple, StdTuple) auto ntuple = RNTupleWriter::Recreate(std::move(model), "tuple_ntuple", fileGuard.GetPath()); auto tuple_field2 = - ntuple->GetModel().GetDefaultEntry()->GetPtr>("myTuple2"); + ntuple->GetModel().GetDefaultEntry().GetPtr>("myTuple2"); auto tuple_field3 = - ntuple->GetModel().GetDefaultEntry()->GetPtr>>("myTuple3"); + ntuple->GetModel().GetDefaultEntry().GetPtr>>("myTuple3"); for (int i = 0; i < 2; i++) { *tuple_field = {'A' + i, static_cast(i), std::to_string(i), '0' + i}; *tuple_field2 = {'B' + i, static_cast(i), std::to_string(i), '1' + i}; @@ -384,8 +384,8 @@ TEST(RNTuple, StdSet) model->AddField(std::move(mySet4)); auto ntuple = RNTupleWriter::Recreate(std::move(model), "set_ntuple", fileGuard.GetPath()); - auto set_field3 = ntuple->GetModel().GetDefaultEntry()->GetPtr>("mySet3"); - auto set_field4 = ntuple->GetModel().GetDefaultEntry()->GetPtr>>("mySet4"); + auto set_field3 = ntuple->GetModel().GetDefaultEntry().GetPtr>("mySet3"); + auto set_field4 = ntuple->GetModel().GetDefaultEntry().GetPtr>>("mySet4"); for (int i = 0; i < 2; i++) { *set_field = {static_cast(i), 3.14, 0.42}; *set_field2 = { @@ -417,7 +417,7 @@ TEST(RNTuple, StdSet) } ntuple->LoadEntry(0); - auto mySet2 = ntuple->GetModel()->GetDefaultEntry()->GetPtr>>("mySet2"); + auto mySet2 = ntuple->GetModel().GetDefaultEntry().GetPtr>>("mySet2"); auto tupleSet = std::set>( {std::make_tuple(0, 'A', CustomStruct{6.f, {7.f, 8.f}, {{9.f}, {10.f}}, "foo"}), std::make_tuple(1, 'a', CustomStruct{2.f, {3.f, 4.f}, {{5.f}, {6.f}}, "bar"})}); @@ -450,8 +450,8 @@ TEST(RNTuple, StdUnorderedSet) model->AddField(std::move(mySet4)); auto ntuple = RNTupleWriter::Recreate(std::move(model), "set_ntuple", fileGuard.GetPath()); - auto set_field3 = ntuple->GetModel().GetDefaultEntry()->GetPtr>("mySet3"); - auto set_field4 = ntuple->GetModel().GetDefaultEntry()->GetPtr>>("mySet4"); + auto set_field3 = ntuple->GetModel().GetDefaultEntry().GetPtr>("mySet3"); + auto set_field4 = ntuple->GetModel().GetDefaultEntry().GetPtr>>("mySet4"); for (int i = 0; i < 2; i++) { *set_field = {static_cast(i), 3.14, 0.42}; *set_field2 = {CustomStruct{6.f, {7.f, 8.f}, {{9.f}, {10.f}}, "foo"}, @@ -481,7 +481,7 @@ TEST(RNTuple, StdUnorderedSet) } ntuple->LoadEntry(0); - auto mySet2 = ntuple->GetModel()->GetDefaultEntry()->GetPtr>("mySet2"); + auto mySet2 = ntuple->GetModel().GetDefaultEntry().GetPtr>("mySet2"); auto pairSet = std::unordered_set( {CustomStruct{6.f, {7.f, 8.f}, {{9.f}, {10.f}}, "foo"}, CustomStruct{2.f, {3.f, 4.f}, {{5.f}, {6.f}}, "bar"}}); EXPECT_EQ(pairSet, *mySet2); @@ -527,9 +527,9 @@ TEST(RNTuple, StdMap) model->AddField(std::move(myMap4)); auto ntuple = RNTupleWriter::Recreate(std::move(model), "map_ntuple", fileGuard.GetPath()); - auto map_field3 = ntuple->GetModel().GetDefaultEntry()->GetPtr>("myMap3"); + auto map_field3 = ntuple->GetModel().GetDefaultEntry().GetPtr>("myMap3"); auto map_field4 = - ntuple->GetModel().GetDefaultEntry()->GetPtr>>("myMap4"); + ntuple->GetModel().GetDefaultEntry().GetPtr>>("myMap4"); for (int i = 0; i < 2; i++) { *map_field = {{"foo", static_cast(i + 0.1)}, {"bar", static_cast(i * 0.2)}, @@ -576,7 +576,7 @@ TEST(RNTuple, StdMap) } ntuple->LoadEntry(0); - auto myMap2 = ntuple->GetModel()->GetDefaultEntry()->GetPtr>>("myMap2"); + auto myMap2 = ntuple->GetModel().GetDefaultEntry().GetPtr>>("myMap2"); auto vecMap = std::map>( {{0, {CustomStruct{6.f, {7.f, 8.f}, {{9.f}, {10.f}}, "foo"}, CustomStruct{2.f, {3.f, 4.f}, {{5.f}, {6.f}}, "bar"}}}, @@ -617,9 +617,9 @@ TEST(RNTuple, StdUnorderedMap) model->AddField(std::move(myMap4)); auto ntuple = RNTupleWriter::Recreate(std::move(model), "map_ntuple", fileGuard.GetPath()); - auto map_field3 = ntuple->GetModel().GetDefaultEntry()->GetPtr>("myMap3"); + auto map_field3 = ntuple->GetModel().GetDefaultEntry().GetPtr>("myMap3"); auto map_field4 = - ntuple->GetModel().GetDefaultEntry()->GetPtr>>("myMap4"); + ntuple->GetModel().GetDefaultEntry().GetPtr>>("myMap4"); for (int i = 0; i < 2; i++) { *map_field = {{"foo", static_cast(i + 0.1)}, {"bar", static_cast(i * 0.2)}, @@ -659,7 +659,7 @@ TEST(RNTuple, StdUnorderedMap) } ntuple->LoadEntry(0); - auto myMap2 = ntuple->GetModel()->GetDefaultEntry()->GetPtr>("myMap2"); + auto myMap2 = ntuple->GetModel().GetDefaultEntry().GetPtr>("myMap2"); auto customStructMap = std::unordered_map({{0, CustomStruct{6.f, {7.f, 8.f}, {{9.f}, {10.f}}, "foo"}}, {1, CustomStruct{3.f, {4.f, 5.f}, {{1.f}, {2.f}}, "baz"}}}); @@ -702,24 +702,24 @@ TEST(RNTuple, Int64) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto *desc = reader->GetDescriptor(); + const auto &desc = reader->GetDescriptor(); EXPECT_EQ(ROOT::Experimental::EColumnType::kInt64, - (*desc->GetColumnIterable(desc->FindFieldId("i1")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i1")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitInt64, - (*desc->GetColumnIterable(desc->FindFieldId("i2")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i2")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kUInt64, - (*desc->GetColumnIterable(desc->FindFieldId("i3")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i3")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitUInt64, - (*desc->GetColumnIterable(desc->FindFieldId("i4")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i4")).begin()).GetModel().GetType()); reader->LoadEntry(0); EXPECT_EQ(std::numeric_limits::max() - 137, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i1")); + *reader->GetModel().GetDefaultEntry().GetPtr("i1")); EXPECT_EQ(std::numeric_limits::max() - 138, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i2")); + *reader->GetModel().GetDefaultEntry().GetPtr("i2")); EXPECT_EQ(std::numeric_limits::max() - 42, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i3")); + *reader->GetModel().GetDefaultEntry().GetPtr("i3")); EXPECT_EQ(std::numeric_limits::max() - 43, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i4")); + *reader->GetModel().GetDefaultEntry().GetPtr("i4")); } TEST(RNTuple, Int32) @@ -758,24 +758,24 @@ TEST(RNTuple, Int32) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto *desc = reader->GetDescriptor(); + const auto &desc = reader->GetDescriptor(); EXPECT_EQ(ROOT::Experimental::EColumnType::kInt32, - (*desc->GetColumnIterable(desc->FindFieldId("i1")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i1")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitInt32, - (*desc->GetColumnIterable(desc->FindFieldId("i2")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i2")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kUInt32, - (*desc->GetColumnIterable(desc->FindFieldId("i3")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i3")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitUInt32, - (*desc->GetColumnIterable(desc->FindFieldId("i4")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i4")).begin()).GetModel().GetType()); reader->LoadEntry(0); EXPECT_EQ(std::numeric_limits::max() - 137, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i1")); + *reader->GetModel().GetDefaultEntry().GetPtr("i1")); EXPECT_EQ(std::numeric_limits::max() - 138, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i2")); + *reader->GetModel().GetDefaultEntry().GetPtr("i2")); EXPECT_EQ(std::numeric_limits::max() - 42, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i3")); + *reader->GetModel().GetDefaultEntry().GetPtr("i3")); EXPECT_EQ(std::numeric_limits::max() - 43, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i4")); + *reader->GetModel().GetDefaultEntry().GetPtr("i4")); } TEST(RNTuple, Int16) @@ -816,24 +816,24 @@ TEST(RNTuple, Int16) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto *desc = reader->GetDescriptor(); + const auto &desc = reader->GetDescriptor(); EXPECT_EQ(ROOT::Experimental::EColumnType::kInt16, - (*desc->GetColumnIterable(desc->FindFieldId("i1")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i1")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitInt16, - (*desc->GetColumnIterable(desc->FindFieldId("i2")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i2")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kUInt16, - (*desc->GetColumnIterable(desc->FindFieldId("i3")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i3")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitUInt16, - (*desc->GetColumnIterable(desc->FindFieldId("i4")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("i4")).begin()).GetModel().GetType()); reader->LoadEntry(0); EXPECT_EQ(std::numeric_limits::max() - 137, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i1")); + *reader->GetModel().GetDefaultEntry().GetPtr("i1")); EXPECT_EQ(std::numeric_limits::max() - 138, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i2")); + *reader->GetModel().GetDefaultEntry().GetPtr("i2")); EXPECT_EQ(std::numeric_limits::max() - 42, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i3")); + *reader->GetModel().GetDefaultEntry().GetPtr("i3")); EXPECT_EQ(std::numeric_limits::max() - 43, - *reader->GetModel()->GetDefaultEntry()->GetPtr("i4")); + *reader->GetModel().GetDefaultEntry().GetPtr("i4")); } TEST(RNTuple, Char) @@ -864,7 +864,7 @@ TEST(RNTuple, Byte) auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); EXPECT_EQ(1u, reader->GetNEntries()); reader->LoadEntry(0); - EXPECT_EQ(std::byte{137}, *reader->GetModel()->GetDefaultEntry()->GetPtr("b")); + EXPECT_EQ(std::byte{137}, *reader->GetModel().GetDefaultEntry().GetPtr("b")); } TEST(RNTuple, Int8_t) @@ -896,14 +896,14 @@ TEST(RNTuple, Double) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto *desc = reader->GetDescriptor(); + const auto &desc = reader->GetDescriptor(); EXPECT_EQ(ROOT::Experimental::EColumnType::kReal64, - (*desc->GetColumnIterable(desc->FindFieldId("d1")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("d1")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitReal64, - (*desc->GetColumnIterable(desc->FindFieldId("d2")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("d2")).begin()).GetModel().GetType()); reader->LoadEntry(0); - EXPECT_DOUBLE_EQ(1.0, *reader->GetModel()->GetDefaultEntry()->GetPtr("d1")); - EXPECT_DOUBLE_EQ(2.0, *reader->GetModel()->GetDefaultEntry()->GetPtr("d2")); + EXPECT_DOUBLE_EQ(1.0, *reader->GetModel().GetDefaultEntry().GetPtr("d1")); + EXPECT_DOUBLE_EQ(2.0, *reader->GetModel().GetDefaultEntry().GetPtr("d2")); } TEST(RNTuple, Float) @@ -929,14 +929,14 @@ TEST(RNTuple, Float) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - const auto *desc = reader->GetDescriptor(); + const auto &desc = reader->GetDescriptor(); EXPECT_EQ(ROOT::Experimental::EColumnType::kReal32, - (*desc->GetColumnIterable(desc->FindFieldId("f1")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("f1")).begin()).GetModel().GetType()); EXPECT_EQ(ROOT::Experimental::EColumnType::kSplitReal32, - (*desc->GetColumnIterable(desc->FindFieldId("f2")).begin()).GetModel().GetType()); + (*desc.GetColumnIterable(desc.FindFieldId("f2")).begin()).GetModel().GetType()); reader->LoadEntry(0); - EXPECT_FLOAT_EQ(1.0, *reader->GetModel()->GetDefaultEntry()->GetPtr("f1")); - EXPECT_FLOAT_EQ(2.0, *reader->GetModel()->GetDefaultEntry()->GetPtr("f2")); + EXPECT_FLOAT_EQ(1.0, *reader->GetModel().GetDefaultEntry().GetPtr("f1")); + EXPECT_FLOAT_EQ(2.0, *reader->GetModel().GetDefaultEntry().GetPtr("f2")); } TEST(RNTuple, StdAtomic) @@ -955,7 +955,7 @@ TEST(RNTuple, StdAtomic) model->AddField(RFieldBase::Create("f2", "std::atomic").Unwrap()); auto writer = RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath()); - auto f2 = writer->GetModel().GetDefaultEntry()->GetPtr>("f2"); + auto f2 = writer->GetModel().GetDefaultEntry().GetPtr>("f2"); for (int i = 0; i < 2; i++) { *f1 = i % 2 == 0; *f2 = static_cast(i); @@ -997,9 +997,9 @@ TEST(RNTuple, Bitset) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - EXPECT_EQ(std::string("std::bitset<66>"), reader->GetModel()->GetField("f1").GetType()); - auto bs1 = reader->GetModel()->GetDefaultEntry()->GetPtr>("f1"); - auto bs2 = reader->GetModel()->GetDefaultEntry()->GetPtr>("f2"); + EXPECT_EQ(std::string("std::bitset<66>"), reader->GetModel().GetField("f1").GetType()); + auto bs1 = reader->GetModel().GetDefaultEntry().GetPtr>("f1"); + auto bs2 = reader->GetModel().GetDefaultEntry().GetPtr>("f2"); reader->LoadEntry(0); EXPECT_EQ("000000000000000000000000000000000000000000000000000000000000000000", bs1->to_string()); EXPECT_EQ("10101010", bs2->to_string()); @@ -1077,11 +1077,13 @@ TYPED_TEST(UniquePtr, Basics) EXPECT_TRUE(dynamic_cast(writer->GetModel().GetField("PArray")).IsDense()); } - auto pBool = writer->GetModel().Get>("PBool"); - auto pCustomStruct = writer->GetModel().Get>("PCustomStruct"); - auto pIOConstructor = writer->GetModel().Get>("PIOConstructor"); - auto ppString = writer->GetModel().Get>>("PPString"); - auto pArray = writer->GetModel().Get>>("PArray"); + auto pBool = writer->GetModel().GetDefaultEntry().GetPtr>("PBool"); + auto pCustomStruct = writer->GetModel().GetDefaultEntry().GetPtr>("PCustomStruct"); + auto pIOConstructor = + writer->GetModel().GetDefaultEntry().GetPtr>("PIOConstructor"); + auto ppString = + writer->GetModel().GetDefaultEntry().GetPtr>>("PPString"); + auto pArray = writer->GetModel().GetDefaultEntry().GetPtr>>("PArray"); *pBool = std::make_unique(true); EXPECT_EQ(nullptr, pCustomStruct->get()); @@ -1112,19 +1114,19 @@ TYPED_TEST(UniquePtr, Basics) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - auto model = reader->GetModel(); - EXPECT_EQ("std::unique_ptr", model->GetField("PBool").GetType()); - EXPECT_EQ(std::string("std::unique_ptr"), model->GetField("PCustomStruct").GetType()); - EXPECT_EQ(std::string("std::unique_ptr"), model->GetField("PIOConstructor").GetType()); - EXPECT_EQ(std::string("std::unique_ptr>"), model->GetField("PPString").GetType()); - EXPECT_EQ(std::string("std::unique_ptr>"), model->GetField("PArray").GetType()); - - auto entry = reader->GetModel()->GetDefaultEntry(); - auto pBool = entry->GetPtr>("PBool"); - auto pCustomStruct = entry->GetPtr>("PCustomStruct"); - auto pIOConstructor = entry->GetPtr>("PIOConstructor"); - auto ppString = entry->GetPtr>>("PPString"); - auto pArray = entry->GetPtr>>("PArray"); + const auto &model = reader->GetModel(); + EXPECT_EQ("std::unique_ptr", model.GetField("PBool").GetType()); + EXPECT_EQ(std::string("std::unique_ptr"), model.GetField("PCustomStruct").GetType()); + EXPECT_EQ(std::string("std::unique_ptr"), model.GetField("PIOConstructor").GetType()); + EXPECT_EQ(std::string("std::unique_ptr>"), model.GetField("PPString").GetType()); + EXPECT_EQ(std::string("std::unique_ptr>"), model.GetField("PArray").GetType()); + + const auto &entry = model.GetDefaultEntry(); + auto pBool = entry.GetPtr>("PBool"); + auto pCustomStruct = entry.GetPtr>("PCustomStruct"); + auto pIOConstructor = entry.GetPtr>("PIOConstructor"); + auto ppString = entry.GetPtr>>("PPString"); + auto pArray = entry.GetPtr>>("PArray"); reader->LoadEntry(0); EXPECT_TRUE(*(pBool->get())); @@ -1202,8 +1204,8 @@ TEST(RNTuple, Casting) modelA->AddField(std::move(fldF)); { auto writer = RNTupleWriter::Recreate(std::move(modelA), "ntuple", fileGuard.GetPath()); - *writer->GetModel().GetDefaultEntry()->GetPtr("i1") = 42; - *writer->GetModel().GetDefaultEntry()->GetPtr("i2") = 137; + *writer->GetModel().GetDefaultEntry().GetPtr("i1") = 42; + *writer->GetModel().GetDefaultEntry().GetPtr("i2") = 137; writer->Fill(); } @@ -1258,8 +1260,8 @@ TEST(RNTuple, HalfPrecisionFloat) { auto writer = RNTupleWriter::Recreate(std::move(model), "ntuple", fileGuard.GetPath()); - auto f1 = writer->GetModel().GetDefaultEntry()->GetPtr("f1"); - auto fVec = writer->GetModel().GetDefaultEntry()->GetPtr>("fVec"); + auto f1 = writer->GetModel().GetDefaultEntry().GetPtr("f1"); + auto fVec = writer->GetModel().GetDefaultEntry().GetPtr>("fVec"); *f1 = 0.1f; *fVec = {0.1f, 0.2f}; writer->Fill(); @@ -1273,11 +1275,11 @@ TEST(RNTuple, HalfPrecisionFloat) EXPECT_EQ(4, ROOT::Experimental::Detail::RColumnElementBase::Generate(EColumnType::kReal16)->GetSize()); - const auto *desc = reader->GetDescriptor(); - EXPECT_EQ(EColumnType::kReal16, (*desc->GetColumnIterable(desc->FindFieldId("f1")).begin()).GetModel().GetType()); + const auto &desc = reader->GetDescriptor(); + EXPECT_EQ(EColumnType::kReal16, (*desc.GetColumnIterable(desc.FindFieldId("f1")).begin()).GetModel().GetType()); - auto f1 = reader->GetModel()->GetDefaultEntry()->GetPtr("f1"); - auto fVec = reader->GetModel()->GetDefaultEntry()->GetPtr>("fVec"); + auto f1 = reader->GetModel().GetDefaultEntry().GetPtr("f1"); + auto fVec = reader->GetModel().GetDefaultEntry().GetPtr>("fVec"); reader->LoadEntry(0); EXPECT_FLOAT_EQ(0.0999755859375f, *f1); EXPECT_FLOAT_EQ(0.0999755859375f, (*fVec)[0]); @@ -1305,8 +1307,8 @@ TEST(RNTuple, Double32) { auto writer = RNTupleWriter::Recreate(std::move(model), "ntuple", fileGuard.GetPath()); - auto d1 = writer->GetModel().GetDefaultEntry()->GetPtr("d1"); - auto d2 = writer->GetModel().GetDefaultEntry()->GetPtr("d2"); + auto d1 = writer->GetModel().GetDefaultEntry().GetPtr("d1"); + auto d2 = writer->GetModel().GetDefaultEntry().GetPtr("d2"); *d1 = 0.0; *d2 = 0.0; writer->Fill(); @@ -1328,12 +1330,12 @@ TEST(RNTuple, Double32) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - EXPECT_EQ(EColumnType::kReal32, reader->GetModel()->GetField("d1").GetColumnRepresentative()[0]); - EXPECT_EQ("", reader->GetModel()->GetField("d1").GetTypeAlias()); - EXPECT_EQ(EColumnType::kSplitReal32, reader->GetModel()->GetField("d2").GetColumnRepresentative()[0]); - EXPECT_EQ("Double32_t", reader->GetModel()->GetField("d2").GetTypeAlias()); - auto d1 = reader->GetModel()->GetDefaultEntry()->GetPtr("d1"); - auto d2 = reader->GetModel()->GetDefaultEntry()->GetPtr("d2"); + EXPECT_EQ(EColumnType::kReal32, reader->GetModel().GetField("d1").GetColumnRepresentative()[0]); + EXPECT_EQ("", reader->GetModel().GetField("d1").GetTypeAlias()); + EXPECT_EQ(EColumnType::kSplitReal32, reader->GetModel().GetField("d2").GetColumnRepresentative()[0]); + EXPECT_EQ("Double32_t", reader->GetModel().GetField("d2").GetTypeAlias()); + auto d1 = reader->GetModel().GetDefaultEntry().GetPtr("d1"); + auto d2 = reader->GetModel().GetDefaultEntry().GetPtr("d2"); reader->LoadEntry(0); EXPECT_DOUBLE_EQ(0.0, *d1); EXPECT_DOUBLE_EQ(*d1, *d2); @@ -1384,9 +1386,9 @@ TEST(RNTuple, Double32Extended) } auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); - auto obj = reader->GetModel()->GetDefaultEntry()->GetPtr("obj"); - EXPECT_EQ("Double32_t", reader->GetModel()->GetField("obj").GetSubFields()[1]->GetTypeAlias()); - EXPECT_EQ("Double32_t", reader->GetModel()->GetField("obj").GetSubFields()[2]->GetSubFields()[0]->GetTypeAlias()); + auto obj = reader->GetModel().GetDefaultEntry().GetPtr("obj"); + EXPECT_EQ("Double32_t", reader->GetModel().GetField("obj").GetSubFields()[1]->GetTypeAlias()); + EXPECT_EQ("Double32_t", reader->GetModel().GetField("obj").GetSubFields()[2]->GetSubFields()[0]->GetTypeAlias()); EXPECT_DOUBLE_EQ(0.0, obj->a); EXPECT_DOUBLE_EQ(1.0, obj->b); EXPECT_DOUBLE_EQ(2.0, obj->c[0]); @@ -1513,7 +1515,7 @@ TEST(RNTuple, TClassEBO) { auto ntuple = RNTupleReader::Open("f", fileGuard.GetPath()); EXPECT_EQ(1U, ntuple->GetNEntries()); - auto idEmptyStruct = ntuple->GetDescriptor()->FindFieldId("klass.:_0"); + auto idEmptyStruct = ntuple->GetDescriptor().FindFieldId("klass.:_0"); EXPECT_NE(idEmptyStruct, ROOT::Experimental::kInvalidDescriptorId); auto viewKlass = ntuple->GetView("klass"); EXPECT_EQ(42, viewKlass(0).u64); @@ -1534,7 +1536,7 @@ TEST(RNTuple, IOConstructor) auto ntuple = RNTupleReader::Open("f", fileGuard.GetPath()); EXPECT_EQ(1U, ntuple->GetNEntries()); - auto obj = ntuple->GetModel()->GetDefaultEntry()->GetPtr("obj"); + auto obj = ntuple->GetModel().GetDefaultEntry().GetPtr("obj"); EXPECT_EQ(7, obj->a); } @@ -1556,9 +1558,9 @@ TEST(RNTuple, TClassTemplateBased) auto reader = RNTupleReader::Open("f", fileGuard.GetPath()); - const auto &fieldObject = reader->GetModel()->GetField("klass"); + const auto &fieldObject = reader->GetModel().GetField("klass"); EXPECT_EQ("EdmWrapper", fieldObject.GetType()); - auto object = reader->GetModel()->GetDefaultEntry()->GetPtr>("klass"); + auto object = reader->GetModel().GetDefaultEntry().GetPtr>("klass"); reader->LoadEntry(0); EXPECT_TRUE(object->fIsPresent); reader->LoadEntry(1); @@ -1654,9 +1656,9 @@ TEST(RNTuple, TVirtualCollectionProxy) auto fieldNested = model->MakeField>>("nested"); auto ntuple = RNTupleWriter::Recreate(std::move(model), "f", fileGuard.GetPath()); - auto fieldC = ntuple->GetModel().GetDefaultEntry()->GetPtr>("C"); - auto fieldF = ntuple->GetModel().GetDefaultEntry()->GetPtr>("F"); - auto fieldS = ntuple->GetModel().GetDefaultEntry()->GetPtr>("S"); + auto fieldC = ntuple->GetModel().GetDefaultEntry().GetPtr>("C"); + auto fieldF = ntuple->GetModel().GetDefaultEntry().GetPtr>("F"); + auto fieldS = ntuple->GetModel().GetDefaultEntry().GetPtr>("S"); for (unsigned i = 0; i < 1000; ++i) { if ((i % 100) == 0) { fieldC->v.clear(); diff --git a/tree/ntuple/v7/test/rfield_blob.cxx b/tree/ntuple/v7/test/rfield_blob.cxx index 5a4e3ad2fb18d..3bb994f85d0a2 100644 --- a/tree/ntuple/v7/test/rfield_blob.cxx +++ b/tree/ntuple/v7/test/rfield_blob.cxx @@ -23,7 +23,7 @@ TEST(RField, Blob) auto reader = RNTupleReader::Open("f", fileGuard.GetPath()); ASSERT_EQ(1U, reader->GetNEntries()); reader->LoadEntry(0); - auto fldBlob = reader->GetModel()->GetDefaultEntry()->GetPtr>("blob"); + auto fldBlob = reader->GetModel().GetDefaultEntry().GetPtr>("blob"); TMemFile f("buffer", TMemFile::ZeroCopyView_t(reinterpret_cast(fldBlob->data()), fldBlob->size())); auto str = f.Get("string"); EXPECT_EQ("x", *str); diff --git a/tree/ntuple/v7/test/rfield_string.cxx b/tree/ntuple/v7/test/rfield_string.cxx index 81e5aae5a56bc..bdaf37b24254c 100644 --- a/tree/ntuple/v7/test/rfield_string.cxx +++ b/tree/ntuple/v7/test/rfield_string.cxx @@ -21,9 +21,9 @@ TEST(RNTuple, ReadString) auto ntuple = RNTupleReader::Open(ntupleName, fileGuard.GetPath()); auto viewSt = ntuple->GetView("st"); - if (ntuple->GetDescriptor()->GetClusterDescriptor(0).GetPageRange(1).fPageInfos.size() < 2) { + if (ntuple->GetDescriptor().GetClusterDescriptor(0).GetPageRange(1).fPageInfos.size() < 2) { FAIL(); // This means all entries are inside the same page and numEntries should be increased. } - int nElementsPerPage = ntuple->GetDescriptor()->GetClusterDescriptor(0).GetPageRange(1).fPageInfos.at(1).fNElements; + int nElementsPerPage = ntuple->GetDescriptor().GetClusterDescriptor(0).GetPageRange(1).fPageInfos.at(1).fNElements; EXPECT_EQ(contentString, viewSt(nElementsPerPage/7)); } diff --git a/tree/ntuple/v7/test/rfield_variant.cxx b/tree/ntuple/v7/test/rfield_variant.cxx index 6885835c0700a..2130bbd6f9a37 100644 --- a/tree/ntuple/v7/test/rfield_variant.cxx +++ b/tree/ntuple/v7/test/rfield_variant.cxx @@ -8,6 +8,7 @@ TEST(RNTuple, Variant) auto wrVariant = modelWrite->MakeField>("variant"); *wrVariant = 2.0; + modelWrite->Freeze(); auto modelRead = std::unique_ptr(modelWrite->Clone()); { @@ -20,7 +21,7 @@ TEST(RNTuple, Variant) *wrVariant = 8.0; ntuple.Fill(); } - auto rdVariant = modelRead->Get>("variant"); + auto rdVariant = modelRead->GetDefaultEntry().GetPtr>("variant").get(); RNTupleReader ntuple(std::move(modelRead), std::make_unique("myNTuple", fileGuard.GetPath(), RNTupleReadOptions())); diff --git a/tree/ntuple/v7/test/rfield_vector.cxx b/tree/ntuple/v7/test/rfield_vector.cxx index 94056d2050ba7..109e3be525246 100644 --- a/tree/ntuple/v7/test/rfield_vector.cxx +++ b/tree/ntuple/v7/test/rfield_vector.cxx @@ -219,7 +219,7 @@ TEST(RNTuple, RVecTypeErased) auto field = RFieldBase::Create("v", "ROOT::VecOps::RVec").Unwrap(); m->AddField(std::move(field)); m->Freeze(); - m->GetDefaultEntry()->BindRawPtr("v", &rvec); + m->GetDefaultEntry().BindRawPtr("v", &rvec); auto w = RNTupleWriter::Recreate(std::move(m), "r", fileGuard.GetPath()); w->Fill(); @@ -232,7 +232,7 @@ TEST(RNTuple, RVecTypeErased) // read back RVec with type-erased API auto r = RNTupleReader::Open("r", fileGuard.GetPath()); - auto v = r->GetModel()->Get>("v"); + auto v = r->GetModel().GetDefaultEntry().GetPtr>("v"); r->LoadEntry(0); EXPECT_EQ(v->size(), 3); @@ -291,6 +291,7 @@ TEST(RNTuple, BoolVector) wrBoolRVec->push_back(true); wrBoolRVec->push_back(false); + modelWrite->Freeze(); auto modelRead = modelWrite->Clone(); { @@ -299,8 +300,8 @@ TEST(RNTuple, BoolVector) ntuple.Fill(); } - auto rdBoolStdVec = modelRead->Get>("boolStdVec"); - auto rdBoolRVec = modelRead->Get>("boolRVec"); + auto rdBoolStdVec = modelRead->GetDefaultEntry().GetPtr>("boolStdVec"); + auto rdBoolRVec = modelRead->GetDefaultEntry().GetPtr>("boolRVec"); RNTupleReader ntuple(std::move(modelRead), std::make_unique("myNTuple", fileGuard.GetPath(), RNTupleReadOptions())); EXPECT_EQ(1U, ntuple.GetNEntries()); @@ -359,7 +360,7 @@ TEST(RNTuple, ComplexVector) ComplexStruct::SetNCallDestructor(0); { auto ntuple = RNTupleReader::Open("T", fileGuard.GetPath()); - auto rdV = ntuple->GetModel()->GetDefaultEntry()->GetPtr>("v"); + auto rdV = ntuple->GetModel().GetDefaultEntry().GetPtr>("v"); ntuple->LoadEntry(0); EXPECT_EQ(0, ComplexStruct::GetNCallConstructor()); @@ -402,7 +403,7 @@ TEST(RNTuple, ComplexRVec) ComplexStruct::SetNCallDestructor(0); { auto ntuple = RNTupleReader::Open("T", fileGuard.GetPath()); - auto rdV = ntuple->GetModel()->GetDefaultEntry()->GetPtr>("v"); + auto rdV = ntuple->GetModel().GetDefaultEntry().GetPtr>("v"); ntuple->LoadEntry(0); EXPECT_EQ(0, ComplexStruct::GetNCallConstructor()); diff --git a/tree/ntupleutil/v7/test/ntuple_importer.cxx b/tree/ntupleutil/v7/test/ntuple_importer.cxx index 8940833f229ac..99068d7e5b4ba 100644 --- a/tree/ntupleutil/v7/test/ntuple_importer.cxx +++ b/tree/ntupleutil/v7/test/ntuple_importer.cxx @@ -159,17 +159,17 @@ TEST(RNTupleImporter, Simple) auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); EXPECT_EQ(1U, reader->GetNEntries()); reader->LoadEntry(0); - EXPECT_TRUE(*reader->GetModel()->Get("myBool")); - EXPECT_EQ(-8, *reader->GetModel()->Get("myInt8")); - EXPECT_EQ(8U, *reader->GetModel()->Get("myUInt8")); - EXPECT_EQ(-16, *reader->GetModel()->Get("myInt16")); - EXPECT_EQ(16U, *reader->GetModel()->Get("myUInt16")); - EXPECT_EQ(-32, *reader->GetModel()->Get("myInt32")); - EXPECT_EQ(32U, *reader->GetModel()->Get("myUInt32")); - EXPECT_EQ(-64, *reader->GetModel()->Get("myInt64")); - EXPECT_EQ(64U, *reader->GetModel()->Get("myUInt64")); - EXPECT_FLOAT_EQ(32.0, *reader->GetModel()->Get("myFloat")); - EXPECT_FLOAT_EQ(64.0, *reader->GetModel()->Get("myDouble")); + EXPECT_TRUE(*reader->GetModel().GetDefaultEntry().GetPtr("myBool")); + EXPECT_EQ(-8, *reader->GetModel().GetDefaultEntry().GetPtr("myInt8")); + EXPECT_EQ(8U, *reader->GetModel().GetDefaultEntry().GetPtr("myUInt8")); + EXPECT_EQ(-16, *reader->GetModel().GetDefaultEntry().GetPtr("myInt16")); + EXPECT_EQ(16U, *reader->GetModel().GetDefaultEntry().GetPtr("myUInt16")); + EXPECT_EQ(-32, *reader->GetModel().GetDefaultEntry().GetPtr("myInt32")); + EXPECT_EQ(32U, *reader->GetModel().GetDefaultEntry().GetPtr("myUInt32")); + EXPECT_EQ(-64, *reader->GetModel().GetDefaultEntry().GetPtr("myInt64")); + EXPECT_EQ(64U, *reader->GetModel().GetDefaultEntry().GetPtr("myUInt64")); + EXPECT_FLOAT_EQ(64.0, *reader->GetModel().GetDefaultEntry().GetPtr("myDouble")); + EXPECT_FLOAT_EQ(32.0, *reader->GetModel().GetDefaultEntry().GetPtr("myFloat")); } TEST(RNTupleImporter, FieldName) @@ -192,7 +192,7 @@ TEST(RNTupleImporter, FieldName) auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); EXPECT_EQ(1U, reader->GetNEntries()); reader->LoadEntry(0); - EXPECT_EQ(42, *reader->GetModel()->Get("a")); + EXPECT_EQ(42, *reader->GetModel().GetDefaultEntry().GetPtr("a")); } TEST(RNTupleImporter, ConvertDotsInBranchNames) @@ -217,7 +217,7 @@ TEST(RNTupleImporter, ConvertDotsInBranchNames) importer->Import(); auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); reader->LoadEntry(0); - EXPECT_EQ(42, *reader->GetModel()->Get("a_a")); + EXPECT_EQ(42, *reader->GetModel().GetDefaultEntry().GetPtr("a_a")); } TEST(RNTupleImporter, CString) @@ -245,11 +245,11 @@ TEST(RNTupleImporter, CString) auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); EXPECT_EQ(3U, reader->GetNEntries()); reader->LoadEntry(0); - EXPECT_EQ(std::string("R"), *reader->GetModel()->Get("myString")); + EXPECT_EQ(std::string("R"), *reader->GetModel().GetDefaultEntry().GetPtr("myString")); reader->LoadEntry(1); - EXPECT_EQ(std::string(""), *reader->GetModel()->Get("myString")); + EXPECT_EQ(std::string(""), *reader->GetModel().GetDefaultEntry().GetPtr("myString")); reader->LoadEntry(2); - EXPECT_EQ(std::string("ROOT RNTuple"), *reader->GetModel()->Get("myString")); + EXPECT_EQ(std::string("ROOT RNTuple"), *reader->GetModel().GetDefaultEntry().GetPtr("myString")); } TEST(RNTupleImporter, Leaflist) @@ -469,14 +469,14 @@ TEST(RNTupleImporter, STL) EXPECT_EQ(1U, reader->GetNEntries()); reader->LoadEntry(0); - auto vec = reader->GetModel()->Get>("vec"); + auto vec = reader->GetModel().GetDefaultEntry().GetPtr>("vec"); EXPECT_EQ(2U, vec->size()); EXPECT_FLOAT_EQ(1.0, vec->at(0)); EXPECT_FLOAT_EQ(2.0, vec->at(1)); - auto pair = reader->GetModel()->Get>("pair"); + auto pair = reader->GetModel().GetDefaultEntry().GetPtr>("pair"); EXPECT_FLOAT_EQ(3.0, pair->first); EXPECT_FLOAT_EQ(4.0, pair->second); - auto tuple = reader->GetModel()->Get>("tuple"); + auto tuple = reader->GetModel().GetDefaultEntry().GetPtr>("tuple"); EXPECT_EQ(5, std::get<0>(*tuple)); EXPECT_FLOAT_EQ(6.0, std::get<1>(*tuple)); EXPECT_TRUE(std::get<2>(*tuple)); @@ -510,7 +510,7 @@ TEST(RNTupleImporter, CustomClass) auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); EXPECT_EQ(1U, reader->GetNEntries()); reader->LoadEntry(0); - auto object = reader->GetModel()->Get("object"); + auto object = reader->GetModel().GetDefaultEntry().GetPtr("object"); EXPECT_EQ(13, object->base); EXPECT_FLOAT_EQ(1.0, object->a); EXPECT_EQ(2U, object->v1.size()); @@ -552,7 +552,7 @@ TEST(RNTupleImporter, ComplexClass) auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); EXPECT_EQ(3U, reader->GetNEntries()); - auto object = reader->GetModel()->Get("object"); + auto object = reader->GetModel().GetDefaultEntry().GetPtr("object"); ComplexStructUtil reference; reader->LoadEntry(0); reference.Init1(); @@ -594,7 +594,7 @@ TEST(RNTupleImporter, CollectionProxyClass) auto reader = RNTupleReader::Open("ntuple", fileGuard.GetPath()); EXPECT_EQ(1U, reader->GetNEntries()); - auto objectVec = reader->GetModel()->Get>("objectVec"); + auto objectVec = reader->GetModel().GetDefaultEntry().GetPtr>("objectVec"); reader->LoadEntry(0); EXPECT_EQ(3, objectVec->size());