@@ -208,6 +208,55 @@ TEST(RNTupleBulk, RVec)
208208 }
209209}
210210
211+ TEST (RNTupleBulk, Array)
212+ {
213+ FileRaii fileGuard (" test_ntuple_bulk_array.root" );
214+ {
215+ auto model = RNTupleModel::Create ();
216+ auto fldArrI = model->MakeField <std::array<int , 2 >>(" aint" );
217+ auto fld2DArrI = model->MakeField <std::array<std::array<int , 2 >, 2 >>(" 2daint" );
218+ auto writer = RNTupleWriter::Recreate (std::move (model), " ntpl" , fileGuard.GetPath ());
219+ for (int i = 0 ; i < 3 ; ++i) {
220+ fldArrI->at (0 ) = 2 * i;
221+ fldArrI->at (1 ) = 2 * i + 1 ;
222+
223+ fld2DArrI->at (0 ).at (0 ) = 4 * i;
224+ fld2DArrI->at (0 ).at (1 ) = 4 * i + 1 ;
225+ fld2DArrI->at (1 ).at (0 ) = 4 * i + 2 ;
226+ fld2DArrI->at (1 ).at (1 ) = 4 * i + 3 ;
227+
228+ writer->Fill ();
229+ }
230+ }
231+
232+ auto reader = RNTupleReader::Open (" ntpl" , fileGuard.GetPath ());
233+ const auto &model = reader->GetModel ();
234+
235+ RFieldBase::RBulkValues bulkI = model.CreateBulk (" aint" );
236+ RFieldBase::RBulkValues bulk2DI = model.CreateBulk (" 2daint" );
237+
238+ auto mask = std::make_unique<bool []>(3 );
239+ mask[0 ] = true ;
240+ mask[1 ] = false ; // the std::array<simple type, ...> field optimization should ignore the mask
241+ mask[2 ] = true ;
242+
243+ auto iArr = static_cast <std::array<int , 2 > *>(bulkI.ReadBulk (RNTupleLocalIndex (0 , 0 ), mask.get (), 3 ));
244+ auto i2DArr =
245+ static_cast <std::array<std::array<int , 2 >, 2 > *>(bulk2DI.ReadBulk (RNTupleLocalIndex (0 , 0 ), mask.get (), 3 ));
246+
247+ for (int i = 0 ; i < 3 ; ++i) {
248+ EXPECT_EQ (2 * i, iArr[i][0 ]);
249+ EXPECT_EQ (2 * i + 1 , iArr[i][1 ]);
250+
251+ if (mask[i]) {
252+ EXPECT_EQ (4 * i, i2DArr[i][0 ][0 ]);
253+ EXPECT_EQ (4 * i + 1 , i2DArr[i][0 ][1 ]);
254+ EXPECT_EQ (4 * i + 2 , i2DArr[i][1 ][0 ]);
255+ EXPECT_EQ (4 * i + 3 , i2DArr[i][1 ][1 ]);
256+ }
257+ }
258+ }
259+
211260TEST (RNTupleBulk, Adopted)
212261{
213262 FileRaii fileGuard (" test_ntuple_bulk_adopted.root" );
0 commit comments