@@ -966,3 +966,48 @@ struct StreamerField {
966
966
EXPECT_EVALUATE_EQ (" ptrStreamerField->fInt" , 2 );
967
967
EXPECT_EVALUATE_EQ (" ptrStreamerField->fAdded" , 137 );
968
968
}
969
+
970
+ TEST (RNTupleEvolution, RecordField)
971
+ {
972
+ FileRaii fileGuard (" test_ntuple_evolution_record_field.root" );
973
+ {
974
+ std::vector<std::unique_ptr<RFieldBase>> items;
975
+ items.emplace_back (std::make_unique<RField<char >>(" f1" ));
976
+ items.emplace_back (std::make_unique<RField<float >>(" f2" ));
977
+ items.emplace_back (std::make_unique<RField<std::string>>(" f3" ));
978
+
979
+ auto model = ROOT::RNTupleModel::Create ();
980
+ model->AddField (std::make_unique<ROOT::RRecordField>(" r" , std::move (items)));
981
+
982
+ auto writer = ROOT::RNTupleWriter::Recreate (std::move (model), " ntpl" , fileGuard.GetPath ());
983
+
984
+ auto r = writer->GetModel ().GetDefaultEntry ().GetPtr <void >(" r" );
985
+ const auto &rf = static_cast <const ROOT::RRecordField &>(writer->GetModel ().GetConstField (" r" ));
986
+
987
+ auto f1 = reinterpret_cast <char *>(reinterpret_cast <unsigned char *>(r.get ()) + rf.GetOffsets ()[0 ]);
988
+ auto f3 = reinterpret_cast <std::string *>(reinterpret_cast <unsigned char *>(r.get ()) + rf.GetOffsets ()[2 ]);
989
+ *f1 = ' x' ;
990
+ *f3 = " ROOT" ;
991
+
992
+ writer->Fill ();
993
+ }
994
+
995
+ std::vector<std::unique_ptr<RFieldBase>> items;
996
+ items.emplace_back (std::make_unique<RField<std::string>>(" f3" ));
997
+ items.emplace_back (std::make_unique<RField<std::vector<float >>>(" f4" ));
998
+ items.emplace_back (std::make_unique<RField<int >>(" f1" ));
999
+
1000
+ auto model = ROOT::RNTupleModel::Create ();
1001
+ model->AddField (std::make_unique<ROOT::RRecordField>(" r" , std::move (items)));
1002
+
1003
+ auto reader = RNTupleReader::Open (std::move (model), " ntpl" , fileGuard.GetPath ());
1004
+ auto r = reader->GetModel ().GetDefaultEntry ().GetPtr <void >(" r" );
1005
+ const auto &rf = static_cast <const ROOT::RRecordField &>(reader->GetModel ().GetConstField (" r" ));
1006
+ auto f3 = reinterpret_cast <std::string *>(reinterpret_cast <unsigned char *>(r.get ()) + rf.GetOffsets ()[0 ]);
1007
+ auto f4 = reinterpret_cast <std::vector<float > *>(reinterpret_cast <unsigned char *>(r.get ()) + rf.GetOffsets ()[1 ]);
1008
+ auto f1 = reinterpret_cast <int *>(reinterpret_cast <unsigned char *>(r.get ()) + rf.GetOffsets ()[2 ]);
1009
+ reader->LoadEntry (0 );
1010
+ EXPECT_EQ (" ROOT" , *f3);
1011
+ EXPECT_TRUE (f4->empty ());
1012
+ EXPECT_EQ (' x' , *f1);
1013
+ }
0 commit comments