go-hep.org/x/hep@v0.38.1/groot/rdict/rwstreamer_test.go (about) 1 // Copyright 2020 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package rdict 6 7 import ( 8 "fmt" 9 "reflect" 10 "testing" 11 12 "go-hep.org/x/hep/groot/rbase" 13 "go-hep.org/x/hep/groot/rbytes" 14 "go-hep.org/x/hep/groot/rcont" 15 "go-hep.org/x/hep/groot/rmeta" 16 "go-hep.org/x/hep/groot/root" 17 "go-hep.org/x/hep/groot/rvers" 18 ) 19 20 func TestRWStream(t *testing.T) { 21 const kind = rbytes.ObjectWise // FIXME(sbinet): also test MemberWise. 22 23 for _, tc := range []struct { 24 name string 25 skip bool 26 si *StreamerInfo 27 ptr any 28 deps []rbytes.StreamerInfo 29 err error 30 }{ 31 { 32 name: "bits", 33 ptr: &struct { 34 F uint32 35 }{42}, 36 si: &StreamerInfo{ 37 named: *rbase.NewNamed("T", "T"), 38 objarr: rcont.NewObjArray(), 39 elems: []rbytes.StreamerElement{ 40 &StreamerBasicType{StreamerElement{ 41 named: *rbase.NewNamed("F", ""), 42 etype: rmeta.Bits, 43 esize: 4, 44 ename: "Bits_t", 45 }}, 46 }, 47 }, 48 }, 49 { 50 name: "bool", 51 ptr: &struct { 52 F bool 53 }{true}, 54 si: &StreamerInfo{ 55 named: *rbase.NewNamed("T", "T"), 56 objarr: rcont.NewObjArray(), 57 elems: []rbytes.StreamerElement{ 58 &StreamerBasicType{StreamerElement{ 59 named: *rbase.NewNamed("F", ""), 60 etype: rmeta.Bool, 61 esize: 1, 62 ename: "bool", 63 }}, 64 }, 65 }, 66 }, 67 { 68 name: "uint8", 69 ptr: &struct { 70 F uint8 71 }{42}, 72 si: &StreamerInfo{ 73 named: *rbase.NewNamed("T", "T"), 74 objarr: rcont.NewObjArray(), 75 elems: []rbytes.StreamerElement{ 76 &StreamerBasicType{StreamerElement{ 77 named: *rbase.NewNamed("F", ""), 78 etype: rmeta.Uint8, 79 esize: 1, 80 ename: "uint8", 81 }}, 82 }, 83 }, 84 }, 85 { 86 name: "uint16", 87 ptr: &struct { 88 F uint16 89 }{42}, 90 si: &StreamerInfo{ 91 named: *rbase.NewNamed("T", "T"), 92 objarr: rcont.NewObjArray(), 93 elems: []rbytes.StreamerElement{ 94 &StreamerBasicType{StreamerElement{ 95 named: *rbase.NewNamed("F", ""), 96 etype: rmeta.Uint16, 97 esize: 2, 98 ename: "uint16", 99 }}, 100 }, 101 }, 102 }, 103 { 104 name: "uint32", 105 ptr: &struct { 106 F uint32 107 }{42}, 108 si: &StreamerInfo{ 109 named: *rbase.NewNamed("T", "T"), 110 objarr: rcont.NewObjArray(), 111 elems: []rbytes.StreamerElement{ 112 &StreamerBasicType{StreamerElement{ 113 named: *rbase.NewNamed("F", ""), 114 etype: rmeta.Uint32, 115 esize: 4, 116 ename: "uint32", 117 }}, 118 }, 119 }, 120 }, 121 { 122 name: "uint64", 123 ptr: &struct { 124 F uint64 125 }{42}, 126 si: &StreamerInfo{ 127 named: *rbase.NewNamed("T", "T"), 128 objarr: rcont.NewObjArray(), 129 elems: []rbytes.StreamerElement{ 130 &StreamerBasicType{StreamerElement{ 131 named: *rbase.NewNamed("F", ""), 132 etype: rmeta.Uint64, 133 esize: 8, 134 ename: "uint64", 135 }}, 136 }, 137 }, 138 }, 139 { 140 name: "int8", 141 ptr: &struct { 142 F int8 143 }{42}, 144 si: &StreamerInfo{ 145 named: *rbase.NewNamed("T", "T"), 146 objarr: rcont.NewObjArray(), 147 elems: []rbytes.StreamerElement{ 148 &StreamerBasicType{StreamerElement{ 149 named: *rbase.NewNamed("F", ""), 150 etype: rmeta.Int8, 151 esize: 1, 152 ename: "int8", 153 }}, 154 }, 155 }, 156 }, 157 { 158 name: "int16", 159 ptr: &struct { 160 F int16 161 }{42}, 162 si: &StreamerInfo{ 163 named: *rbase.NewNamed("T", "T"), 164 objarr: rcont.NewObjArray(), 165 elems: []rbytes.StreamerElement{ 166 &StreamerBasicType{StreamerElement{ 167 named: *rbase.NewNamed("F", ""), 168 etype: rmeta.Int16, 169 esize: 2, 170 ename: "int16", 171 }}, 172 }, 173 }, 174 }, 175 { 176 name: "int32", 177 ptr: &struct { 178 F int32 179 }{42}, 180 si: &StreamerInfo{ 181 named: *rbase.NewNamed("T", "T"), 182 objarr: rcont.NewObjArray(), 183 elems: []rbytes.StreamerElement{ 184 &StreamerBasicType{StreamerElement{ 185 named: *rbase.NewNamed("F", ""), 186 etype: rmeta.Int32, 187 esize: 4, 188 ename: "int32", 189 }}, 190 }, 191 }, 192 }, 193 { 194 name: "int64", 195 ptr: &struct { 196 F int64 197 }{42}, 198 si: &StreamerInfo{ 199 named: *rbase.NewNamed("T", "T"), 200 objarr: rcont.NewObjArray(), 201 elems: []rbytes.StreamerElement{ 202 &StreamerBasicType{StreamerElement{ 203 named: *rbase.NewNamed("F", ""), 204 etype: rmeta.Int64, 205 esize: 8, 206 ename: "int64", 207 }}, 208 }, 209 }, 210 }, 211 { 212 name: "float32", 213 ptr: &struct { 214 F float32 215 }{42}, 216 si: &StreamerInfo{ 217 named: *rbase.NewNamed("T", "T"), 218 objarr: rcont.NewObjArray(), 219 elems: []rbytes.StreamerElement{ 220 &StreamerBasicType{StreamerElement{ 221 named: *rbase.NewNamed("F", ""), 222 etype: rmeta.Float32, 223 esize: 4, 224 ename: "float32", 225 }}, 226 }, 227 }, 228 }, 229 { 230 name: "float64", 231 ptr: &struct { 232 F float64 233 }{42}, 234 si: &StreamerInfo{ 235 named: *rbase.NewNamed("T", "T"), 236 objarr: rcont.NewObjArray(), 237 elems: []rbytes.StreamerElement{ 238 &StreamerBasicType{StreamerElement{ 239 named: *rbase.NewNamed("F", ""), 240 etype: rmeta.Float64, 241 esize: 8, 242 ename: "float64", 243 }}, 244 }, 245 }, 246 }, 247 { 248 name: "float16", 249 ptr: &struct { 250 F root.Float16 251 }{42}, 252 si: &StreamerInfo{ 253 named: *rbase.NewNamed("T", "T"), 254 objarr: rcont.NewObjArray(), 255 elems: []rbytes.StreamerElement{ 256 &StreamerBasicType{Element{ 257 Name: *rbase.NewNamed("F", "[0,42]"), 258 Type: rmeta.Float16, 259 Size: 2, 260 EName: "Float16_t", 261 }.New()}, 262 }, 263 }, 264 }, 265 { 266 name: "double32", 267 ptr: &struct { 268 F root.Double32 269 }{42}, 270 si: &StreamerInfo{ 271 named: *rbase.NewNamed("T", "T"), 272 objarr: rcont.NewObjArray(), 273 elems: []rbytes.StreamerElement{ 274 &StreamerBasicType{Element{ 275 Name: *rbase.NewNamed("F", "[0,42]"), 276 Type: rmeta.Double32, 277 Size: 4, 278 EName: "Double32_t", 279 }.New()}, 280 }, 281 }, 282 }, 283 { 284 name: "pchar", 285 ptr: &struct { 286 F string 287 }{"hello"}, 288 si: &StreamerInfo{ 289 named: *rbase.NewNamed("T", "T"), 290 objarr: rcont.NewObjArray(), 291 elems: []rbytes.StreamerElement{ 292 &StreamerBasicType{Element{ 293 Name: *rbase.NewNamed("F", ""), 294 Type: rmeta.CharStar, 295 Size: 8, 296 EName: "char*", 297 }.New()}, 298 }, 299 }, 300 }, 301 { 302 name: "TString", 303 ptr: &struct { 304 F string 305 }{"hello"}, 306 si: &StreamerInfo{ 307 named: *rbase.NewNamed("T", "T"), 308 objarr: rcont.NewObjArray(), 309 elems: []rbytes.StreamerElement{ 310 &StreamerString{Element{ 311 Name: *rbase.NewNamed("F", ""), 312 Type: rmeta.TString, 313 Size: 24, 314 EName: "TString", 315 }.New()}, 316 }, 317 }, 318 }, 319 { 320 name: "STL-string", 321 ptr: &struct { 322 F string 323 }{"hello"}, 324 si: &StreamerInfo{ 325 named: *rbase.NewNamed("T", "T"), 326 objarr: rcont.NewObjArray(), 327 elems: []rbytes.StreamerElement{ 328 &StreamerSTLstring{ 329 StreamerSTL: StreamerSTL{ 330 StreamerElement: Element{ 331 Name: *rbase.NewNamed("F", ""), 332 Type: rmeta.STLstring, 333 Size: 32, 334 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 335 EName: "string", 336 }.New(), 337 vtype: rmeta.ESTLType(rmeta.STLstring), 338 ctype: rmeta.STLstring, 339 }, 340 }, 341 }, 342 }, 343 }, 344 { 345 name: "TObject", 346 ptr: &struct { 347 F rbase.Object 348 }{*rbase.NewObject()}, 349 si: &StreamerInfo{ 350 named: *rbase.NewNamed("T", "T"), 351 objarr: rcont.NewObjArray(), 352 elems: []rbytes.StreamerElement{ 353 &StreamerObject{Element{ 354 Name: *rbase.NewNamed("F", ""), 355 Type: rmeta.TObject, 356 Size: 16, 357 EName: "TObject", 358 }.New()}, 359 }, 360 }, 361 }, 362 { 363 name: "TNamed", 364 ptr: &struct { 365 F rbase.Named 366 }{*rbase.NewNamed("hello", "world")}, 367 si: &StreamerInfo{ 368 named: *rbase.NewNamed("T", "T"), 369 objarr: rcont.NewObjArray(), 370 elems: []rbytes.StreamerElement{ 371 &StreamerObject{Element{ 372 Name: *rbase.NewNamed("F", ""), 373 Type: rmeta.TNamed, 374 Size: 64, 375 EName: "TNamed", 376 }.New()}, 377 }, 378 }, 379 }, 380 { 381 name: "arr-bool", 382 ptr: &struct { 383 F [3]bool 384 }{[3]bool{true, false, true}}, 385 si: &StreamerInfo{ 386 named: *rbase.NewNamed("T", "T"), 387 objarr: rcont.NewObjArray(), 388 elems: []rbytes.StreamerElement{ 389 &StreamerBasicType{Element{ 390 Name: *rbase.NewNamed("F", ""), 391 Type: rmeta.OffsetL + rmeta.Bool, 392 Size: 3, 393 ArrLen: 3, 394 ArrDim: 1, 395 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 396 EName: "bool", 397 }.New()}, 398 }, 399 }, 400 }, 401 { 402 name: "arr-int8", 403 ptr: &struct { 404 F [3]int8 405 }{[3]int8{42, 43, 44}}, 406 si: &StreamerInfo{ 407 named: *rbase.NewNamed("T", "T"), 408 objarr: rcont.NewObjArray(), 409 elems: []rbytes.StreamerElement{ 410 &StreamerBasicType{Element{ 411 Name: *rbase.NewNamed("F", ""), 412 Type: rmeta.OffsetL + rmeta.Int8, 413 Size: 3, 414 ArrLen: 3, 415 ArrDim: 1, 416 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 417 EName: "int8", 418 }.New()}, 419 }, 420 }, 421 }, 422 { 423 name: "arr-int16", 424 ptr: &struct { 425 F [3]int16 426 }{[3]int16{42, 43, 44}}, 427 si: &StreamerInfo{ 428 named: *rbase.NewNamed("T", "T"), 429 objarr: rcont.NewObjArray(), 430 elems: []rbytes.StreamerElement{ 431 &StreamerBasicType{Element{ 432 Name: *rbase.NewNamed("F", ""), 433 Type: rmeta.OffsetL + rmeta.Int16, 434 Size: 3 * 2, 435 ArrLen: 3, 436 ArrDim: 1, 437 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 438 EName: "int16", 439 }.New()}, 440 }, 441 }, 442 }, 443 { 444 name: "arr-int32", 445 ptr: &struct { 446 F [3]int32 447 }{[3]int32{42, 43, 44}}, 448 si: &StreamerInfo{ 449 named: *rbase.NewNamed("T", "T"), 450 objarr: rcont.NewObjArray(), 451 elems: []rbytes.StreamerElement{ 452 &StreamerBasicType{Element{ 453 Name: *rbase.NewNamed("F", ""), 454 Type: rmeta.OffsetL + rmeta.Int32, 455 Size: 3 * 4, 456 ArrLen: 3, 457 ArrDim: 1, 458 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 459 EName: "int32", 460 }.New()}, 461 }, 462 }, 463 }, 464 { 465 name: "arr-int64", 466 ptr: &struct { 467 F [3]int64 468 }{[3]int64{42, 43, 44}}, 469 si: &StreamerInfo{ 470 named: *rbase.NewNamed("T", "T"), 471 objarr: rcont.NewObjArray(), 472 elems: []rbytes.StreamerElement{ 473 &StreamerBasicType{Element{ 474 Name: *rbase.NewNamed("F", ""), 475 Type: rmeta.OffsetL + rmeta.Int64, 476 Size: 3 * 8, 477 ArrLen: 3, 478 ArrDim: 1, 479 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 480 EName: "int64", 481 }.New()}, 482 }, 483 }, 484 }, 485 { 486 name: "arr-uint8", 487 ptr: &struct { 488 F [3]uint8 489 }{[3]uint8{42, 43, 44}}, 490 si: &StreamerInfo{ 491 named: *rbase.NewNamed("T", "T"), 492 objarr: rcont.NewObjArray(), 493 elems: []rbytes.StreamerElement{ 494 &StreamerBasicType{Element{ 495 Name: *rbase.NewNamed("F", ""), 496 Type: rmeta.OffsetL + rmeta.Uint8, 497 Size: 3, 498 ArrLen: 3, 499 ArrDim: 1, 500 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 501 EName: "uint8", 502 }.New()}, 503 }, 504 }, 505 }, 506 { 507 name: "arr-uint16", 508 ptr: &struct { 509 F [3]uint16 510 }{[3]uint16{42, 43, 44}}, 511 si: &StreamerInfo{ 512 named: *rbase.NewNamed("T", "T"), 513 objarr: rcont.NewObjArray(), 514 elems: []rbytes.StreamerElement{ 515 &StreamerBasicType{Element{ 516 Name: *rbase.NewNamed("F", ""), 517 Type: rmeta.OffsetL + rmeta.Uint16, 518 Size: 3 * 2, 519 ArrLen: 3, 520 ArrDim: 1, 521 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 522 EName: "uint16", 523 }.New()}, 524 }, 525 }, 526 }, 527 { 528 name: "arr-uint32", 529 ptr: &struct { 530 F [3]uint32 531 }{[3]uint32{42, 43, 44}}, 532 si: &StreamerInfo{ 533 named: *rbase.NewNamed("T", "T"), 534 objarr: rcont.NewObjArray(), 535 elems: []rbytes.StreamerElement{ 536 &StreamerBasicType{Element{ 537 Name: *rbase.NewNamed("F", ""), 538 Type: rmeta.OffsetL + rmeta.Uint32, 539 Size: 3 * 4, 540 ArrLen: 3, 541 ArrDim: 1, 542 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 543 EName: "uint32", 544 }.New()}, 545 }, 546 }, 547 }, 548 { 549 name: "arr-uint64", 550 ptr: &struct { 551 F [3]uint64 552 }{[3]uint64{42, 43, 44}}, 553 si: &StreamerInfo{ 554 named: *rbase.NewNamed("T", "T"), 555 objarr: rcont.NewObjArray(), 556 elems: []rbytes.StreamerElement{ 557 &StreamerBasicType{Element{ 558 Name: *rbase.NewNamed("F", ""), 559 Type: rmeta.OffsetL + rmeta.Uint64, 560 Size: 3 * 8, 561 ArrLen: 3, 562 ArrDim: 1, 563 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 564 EName: "uint64", 565 }.New()}, 566 }, 567 }, 568 }, 569 { 570 name: "arr-float32", 571 ptr: &struct { 572 F [3]float32 573 }{[3]float32{42, 43, 44}}, 574 si: &StreamerInfo{ 575 named: *rbase.NewNamed("T", "T"), 576 objarr: rcont.NewObjArray(), 577 elems: []rbytes.StreamerElement{ 578 &StreamerBasicType{Element{ 579 Name: *rbase.NewNamed("F", ""), 580 Type: rmeta.OffsetL + rmeta.Float32, 581 Size: 3 * 4, 582 ArrLen: 3, 583 ArrDim: 1, 584 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 585 EName: "float32", 586 }.New()}, 587 }, 588 }, 589 }, 590 { 591 name: "arr-float64", 592 ptr: &struct { 593 F [3]float64 594 }{[3]float64{42, 43, 44}}, 595 si: &StreamerInfo{ 596 named: *rbase.NewNamed("T", "T"), 597 objarr: rcont.NewObjArray(), 598 elems: []rbytes.StreamerElement{ 599 &StreamerBasicType{Element{ 600 Name: *rbase.NewNamed("F", ""), 601 Type: rmeta.OffsetL + rmeta.Float64, 602 Size: 3 * 8, 603 ArrLen: 3, 604 ArrDim: 1, 605 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 606 EName: "float64", 607 }.New()}, 608 }, 609 }, 610 }, 611 { 612 name: "arr-float16", 613 ptr: &struct { 614 F [3]root.Float16 615 }{[3]root.Float16{42, 42, 42}}, 616 si: &StreamerInfo{ 617 named: *rbase.NewNamed("T", "T"), 618 objarr: rcont.NewObjArray(), 619 elems: []rbytes.StreamerElement{ 620 &StreamerBasicType{Element{ 621 Name: *rbase.NewNamed("F", "[3]f/[0,42]"), 622 Type: rmeta.OffsetL + rmeta.Float16, 623 Size: 3 * 2, 624 ArrLen: 3, 625 ArrDim: 1, 626 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 627 EName: "Float16_t", 628 }.New()}, 629 }, 630 }, 631 }, 632 { 633 name: "arr-double32", 634 ptr: &struct { 635 F [3]root.Double32 636 }{[3]root.Double32{42, 42, 42}}, 637 si: &StreamerInfo{ 638 named: *rbase.NewNamed("T", "T"), 639 objarr: rcont.NewObjArray(), 640 elems: []rbytes.StreamerElement{ 641 &StreamerBasicType{Element{ 642 Name: *rbase.NewNamed("F", "[3]/d[0, 42]"), 643 Type: rmeta.OffsetL + rmeta.Double32, 644 Size: 3 * 4, 645 ArrLen: 3, 646 ArrDim: 1, 647 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 648 EName: "Double32_t", 649 }.New()}, 650 }, 651 }, 652 }, 653 { 654 name: "arr-pchar", 655 ptr: &struct { 656 F [3]string 657 }{[3]string{"hello", "world", "Go-HEP"}}, 658 si: &StreamerInfo{ 659 named: *rbase.NewNamed("T", "T"), 660 objarr: rcont.NewObjArray(), 661 elems: []rbytes.StreamerElement{ 662 &StreamerBasicType{Element{ 663 Name: *rbase.NewNamed("F", "[3]"), 664 Type: rmeta.OffsetL + rmeta.CharStar, 665 Size: 3 * 8, 666 ArrLen: 3, 667 ArrDim: 1, 668 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 669 EName: "char*", 670 }.New()}, 671 }, 672 }, 673 }, 674 { 675 name: "arr-TString", 676 ptr: &struct { 677 F [3]string 678 }{[3]string{"hello", "world", "Go-HEP"}}, 679 si: &StreamerInfo{ 680 named: *rbase.NewNamed("T", "T"), 681 objarr: rcont.NewObjArray(), 682 elems: []rbytes.StreamerElement{ 683 &StreamerString{Element{ 684 Name: *rbase.NewNamed("F", "[3]"), 685 Type: rmeta.OffsetL + rmeta.TString, 686 Size: 3 * 24, 687 ArrLen: 3, 688 ArrDim: 1, 689 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 690 EName: "TString", 691 }.New()}, 692 }, 693 }, 694 }, 695 { 696 name: "arr-TObject", 697 ptr: &struct { 698 F [3]rbase.Object 699 }{[3]rbase.Object{*rbase.NewObject(), *rbase.NewObject(), *rbase.NewObject()}}, 700 si: &StreamerInfo{ 701 named: *rbase.NewNamed("T", "T"), 702 objarr: rcont.NewObjArray(), 703 elems: []rbytes.StreamerElement{ 704 &StreamerObject{Element{ 705 Name: *rbase.NewNamed("F", "[3]"), 706 Type: rmeta.OffsetL + rmeta.TObject, 707 Size: 3 * 16, 708 ArrLen: 3, 709 ArrDim: 1, 710 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 711 EName: "TObject", 712 }.New()}, 713 }, 714 }, 715 }, 716 { 717 name: "arr-TNamed", 718 ptr: &struct { 719 F [3]rbase.Named 720 }{[3]rbase.Named{*rbase.NewNamed("n1", "t1"), *rbase.NewNamed("n2", "t2"), *rbase.NewNamed("n3", "t3")}}, 721 si: &StreamerInfo{ 722 named: *rbase.NewNamed("T", "T"), 723 objarr: rcont.NewObjArray(), 724 elems: []rbytes.StreamerElement{ 725 &StreamerObject{Element{ 726 Name: *rbase.NewNamed("F", "[3]"), 727 Type: rmeta.OffsetL + rmeta.TNamed, 728 Size: 3 * 64, 729 ArrLen: 3, 730 ArrDim: 1, 731 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 732 EName: "TNamed", 733 }.New()}, 734 }, 735 }, 736 }, 737 { 738 name: "arr-TObjString", 739 ptr: func() any { 740 type T struct { 741 F [3]rbase.ObjString 742 } 743 return &T{ 744 F: [3]rbase.ObjString{ 745 *rbase.NewObjString("str-1"), 746 *rbase.NewObjString("str-2"), 747 *rbase.NewObjString("str-3"), 748 }, 749 } 750 }(), 751 si: &StreamerInfo{ 752 named: *rbase.NewNamed("T", "T"), 753 objarr: rcont.NewObjArray(), 754 elems: []rbytes.StreamerElement{ 755 &StreamerObject{Element{ 756 Name: *rbase.NewNamed("F", "[3]"), 757 Type: rmeta.OffsetL + rmeta.Object, 758 Size: 3 * 40, 759 ArrLen: 3, 760 ArrDim: 1, 761 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 762 EName: "TObjString", 763 }.New()}, 764 }, 765 }, 766 }, 767 { 768 name: "arr-Pos", 769 ptr: func() any { 770 type Pos struct { 771 X float32 772 Y float64 773 } 774 type T struct { 775 F [3]Pos 776 } 777 return &T{ 778 F: [3]Pos{ 779 {1, 2}, 780 {3, 4}, 781 {5, 6}, 782 }, 783 } 784 }(), 785 si: &StreamerInfo{ 786 named: *rbase.NewNamed("T", "T"), 787 objarr: rcont.NewObjArray(), 788 elems: []rbytes.StreamerElement{ 789 &StreamerObjectAny{Element{ 790 Name: *rbase.NewNamed("F", "[3]"), 791 Type: rmeta.OffsetL + rmeta.Any, 792 Size: 3 * (4 + 8), 793 ArrLen: 3, 794 ArrDim: 1, 795 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 796 EName: "Pos", 797 }.New()}, 798 }, 799 }, 800 deps: []rbytes.StreamerInfo{ 801 &StreamerInfo{ 802 named: *rbase.NewNamed("Pos", "Pos"), 803 objarr: rcont.NewObjArray(), 804 elems: []rbytes.StreamerElement{ 805 &StreamerBasicType{ 806 StreamerElement: Element{ 807 Name: *rbase.NewNamed("X", ""), 808 Type: rmeta.Float32, 809 Size: 4, 810 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 811 EName: "float32", 812 }.New(), 813 }, 814 &StreamerBasicType{ 815 StreamerElement: Element{ 816 Name: *rbase.NewNamed("Y", ""), 817 Type: rmeta.Float64, 818 Size: 8, 819 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 820 EName: "float64", 821 }.New(), 822 }, 823 }, 824 }, 825 }, 826 }, 827 { 828 name: "sli-counter-32", 829 ptr: &struct { 830 N int32 831 F []bool 832 }{3, []bool{true, false, true}}, 833 si: &StreamerInfo{ 834 named: *rbase.NewNamed("T", "T"), 835 objarr: rcont.NewObjArray(), 836 elems: []rbytes.StreamerElement{ 837 &StreamerBasicType{Element{ 838 Name: *rbase.NewNamed("N", ""), 839 Type: rmeta.Counter, 840 Size: 4, 841 EName: "int32", 842 }.New()}, 843 NewStreamerBasicPointer(Element{ 844 Name: *rbase.NewNamed("F", "[N]"), 845 Type: rmeta.OffsetP + rmeta.Bool, 846 Size: 1, 847 EName: "bool*", 848 }.New(), 1, "N", "T"), 849 }, 850 }, 851 }, 852 { 853 name: "sli-counter-64", 854 ptr: &struct { 855 N int64 856 F []bool 857 }{3, []bool{true, false, true}}, 858 si: &StreamerInfo{ 859 named: *rbase.NewNamed("T", "T"), 860 objarr: rcont.NewObjArray(), 861 elems: []rbytes.StreamerElement{ 862 &StreamerBasicType{Element{ 863 Name: *rbase.NewNamed("N", ""), 864 Type: rmeta.Counter, 865 Size: 8, 866 EName: "int64", 867 }.New()}, 868 NewStreamerBasicPointer(Element{ 869 Name: *rbase.NewNamed("F", "[N]"), 870 Type: rmeta.OffsetP + rmeta.Bool, 871 Size: 1, 872 EName: "bool*", 873 }.New(), 1, "N", "T"), 874 }, 875 }, 876 }, 877 { 878 name: "sli-bool", 879 ptr: &struct { 880 N int32 881 F []bool 882 }{3, []bool{true, false, true}}, 883 si: &StreamerInfo{ 884 named: *rbase.NewNamed("T", "T"), 885 objarr: rcont.NewObjArray(), 886 elems: []rbytes.StreamerElement{ 887 &StreamerBasicType{Element{ 888 Name: *rbase.NewNamed("N", ""), 889 Type: rmeta.Int32, 890 Size: 4, 891 EName: "int32", 892 }.New()}, 893 NewStreamerBasicPointer(Element{ 894 Name: *rbase.NewNamed("F", "[N]"), 895 Type: rmeta.OffsetP + rmeta.Bool, 896 Size: 1, 897 EName: "bool*", 898 }.New(), 1, "N", "T"), 899 }, 900 }, 901 }, 902 { 903 name: "sli-int8", 904 ptr: &struct { 905 N int32 906 F []int8 907 }{3, []int8{42, 43, 44}}, 908 si: &StreamerInfo{ 909 named: *rbase.NewNamed("T", "T"), 910 objarr: rcont.NewObjArray(), 911 elems: []rbytes.StreamerElement{ 912 &StreamerBasicType{Element{ 913 Name: *rbase.NewNamed("N", ""), 914 Type: rmeta.Int32, 915 Size: 4, 916 EName: "int32", 917 }.New()}, 918 NewStreamerBasicPointer(Element{ 919 Name: *rbase.NewNamed("F", "[N]"), 920 Type: rmeta.OffsetP + rmeta.Int8, 921 Size: 1, 922 EName: "int8*", 923 }.New(), 1, "N", "T"), 924 }, 925 }, 926 }, 927 { 928 name: "sli-int16", 929 ptr: &struct { 930 N int32 931 F []int16 932 }{3, []int16{42, 43, 44}}, 933 si: &StreamerInfo{ 934 named: *rbase.NewNamed("T", "T"), 935 objarr: rcont.NewObjArray(), 936 elems: []rbytes.StreamerElement{ 937 &StreamerBasicType{Element{ 938 Name: *rbase.NewNamed("N", ""), 939 Type: rmeta.Int32, 940 Size: 4, 941 EName: "int32", 942 }.New()}, 943 NewStreamerBasicPointer(Element{ 944 Name: *rbase.NewNamed("F", "[N]"), 945 Type: rmeta.OffsetP + rmeta.Int16, 946 Size: 2, 947 EName: "int16*", 948 }.New(), 1, "N", "T"), 949 }, 950 }, 951 }, 952 { 953 name: "sli-int32", 954 ptr: &struct { 955 N int32 956 F []int32 957 }{3, []int32{42, 43, 44}}, 958 si: &StreamerInfo{ 959 named: *rbase.NewNamed("T", "T"), 960 objarr: rcont.NewObjArray(), 961 elems: []rbytes.StreamerElement{ 962 &StreamerBasicType{Element{ 963 Name: *rbase.NewNamed("N", ""), 964 Type: rmeta.Int32, 965 Size: 4, 966 EName: "int32", 967 }.New()}, 968 NewStreamerBasicPointer(Element{ 969 Name: *rbase.NewNamed("F", "[N]"), 970 Type: rmeta.OffsetP + rmeta.Int32, 971 Size: 4, 972 EName: "int32*", 973 }.New(), 1, "N", "T"), 974 }, 975 }, 976 }, 977 { 978 name: "sli-int64", 979 ptr: &struct { 980 N int32 981 F []int64 982 }{3, []int64{42, 43, 44}}, 983 si: &StreamerInfo{ 984 named: *rbase.NewNamed("T", "T"), 985 objarr: rcont.NewObjArray(), 986 elems: []rbytes.StreamerElement{ 987 &StreamerBasicType{Element{ 988 Name: *rbase.NewNamed("N", ""), 989 Type: rmeta.Int32, 990 Size: 4, 991 EName: "int32", 992 }.New()}, 993 NewStreamerBasicPointer(Element{ 994 Name: *rbase.NewNamed("F", "[N]"), 995 Type: rmeta.OffsetP + rmeta.Int64, 996 Size: 8, 997 EName: "int64*", 998 }.New(), 1, "N", "T"), 999 }, 1000 }, 1001 }, 1002 { 1003 name: "sli-uint8", 1004 ptr: &struct { 1005 N int32 1006 F []uint8 1007 }{3, []uint8{42, 43, 44}}, 1008 si: &StreamerInfo{ 1009 named: *rbase.NewNamed("T", "T"), 1010 objarr: rcont.NewObjArray(), 1011 elems: []rbytes.StreamerElement{ 1012 &StreamerBasicType{Element{ 1013 Name: *rbase.NewNamed("N", ""), 1014 Type: rmeta.Int32, 1015 Size: 4, 1016 EName: "int32", 1017 }.New()}, 1018 NewStreamerBasicPointer(Element{ 1019 Name: *rbase.NewNamed("F", "[N]"), 1020 Type: rmeta.OffsetP + rmeta.Uint8, 1021 Size: 1, 1022 EName: "uint8*", 1023 }.New(), 1, "N", "T"), 1024 }, 1025 }, 1026 }, 1027 { 1028 name: "sli-uint16", 1029 ptr: &struct { 1030 N int32 1031 F []uint16 1032 }{3, []uint16{42, 43, 44}}, 1033 si: &StreamerInfo{ 1034 named: *rbase.NewNamed("T", "T"), 1035 objarr: rcont.NewObjArray(), 1036 elems: []rbytes.StreamerElement{ 1037 &StreamerBasicType{Element{ 1038 Name: *rbase.NewNamed("N", ""), 1039 Type: rmeta.Int32, 1040 Size: 4, 1041 EName: "int32", 1042 }.New()}, 1043 NewStreamerBasicPointer(Element{ 1044 Name: *rbase.NewNamed("F", "[N]"), 1045 Type: rmeta.OffsetP + rmeta.Uint16, 1046 Size: 2, 1047 EName: "uint16*", 1048 }.New(), 1, "N", "T"), 1049 }, 1050 }, 1051 }, 1052 { 1053 name: "sli-uint32", 1054 ptr: &struct { 1055 N int32 1056 F []uint32 1057 }{3, []uint32{42, 43, 44}}, 1058 si: &StreamerInfo{ 1059 named: *rbase.NewNamed("T", "T"), 1060 objarr: rcont.NewObjArray(), 1061 elems: []rbytes.StreamerElement{ 1062 &StreamerBasicType{Element{ 1063 Name: *rbase.NewNamed("N", ""), 1064 Type: rmeta.Int32, 1065 Size: 4, 1066 EName: "int32", 1067 }.New()}, 1068 NewStreamerBasicPointer(Element{ 1069 Name: *rbase.NewNamed("F", "[N]"), 1070 Type: rmeta.OffsetP + rmeta.Uint32, 1071 Size: 4, 1072 EName: "uint32*", 1073 }.New(), 1, "N", "T"), 1074 }, 1075 }, 1076 }, 1077 { 1078 name: "sli-uint64", 1079 ptr: &struct { 1080 N int32 1081 F []uint64 1082 }{3, []uint64{42, 43, 44}}, 1083 si: &StreamerInfo{ 1084 named: *rbase.NewNamed("T", "T"), 1085 objarr: rcont.NewObjArray(), 1086 elems: []rbytes.StreamerElement{ 1087 &StreamerBasicType{Element{ 1088 Name: *rbase.NewNamed("N", ""), 1089 Type: rmeta.Int32, 1090 Size: 4, 1091 EName: "int32", 1092 }.New()}, 1093 NewStreamerBasicPointer(Element{ 1094 Name: *rbase.NewNamed("F", "[N]"), 1095 Type: rmeta.OffsetP + rmeta.Uint64, 1096 Size: 8, 1097 EName: "uint64*", 1098 }.New(), 1, "N", "T"), 1099 }, 1100 }, 1101 }, 1102 { 1103 name: "sli-float32", 1104 ptr: &struct { 1105 N int32 1106 F []float32 1107 }{3, []float32{42, 43, 44}}, 1108 si: &StreamerInfo{ 1109 named: *rbase.NewNamed("T", "T"), 1110 objarr: rcont.NewObjArray(), 1111 elems: []rbytes.StreamerElement{ 1112 &StreamerBasicType{Element{ 1113 Name: *rbase.NewNamed("N", ""), 1114 Type: rmeta.Int32, 1115 Size: 4, 1116 EName: "int32", 1117 }.New()}, 1118 NewStreamerBasicPointer(Element{ 1119 Name: *rbase.NewNamed("F", "[N]"), 1120 Type: rmeta.OffsetP + rmeta.Float32, 1121 Size: 4, 1122 EName: "float32*", 1123 }.New(), 1, "N", "T"), 1124 }, 1125 }, 1126 }, 1127 { 1128 name: "sli-float64", 1129 ptr: &struct { 1130 N int32 1131 F []float64 1132 }{3, []float64{42, 43, 44}}, 1133 si: &StreamerInfo{ 1134 named: *rbase.NewNamed("T", "T"), 1135 objarr: rcont.NewObjArray(), 1136 elems: []rbytes.StreamerElement{ 1137 &StreamerBasicType{Element{ 1138 Name: *rbase.NewNamed("N", ""), 1139 Type: rmeta.Int32, 1140 Size: 4, 1141 EName: "int32", 1142 }.New()}, 1143 NewStreamerBasicPointer(Element{ 1144 Name: *rbase.NewNamed("F", "[N]"), 1145 Type: rmeta.OffsetP + rmeta.Float64, 1146 Size: 8, 1147 EName: "float64*", 1148 }.New(), 1, "N", "T"), 1149 }, 1150 }, 1151 }, 1152 { 1153 name: "sli-float16", 1154 ptr: &struct { 1155 N int32 1156 F []root.Float16 1157 }{3, []root.Float16{42, 42, 42}}, 1158 si: &StreamerInfo{ 1159 named: *rbase.NewNamed("T", "T"), 1160 objarr: rcont.NewObjArray(), 1161 elems: []rbytes.StreamerElement{ 1162 &StreamerBasicType{Element{ 1163 Name: *rbase.NewNamed("N", ""), 1164 Type: rmeta.Int32, 1165 Size: 4, 1166 EName: "int32", 1167 }.New()}, 1168 NewStreamerBasicPointer(Element{ 1169 Name: *rbase.NewNamed("F", "[N]/f[0,42]"), 1170 Type: rmeta.OffsetP + rmeta.Float16, 1171 Size: 2, 1172 EName: "Float16_t*", 1173 }.New(), 1, "N", "T"), 1174 }, 1175 }, 1176 }, 1177 { 1178 name: "sli-double32", 1179 ptr: &struct { 1180 N int32 1181 F []root.Double32 1182 }{3, []root.Double32{42, 42, 42}}, 1183 si: &StreamerInfo{ 1184 named: *rbase.NewNamed("T", "T"), 1185 objarr: rcont.NewObjArray(), 1186 elems: []rbytes.StreamerElement{ 1187 &StreamerBasicType{Element{ 1188 Name: *rbase.NewNamed("N", ""), 1189 Type: rmeta.Int32, 1190 Size: 4, 1191 EName: "int32", 1192 }.New()}, 1193 NewStreamerBasicPointer(Element{ 1194 Name: *rbase.NewNamed("F", "[N]/d[0,42]"), 1195 Type: rmeta.OffsetP + rmeta.Double32, 1196 Size: 4, 1197 EName: "Double32_t*", 1198 }.New(), 1, "N", "T"), 1199 }, 1200 }, 1201 }, 1202 { 1203 name: "sli-pchar", 1204 ptr: &struct { 1205 N int32 1206 F []string 1207 }{3, []string{"s11", "s222", "s333"}}, 1208 si: &StreamerInfo{ 1209 named: *rbase.NewNamed("T", "T"), 1210 objarr: rcont.NewObjArray(), 1211 elems: []rbytes.StreamerElement{ 1212 &StreamerBasicType{Element{ 1213 Name: *rbase.NewNamed("N", ""), 1214 Type: rmeta.Int32, 1215 Size: 4, 1216 EName: "int32", 1217 }.New()}, 1218 NewStreamerBasicPointer(Element{ 1219 Name: *rbase.NewNamed("F", "[N]"), 1220 Type: rmeta.OffsetP + rmeta.CharStar, 1221 Size: 4, 1222 EName: "char**", 1223 }.New(), 1, "N", "T"), 1224 }, 1225 }, 1226 }, 1227 { 1228 name: "sli-TString", 1229 ptr: &struct { 1230 N int32 1231 F []string 1232 }{3, []string{"s1", "s2", "s3"}}, 1233 si: &StreamerInfo{ 1234 named: *rbase.NewNamed("T", "T"), 1235 objarr: rcont.NewObjArray(), 1236 elems: []rbytes.StreamerElement{ 1237 &StreamerBasicType{Element{ 1238 Name: *rbase.NewNamed("N", ""), 1239 Type: rmeta.Int32, 1240 Size: 4, 1241 EName: "int32", 1242 }.New()}, 1243 NewStreamerLoop(Element{ 1244 Name: *rbase.NewNamed("F", "[N]"), 1245 Size: 4, 1246 EName: "TString*", 1247 }.New(), 1, "N", "T"), 1248 }, 1249 }, 1250 }, 1251 { 1252 name: "sli-TObject", 1253 ptr: &struct { 1254 N int32 1255 F []rbase.Object 1256 }{3, []rbase.Object{*rbase.NewObject(), *rbase.NewObject(), *rbase.NewObject()}}, 1257 si: &StreamerInfo{ 1258 named: *rbase.NewNamed("T", "T"), 1259 objarr: rcont.NewObjArray(), 1260 elems: []rbytes.StreamerElement{ 1261 &StreamerBasicType{Element{ 1262 Name: *rbase.NewNamed("N", ""), 1263 Type: rmeta.Int32, 1264 Size: 4, 1265 EName: "int32", 1266 }.New()}, 1267 NewStreamerLoop(Element{ 1268 Name: *rbase.NewNamed("F", "[N]"), 1269 Size: 4, 1270 EName: "TObject*", 1271 }.New(), 1, "N", "T"), 1272 }, 1273 }, 1274 }, 1275 { 1276 name: "sli-TNamed", 1277 ptr: &struct { 1278 N int32 1279 F []rbase.Named 1280 }{3, []rbase.Named{*rbase.NewNamed("s1", "t1"), *rbase.NewNamed("s2", "t2"), *rbase.NewNamed("s3", "t3")}}, 1281 si: &StreamerInfo{ 1282 named: *rbase.NewNamed("T", "T"), 1283 objarr: rcont.NewObjArray(), 1284 elems: []rbytes.StreamerElement{ 1285 &StreamerBasicType{Element{ 1286 Name: *rbase.NewNamed("N", ""), 1287 Type: rmeta.Int32, 1288 Size: 4, 1289 EName: "int32", 1290 }.New()}, 1291 NewStreamerLoop(Element{ 1292 Name: *rbase.NewNamed("F", "[N]"), 1293 Size: 4, 1294 EName: "TNamed*", 1295 }.New(), 1, "N", "T"), 1296 }, 1297 }, 1298 }, 1299 { 1300 name: "sli-Pos", 1301 ptr: func() any { 1302 type Pos struct { 1303 Px float32 1304 Py float64 1305 } 1306 type T struct { 1307 N int32 1308 Ps []Pos `groot:"Ps[N]"` 1309 } 1310 return &T{ 1311 N: 2, 1312 Ps: []Pos{{1, 2}, {3, 4}}, 1313 } 1314 }(), 1315 si: &StreamerInfo{ 1316 named: *rbase.NewNamed("T", "T"), 1317 objarr: rcont.NewObjArray(), 1318 elems: []rbytes.StreamerElement{ 1319 &StreamerBasicType{Element{ 1320 Name: *rbase.NewNamed("N", ""), 1321 Type: rmeta.Int32, 1322 Size: 4, 1323 EName: "int32", 1324 }.New()}, 1325 NewStreamerLoop(Element{ 1326 Name: *rbase.NewNamed("Ps", "[N]"), 1327 Size: 4, 1328 EName: "Pos*", 1329 }.New(), 1, "N", "T"), 1330 }, 1331 }, 1332 deps: []rbytes.StreamerInfo{ 1333 &StreamerInfo{ 1334 named: *rbase.NewNamed("Pos", "Pos"), 1335 objarr: rcont.NewObjArray(), 1336 elems: []rbytes.StreamerElement{ 1337 &StreamerBasicType{ 1338 StreamerElement: Element{ 1339 Name: *rbase.NewNamed("Px", ""), 1340 Type: rmeta.Float32, 1341 Size: 4, 1342 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1343 EName: "float32", 1344 }.New(), 1345 }, 1346 &StreamerBasicType{ 1347 StreamerElement: Element{ 1348 Name: *rbase.NewNamed("Py", ""), 1349 Type: rmeta.Float64, 1350 Size: 8, 1351 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1352 EName: "float64", 1353 }.New(), 1354 }, 1355 }, 1356 }, 1357 }, 1358 }, 1359 { 1360 name: "std-string", 1361 ptr: &struct { 1362 F string 1363 }{"hello"}, 1364 si: &StreamerInfo{ 1365 named: *rbase.NewNamed("T", "T"), 1366 objarr: rcont.NewObjArray(), 1367 elems: []rbytes.StreamerElement{ 1368 &StreamerSTLstring{ 1369 StreamerSTL: StreamerSTL{ 1370 StreamerElement: Element{ 1371 Name: *rbase.NewNamed("F", ""), 1372 Type: rmeta.Streamer, 1373 Size: 32, 1374 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1375 EName: "string", 1376 }.New(), 1377 vtype: rmeta.ESTLType(rmeta.STLstring), 1378 ctype: rmeta.STLstring, 1379 }, 1380 }, 1381 }, 1382 }, 1383 }, 1384 { 1385 name: "std::vector<bool>", 1386 ptr: &struct { 1387 F []bool 1388 }{[]bool{true, false, true}}, 1389 si: &StreamerInfo{ 1390 named: *rbase.NewNamed("T", "T"), 1391 objarr: rcont.NewObjArray(), 1392 elems: []rbytes.StreamerElement{ 1393 NewCxxStreamerSTL(Element{ 1394 Name: *rbase.NewNamed("F", ""), 1395 Type: rmeta.Streamer, 1396 Size: 24, 1397 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1398 EName: "vector<bool>", 1399 }.New(), rmeta.STLvector, rmeta.Bool), 1400 }, 1401 }, 1402 }, 1403 { 1404 name: "std::vector<int8>", 1405 ptr: &struct { 1406 F []int8 1407 }{[]int8{1, 2, 3}}, 1408 si: &StreamerInfo{ 1409 named: *rbase.NewNamed("T", "T"), 1410 objarr: rcont.NewObjArray(), 1411 elems: []rbytes.StreamerElement{ 1412 NewCxxStreamerSTL(Element{ 1413 Name: *rbase.NewNamed("F", ""), 1414 Type: rmeta.Streamer, 1415 Size: 24, 1416 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1417 EName: "vector<int8>", 1418 }.New(), rmeta.STLvector, rmeta.Int8), 1419 }, 1420 }, 1421 }, 1422 { 1423 name: "std::vector<int16>", 1424 ptr: &struct { 1425 F []int16 1426 }{[]int16{1, 2, 3}}, 1427 si: &StreamerInfo{ 1428 named: *rbase.NewNamed("T", "T"), 1429 objarr: rcont.NewObjArray(), 1430 elems: []rbytes.StreamerElement{ 1431 NewCxxStreamerSTL(Element{ 1432 Name: *rbase.NewNamed("F", ""), 1433 Type: rmeta.Streamer, 1434 Size: 24, 1435 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1436 EName: "vector<int16>", 1437 }.New(), rmeta.STLvector, rmeta.Int16), 1438 }, 1439 }, 1440 }, 1441 { 1442 name: "std::vector<int32>", 1443 ptr: &struct { 1444 F []int32 1445 }{[]int32{1, 2, 3}}, 1446 si: &StreamerInfo{ 1447 named: *rbase.NewNamed("T", "T"), 1448 objarr: rcont.NewObjArray(), 1449 elems: []rbytes.StreamerElement{ 1450 NewCxxStreamerSTL(Element{ 1451 Name: *rbase.NewNamed("F", ""), 1452 Type: rmeta.Streamer, 1453 Size: 24, 1454 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1455 EName: "vector<int32>", 1456 }.New(), rmeta.STLvector, rmeta.Int32), 1457 }, 1458 }, 1459 }, 1460 { 1461 name: "std::vector<int64>", 1462 ptr: &struct { 1463 F []int64 1464 }{[]int64{1, 2, 3}}, 1465 si: &StreamerInfo{ 1466 named: *rbase.NewNamed("T", "T"), 1467 objarr: rcont.NewObjArray(), 1468 elems: []rbytes.StreamerElement{ 1469 NewCxxStreamerSTL(Element{ 1470 Name: *rbase.NewNamed("F", ""), 1471 Type: rmeta.Streamer, 1472 Size: 24, 1473 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1474 EName: "vector<int64>", 1475 }.New(), rmeta.STLvector, rmeta.Int64), 1476 }, 1477 }, 1478 }, 1479 { 1480 name: "std::vector<uint8>", 1481 ptr: &struct { 1482 F []uint8 1483 }{[]uint8{1, 2, 3}}, 1484 si: &StreamerInfo{ 1485 named: *rbase.NewNamed("T", "T"), 1486 objarr: rcont.NewObjArray(), 1487 elems: []rbytes.StreamerElement{ 1488 NewCxxStreamerSTL(Element{ 1489 Name: *rbase.NewNamed("F", ""), 1490 Type: rmeta.Streamer, 1491 Size: 24, 1492 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1493 EName: "vector<uint8>", 1494 }.New(), rmeta.STLvector, rmeta.Uint8), 1495 }, 1496 }, 1497 }, 1498 { 1499 name: "std::vector<uint16>", 1500 ptr: &struct { 1501 F []uint16 1502 }{[]uint16{1, 2, 3}}, 1503 si: &StreamerInfo{ 1504 named: *rbase.NewNamed("T", "T"), 1505 objarr: rcont.NewObjArray(), 1506 elems: []rbytes.StreamerElement{ 1507 NewCxxStreamerSTL(Element{ 1508 Name: *rbase.NewNamed("F", ""), 1509 Type: rmeta.Streamer, 1510 Size: 24, 1511 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1512 EName: "vector<uint16>", 1513 }.New(), rmeta.STLvector, rmeta.Uint16), 1514 }, 1515 }, 1516 }, 1517 { 1518 name: "std::vector<uint32>", 1519 ptr: &struct { 1520 F []uint32 1521 }{[]uint32{1, 2, 3}}, 1522 si: &StreamerInfo{ 1523 named: *rbase.NewNamed("T", "T"), 1524 objarr: rcont.NewObjArray(), 1525 elems: []rbytes.StreamerElement{ 1526 NewCxxStreamerSTL(Element{ 1527 Name: *rbase.NewNamed("F", ""), 1528 Type: rmeta.Streamer, 1529 Size: 24, 1530 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1531 EName: "vector<uint32>", 1532 }.New(), rmeta.STLvector, rmeta.Uint32), 1533 }, 1534 }, 1535 }, 1536 { 1537 name: "std::vector<uint64>", 1538 ptr: &struct { 1539 F []uint64 1540 }{[]uint64{1, 2, 3}}, 1541 si: &StreamerInfo{ 1542 named: *rbase.NewNamed("T", "T"), 1543 objarr: rcont.NewObjArray(), 1544 elems: []rbytes.StreamerElement{ 1545 NewCxxStreamerSTL(Element{ 1546 Name: *rbase.NewNamed("F", ""), 1547 Type: rmeta.Streamer, 1548 Size: 24, 1549 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1550 EName: "vector<uint64>", 1551 }.New(), rmeta.STLvector, rmeta.Uint64), 1552 }, 1553 }, 1554 }, 1555 { 1556 name: "std::vector<float32>", 1557 ptr: &struct { 1558 F []float32 1559 }{[]float32{1, 2, 3}}, 1560 si: &StreamerInfo{ 1561 named: *rbase.NewNamed("T", "T"), 1562 objarr: rcont.NewObjArray(), 1563 elems: []rbytes.StreamerElement{ 1564 NewCxxStreamerSTL(Element{ 1565 Name: *rbase.NewNamed("F", ""), 1566 Type: rmeta.Streamer, 1567 Size: 24, 1568 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1569 EName: "vector<float32>", 1570 }.New(), rmeta.STLvector, rmeta.Float32), 1571 }, 1572 }, 1573 }, 1574 { 1575 name: "std::vector<float64>", 1576 ptr: &struct { 1577 F []float64 1578 }{[]float64{1, 2, 3}}, 1579 si: &StreamerInfo{ 1580 named: *rbase.NewNamed("T", "T"), 1581 objarr: rcont.NewObjArray(), 1582 elems: []rbytes.StreamerElement{ 1583 NewCxxStreamerSTL(Element{ 1584 Name: *rbase.NewNamed("F", ""), 1585 Type: rmeta.Streamer, 1586 Size: 24, 1587 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1588 EName: "vector<float64>", 1589 }.New(), rmeta.STLvector, rmeta.Float64), 1590 }, 1591 }, 1592 }, 1593 { 1594 name: "std::vector<TString>", 1595 ptr: &struct { 1596 F []string 1597 }{[]string{"hello", "world", "Go-HEP"}}, 1598 si: &StreamerInfo{ 1599 named: *rbase.NewNamed("T", "T"), 1600 objarr: rcont.NewObjArray(), 1601 elems: []rbytes.StreamerElement{ 1602 NewCxxStreamerSTL(Element{ 1603 Name: *rbase.NewNamed("F", ""), 1604 Type: rmeta.Streamer, 1605 Size: 24, 1606 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1607 EName: "vector<TString>", 1608 }.New(), rmeta.STLvector, rmeta.TString), 1609 }, 1610 }, 1611 }, 1612 { 1613 name: "std::vector<TObject>", 1614 ptr: &struct { 1615 F []rbase.Object 1616 }{[]rbase.Object{*rbase.NewObject(), *rbase.NewObject(), *rbase.NewObject()}}, 1617 si: &StreamerInfo{ 1618 named: *rbase.NewNamed("T", "T"), 1619 objarr: rcont.NewObjArray(), 1620 elems: []rbytes.StreamerElement{ 1621 NewCxxStreamerSTL(Element{ 1622 Name: *rbase.NewNamed("F", ""), 1623 Type: rmeta.Streamer, 1624 Size: 24, 1625 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1626 EName: "vector<TObject>", 1627 }.New(), rmeta.STLvector, rmeta.TObject), 1628 }, 1629 }, 1630 }, 1631 { 1632 name: "std::vector<TNamed>", 1633 ptr: &struct { 1634 F []rbase.Named 1635 }{[]rbase.Named{*rbase.NewNamed("v1", "t1"), *rbase.NewNamed("v2", "t2"), *rbase.NewNamed("v3", "t3")}}, 1636 si: &StreamerInfo{ 1637 named: *rbase.NewNamed("T", "T"), 1638 objarr: rcont.NewObjArray(), 1639 elems: []rbytes.StreamerElement{ 1640 NewCxxStreamerSTL(Element{ 1641 Name: *rbase.NewNamed("F", ""), 1642 Type: rmeta.Streamer, 1643 Size: 24, 1644 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1645 EName: "vector<TNamed>", 1646 }.New(), rmeta.STLvector, rmeta.TNamed), 1647 }, 1648 }, 1649 }, 1650 { 1651 name: "std::vector<string>", 1652 ptr: &struct { 1653 F []string 1654 }{[]string{"hello", "world", "Go-HEP"}}, 1655 si: &StreamerInfo{ 1656 named: *rbase.NewNamed("T", "T"), 1657 objarr: rcont.NewObjArray(), 1658 elems: []rbytes.StreamerElement{ 1659 NewCxxStreamerSTL(Element{ 1660 Name: *rbase.NewNamed("F", ""), 1661 Type: rmeta.Streamer, 1662 Size: 24, 1663 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1664 EName: "vector<TString>", 1665 }.New(), rmeta.STLvector, rmeta.STLstring), 1666 }, 1667 }, 1668 }, 1669 { 1670 name: "std::bitset<32>", 1671 ptr: &struct { 1672 F []byte 1673 }{[]byte{ 1674 1, 0, 0, 0, 1675 0, 1, 0, 0, 1676 0, 0, 1, 0, 1677 0, 0, 0, 1, 1678 1, 1, 1, 0, 1679 1, 1, 0, 1, 1680 1, 0, 1, 1, 1681 0, 1, 1, 1, 1682 }}, 1683 si: &StreamerInfo{ 1684 named: *rbase.NewNamed("T", "T"), 1685 objarr: rcont.NewObjArray(), 1686 elems: []rbytes.StreamerElement{ 1687 NewCxxStreamerSTL(Element{ 1688 Name: *rbase.NewNamed("F", ""), 1689 Type: rmeta.Streamer, 1690 Size: 32, 1691 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1692 EName: "bitset<32>", 1693 }.New(), rmeta.STLbitset, rmeta.Base), 1694 }, 1695 }, 1696 }, 1697 { 1698 name: "std::vector<std::bitset<32> >", 1699 ptr: &struct { 1700 F [][]byte 1701 }{[][]byte{{0, 0, 0, 1}, {1, 0, 0, 1}, {1, 1, 0, 0}}}, 1702 si: &StreamerInfo{ 1703 named: *rbase.NewNamed("T", "T"), 1704 objarr: rcont.NewObjArray(), 1705 elems: []rbytes.StreamerElement{ 1706 NewCxxStreamerSTL(Element{ 1707 Name: *rbase.NewNamed("F", ""), 1708 Type: rmeta.Streamer, 1709 Size: 24, 1710 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1711 EName: "vector<bitset<4> >", 1712 }.New(), rmeta.STLvector, rmeta.Base), 1713 }, 1714 }, 1715 }, 1716 { 1717 name: "std::bitset<32>-rmeta-stl", 1718 ptr: &struct { 1719 F []byte 1720 }{[]byte{ 1721 1, 0, 0, 0, 1722 0, 1, 0, 0, 1723 0, 0, 1, 0, 1724 0, 0, 0, 1, 1725 1, 1, 1, 0, 1726 1, 1, 0, 1, 1727 1, 0, 1, 1, 1728 0, 1, 1, 1, 1729 }}, 1730 si: &StreamerInfo{ 1731 named: *rbase.NewNamed("T", "T"), 1732 objarr: rcont.NewObjArray(), 1733 elems: []rbytes.StreamerElement{ 1734 NewCxxStreamerSTL(Element{ 1735 Name: *rbase.NewNamed("F", ""), 1736 Type: rmeta.STL, 1737 Size: 32, 1738 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1739 EName: "bitset<32>", 1740 }.New(), rmeta.STLbitset, rmeta.Base), 1741 }, 1742 }, 1743 }, 1744 { 1745 name: "std::vector<std::bitset<32> >-rmeta-stl", 1746 ptr: &struct { 1747 F [][]byte 1748 }{[][]byte{{0, 0, 0, 1}, {1, 0, 0, 1}, {1, 1, 0, 0}}}, 1749 si: &StreamerInfo{ 1750 named: *rbase.NewNamed("T", "T"), 1751 objarr: rcont.NewObjArray(), 1752 elems: []rbytes.StreamerElement{ 1753 NewCxxStreamerSTL(Element{ 1754 Name: *rbase.NewNamed("F", ""), 1755 Type: rmeta.STL, 1756 Size: 24, 1757 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1758 EName: "vector<bitset<4> >", 1759 }.New(), rmeta.STLvector, rmeta.Base), 1760 }, 1761 }, 1762 }, 1763 { 1764 name: "particle", 1765 ptr: func() any { 1766 type P2 struct { 1767 Px float32 `groot:"px"` 1768 Py float64 `groot:"py"` 1769 } 1770 type Particle struct { 1771 Pos P2 `groot:"pos"` 1772 Name string `groot:"name"` 1773 } 1774 return &Particle{Pos: P2{42, 66}, Name: "HEP"} 1775 }(), 1776 si: &StreamerInfo{ 1777 named: *rbase.NewNamed("T", "T"), 1778 objarr: rcont.NewObjArray(), 1779 elems: []rbytes.StreamerElement{ 1780 &StreamerObjectAny{ 1781 StreamerElement: Element{ 1782 Name: *rbase.NewNamed("pos", ""), 1783 Type: rmeta.Any, 1784 Size: 4 + 8, 1785 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1786 EName: "P2", 1787 }.New(), 1788 }, 1789 &StreamerString{Element{ 1790 Name: *rbase.NewNamed("name", ""), 1791 Type: rmeta.TString, 1792 Size: 24, 1793 EName: "TString", 1794 }.New()}, 1795 }, 1796 }, 1797 deps: []rbytes.StreamerInfo{ 1798 &StreamerInfo{ 1799 named: *rbase.NewNamed("P2", "P2"), 1800 objarr: rcont.NewObjArray(), 1801 elems: []rbytes.StreamerElement{ 1802 &StreamerBasicType{ 1803 StreamerElement: Element{ 1804 Name: *rbase.NewNamed("px", ""), 1805 Type: rmeta.Float32, 1806 Size: 4, 1807 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1808 EName: "float32", 1809 }.New(), 1810 }, 1811 &StreamerBasicType{ 1812 StreamerElement: Element{ 1813 Name: *rbase.NewNamed("py", ""), 1814 Type: rmeta.Float64, 1815 Size: 8, 1816 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1817 EName: "float64", 1818 }.New(), 1819 }, 1820 }, 1821 }, 1822 }, 1823 }, 1824 { 1825 name: "event-objstring", 1826 ptr: func() any { 1827 type Particle struct { 1828 Name rbase.ObjString 1829 } 1830 type T struct { 1831 P Particle 1832 } 1833 return &T{ 1834 P: Particle{ 1835 Name: *rbase.NewObjString("part-1"), 1836 }, 1837 } 1838 }(), 1839 si: &StreamerInfo{ 1840 named: *rbase.NewNamed("T", "T"), 1841 objarr: rcont.NewObjArray(), 1842 elems: []rbytes.StreamerElement{ 1843 &StreamerObjectAny{ 1844 StreamerElement: Element{ 1845 Name: *rbase.NewNamed("P", ""), 1846 Type: rmeta.Any, 1847 Size: 40, 1848 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1849 EName: "Particle", 1850 }.New(), 1851 }, 1852 }, 1853 }, 1854 deps: []rbytes.StreamerInfo{ 1855 &StreamerInfo{ 1856 named: *rbase.NewNamed("Particle", "Particle"), 1857 objarr: rcont.NewObjArray(), 1858 elems: []rbytes.StreamerElement{ 1859 &StreamerObject{ 1860 StreamerElement: Element{ 1861 Name: *rbase.NewNamed("Name", ""), 1862 Type: rmeta.Object, 1863 Size: 40, 1864 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1865 EName: "TObjString", 1866 }.New(), 1867 }, 1868 }, 1869 }, 1870 }, 1871 }, 1872 { 1873 name: "event-particle", 1874 ptr: func() any { 1875 type P2 struct { 1876 Px float32 `groot:"px"` 1877 Py float64 `groot:"py"` 1878 } 1879 type Particle struct { 1880 Pos P2 `groot:"pos"` 1881 Name string `groot:"name"` 1882 } 1883 type T struct { 1884 Particle Particle `groot:"particle"` 1885 } 1886 return &T{ 1887 Particle: Particle{Pos: P2{142, 166}, Name: "HEP-1"}, 1888 } 1889 }(), 1890 si: &StreamerInfo{ 1891 named: *rbase.NewNamed("T", "T"), 1892 objarr: rcont.NewObjArray(), 1893 elems: []rbytes.StreamerElement{ 1894 &StreamerObjectAny{ 1895 StreamerElement: Element{ 1896 Name: *rbase.NewNamed("particle", ""), 1897 Type: rmeta.Any, 1898 Size: 4 + 8 + 24, 1899 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1900 EName: "Particle", 1901 }.New(), 1902 }, 1903 }, 1904 }, 1905 deps: []rbytes.StreamerInfo{ 1906 &StreamerInfo{ 1907 named: *rbase.NewNamed("Particle", "Particle"), 1908 objarr: rcont.NewObjArray(), 1909 elems: []rbytes.StreamerElement{ 1910 &StreamerObjectAny{ 1911 StreamerElement: Element{ 1912 Name: *rbase.NewNamed("pos", ""), 1913 Type: rmeta.Any, 1914 Size: 4 + 8, 1915 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1916 EName: "P2", 1917 }.New(), 1918 }, 1919 &StreamerString{Element{ 1920 Name: *rbase.NewNamed("name", ""), 1921 Type: rmeta.TString, 1922 Size: 24, 1923 EName: "TString", 1924 }.New()}, 1925 }, 1926 }, 1927 &StreamerInfo{ 1928 named: *rbase.NewNamed("P2", "P2"), 1929 objarr: rcont.NewObjArray(), 1930 elems: []rbytes.StreamerElement{ 1931 &StreamerBasicType{ 1932 StreamerElement: Element{ 1933 Name: *rbase.NewNamed("px", ""), 1934 Type: rmeta.Float32, 1935 Size: 4, 1936 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1937 EName: "float32", 1938 }.New(), 1939 }, 1940 &StreamerBasicType{ 1941 StreamerElement: Element{ 1942 Name: *rbase.NewNamed("py", ""), 1943 Type: rmeta.Float64, 1944 Size: 8, 1945 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1946 EName: "float64", 1947 }.New(), 1948 }, 1949 }, 1950 }, 1951 }, 1952 }, 1953 { 1954 name: "std::vector<P2>", 1955 ptr: func() any { 1956 type P2 struct { 1957 Px float32 1958 Py float64 1959 } 1960 type T struct { 1961 F []P2 1962 } 1963 return &T{ 1964 F: []P2{{1, 2}, {3, 4}}, 1965 } 1966 }(), 1967 si: &StreamerInfo{ 1968 named: *rbase.NewNamed("T", "T"), 1969 objarr: rcont.NewObjArray(), 1970 elems: []rbytes.StreamerElement{ 1971 NewCxxStreamerSTL(Element{ 1972 Name: *rbase.NewNamed("F", ""), 1973 Type: rmeta.Streamer, 1974 Size: 24, 1975 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1976 EName: "vector<P2>", 1977 }.New(), rmeta.STLvector, rmeta.Any), 1978 }, 1979 }, 1980 deps: []rbytes.StreamerInfo{ 1981 &StreamerInfo{ 1982 named: *rbase.NewNamed("P2", "P2"), 1983 objarr: rcont.NewObjArray(), 1984 elems: []rbytes.StreamerElement{ 1985 &StreamerBasicType{ 1986 StreamerElement: Element{ 1987 Name: *rbase.NewNamed("px", ""), 1988 Type: rmeta.Float32, 1989 Size: 4, 1990 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 1991 EName: "float32", 1992 }.New(), 1993 }, 1994 &StreamerBasicType{ 1995 StreamerElement: Element{ 1996 Name: *rbase.NewNamed("py", ""), 1997 Type: rmeta.Float64, 1998 Size: 8, 1999 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2000 EName: "float64", 2001 }.New(), 2002 }, 2003 }, 2004 }, 2005 }, 2006 }, 2007 { 2008 name: "event-std::vector<particle>", 2009 ptr: func() any { 2010 type P2 struct { 2011 Px float32 `groot:"px"` 2012 Py float64 `groot:"py"` 2013 } 2014 type Particle struct { 2015 Pos []P2 `groot:"pos"` 2016 Name string `groot:"name"` 2017 } 2018 type T struct { 2019 Particles []Particle `groot:"particles"` 2020 } 2021 return &T{ 2022 Particles: []Particle{ 2023 {Pos: []P2{{142, 166}, {143, 167}}, Name: "HEP-1"}, 2024 {Pos: []P2{{242, 266}, {}, {243, 267}}, Name: "HEP-2"}, 2025 }, 2026 } 2027 }(), 2028 si: &StreamerInfo{ 2029 named: *rbase.NewNamed("T", "T"), 2030 objarr: rcont.NewObjArray(), 2031 elems: []rbytes.StreamerElement{ 2032 NewCxxStreamerSTL(Element{ 2033 Name: *rbase.NewNamed("particles", ""), 2034 Type: rmeta.Streamer, 2035 Size: 24, 2036 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2037 EName: "vector<Particle>", 2038 }.New(), rmeta.STLvector, rmeta.Any), 2039 }, 2040 }, 2041 deps: []rbytes.StreamerInfo{ 2042 &StreamerInfo{ 2043 named: *rbase.NewNamed("Particle", "Particle"), 2044 objarr: rcont.NewObjArray(), 2045 elems: []rbytes.StreamerElement{ 2046 NewCxxStreamerSTL(Element{ 2047 Name: *rbase.NewNamed("pos", ""), 2048 Type: rmeta.Streamer, 2049 Size: 24, 2050 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2051 EName: "vector<P2>", 2052 }.New(), rmeta.STLvector, rmeta.Any), 2053 &StreamerString{Element{ 2054 Name: *rbase.NewNamed("name", ""), 2055 Type: rmeta.TString, 2056 Size: 24, 2057 EName: "TString", 2058 }.New()}, 2059 }, 2060 }, 2061 &StreamerInfo{ 2062 named: *rbase.NewNamed("P2", "P2"), 2063 objarr: rcont.NewObjArray(), 2064 elems: []rbytes.StreamerElement{ 2065 &StreamerBasicType{ 2066 StreamerElement: Element{ 2067 Name: *rbase.NewNamed("px", ""), 2068 Type: rmeta.Float32, 2069 Size: 4, 2070 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2071 EName: "float32", 2072 }.New(), 2073 }, 2074 &StreamerBasicType{ 2075 StreamerElement: Element{ 2076 Name: *rbase.NewNamed("py", ""), 2077 Type: rmeta.Float64, 2078 Size: 8, 2079 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2080 EName: "float64", 2081 }.New(), 2082 }, 2083 }, 2084 }, 2085 }, 2086 }, 2087 { 2088 name: "base-object", 2089 ptr: func() any { 2090 type T struct { 2091 rbase.Object `groot:",base"` 2092 F1 float64 2093 } 2094 return &T{Object: *rbase.NewObject(), F1: 42} 2095 }(), 2096 si: &StreamerInfo{ 2097 named: *rbase.NewNamed("T", "T"), 2098 objarr: rcont.NewObjArray(), 2099 elems: []rbytes.StreamerElement{ 2100 &StreamerBase{ 2101 StreamerElement: Element{ 2102 Name: *rbase.NewNamed("TObject", ""), 2103 Type: rmeta.Base, 2104 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2105 EName: "BASE", 2106 }.New(), 2107 vbase: rvers.Named, 2108 }, 2109 &StreamerBasicType{ 2110 StreamerElement: Element{ 2111 Name: *rbase.NewNamed("F1", ""), 2112 Type: rmeta.Float64, 2113 Size: 8, 2114 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2115 EName: "float64", 2116 }.New(), 2117 }, 2118 }, 2119 }, 2120 }, 2121 { 2122 name: "base-named", 2123 ptr: func() any { 2124 type T struct { 2125 rbase.Named `groot:",base"` 2126 F1 float64 2127 } 2128 return &T{Named: *rbase.NewNamed("n1", "t1"), F1: 42} 2129 }(), 2130 si: &StreamerInfo{ 2131 named: *rbase.NewNamed("T", "T"), 2132 objarr: rcont.NewObjArray(), 2133 elems: []rbytes.StreamerElement{ 2134 &StreamerBase{ 2135 StreamerElement: Element{ 2136 Name: *rbase.NewNamed("TNamed", ""), 2137 Type: rmeta.Base, 2138 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2139 EName: "BASE", 2140 }.New(), 2141 vbase: rvers.Named, 2142 }, 2143 &StreamerBasicType{ 2144 StreamerElement: Element{ 2145 Name: *rbase.NewNamed("F1", ""), 2146 Type: rmeta.Float64, 2147 Size: 8, 2148 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2149 EName: "float64", 2150 }.New(), 2151 }, 2152 }, 2153 }, 2154 }, 2155 { 2156 name: "base-objstring", 2157 ptr: func() any { 2158 type T struct { 2159 rbase.ObjString `groot:",base"` 2160 F1 float64 2161 } 2162 return &T{ObjString: *rbase.NewObjString("hello-obj-string"), F1: 42} 2163 }(), 2164 si: &StreamerInfo{ 2165 named: *rbase.NewNamed("T", "T"), 2166 objarr: rcont.NewObjArray(), 2167 elems: []rbytes.StreamerElement{ 2168 &StreamerBase{ 2169 StreamerElement: Element{ 2170 Name: *rbase.NewNamed("TObjString", ""), 2171 Type: rmeta.Base, 2172 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2173 EName: "BASE", 2174 }.New(), 2175 vbase: rvers.ObjString, 2176 }, 2177 &StreamerBasicType{ 2178 StreamerElement: Element{ 2179 Name: *rbase.NewNamed("F1", ""), 2180 Type: rmeta.Float64, 2181 Size: 8, 2182 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2183 EName: "float64", 2184 }.New(), 2185 }, 2186 }, 2187 }, 2188 }, 2189 { 2190 name: "ptr-to-object", 2191 ptr: func() any { 2192 type T struct { 2193 F1 *rbase.Named 2194 F2 *rbase.Named 2195 F3 *rbase.Named 2196 } 2197 f1 := rbase.NewNamed("n1", "t1") 2198 f3 := f1 2199 return &T{F1: f1, F2: nil, F3: f3} 2200 }(), 2201 si: &StreamerInfo{ 2202 named: *rbase.NewNamed("T", "T"), 2203 objarr: rcont.NewObjArray(), 2204 elems: []rbytes.StreamerElement{ 2205 &StreamerObjectPointer{ 2206 StreamerElement: Element{ 2207 Name: *rbase.NewNamed("F1", ""), 2208 Type: rmeta.ObjectP, 2209 Size: 8, 2210 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2211 EName: "TNamed*", 2212 }.New(), 2213 }, 2214 &StreamerObjectPointer{ 2215 StreamerElement: Element{ 2216 Name: *rbase.NewNamed("F2", ""), 2217 Type: rmeta.ObjectP, 2218 Size: 8, 2219 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2220 EName: "TNamed*", 2221 }.New(), 2222 }, 2223 &StreamerObjectPointer{ 2224 StreamerElement: Element{ 2225 Name: *rbase.NewNamed("F3", ""), 2226 Type: rmeta.ObjectP, 2227 Size: 8, 2228 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2229 EName: "TNamed*", 2230 }.New(), 2231 }, 2232 }, 2233 }, 2234 }, 2235 { 2236 name: "ptr-to-any", 2237 ptr: &PtrToAny_T{ 2238 Pos: &rcont.ArrayD{Data: []float64{1, 2, 3}}, 2239 Nil: nil, 2240 }, 2241 si: &StreamerInfo{ 2242 named: *rbase.NewNamed("Particle", "Particle"), 2243 clsver: int32(((*PtrToAny_T)(nil)).RVersion()), 2244 objarr: rcont.NewObjArray(), 2245 elems: []rbytes.StreamerElement{ 2246 &StreamerObjectAnyPointer{ 2247 StreamerElement: Element{ 2248 Name: *rbase.NewNamed("pos", ""), 2249 Type: rmeta.AnyP, 2250 Size: 8, 2251 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2252 EName: "TArrayD*", 2253 }.New(), 2254 }, 2255 &StreamerObjectAnyPointer{ 2256 StreamerElement: Element{ 2257 Name: *rbase.NewNamed("nil", ""), 2258 Type: rmeta.AnyP, 2259 Size: 8, 2260 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2261 EName: "TArrayD*", 2262 }.New(), 2263 }, 2264 }, 2265 }, 2266 }, 2267 { 2268 name: "event-particles", 2269 ptr: func() any { 2270 type P2 struct { 2271 Px float32 `groot:"px"` 2272 Py float64 `groot:"py"` 2273 } 2274 type Particle struct { 2275 Pos P2 `groot:"pos"` 2276 Name string `groot:"name"` 2277 } 2278 type T struct { 2279 Particles []Particle `groot:"particles"` 2280 } 2281 return &T{ 2282 Particles: []Particle{ 2283 {Pos: P2{142, 166}, Name: "HEP-1"}, 2284 {Pos: P2{242, 266}, Name: "HEP-2"}, 2285 {Pos: P2{342, 366}, Name: "HEP-3"}, 2286 }, 2287 } 2288 }(), 2289 si: &StreamerInfo{ 2290 named: *rbase.NewNamed("T", "T"), 2291 objarr: rcont.NewObjArray(), 2292 elems: []rbytes.StreamerElement{ 2293 NewCxxStreamerSTL(Element{ 2294 Name: *rbase.NewNamed("particles", ""), 2295 Type: rmeta.Streamer, 2296 Size: 24, 2297 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2298 EName: "vector<Particle>", 2299 }.New(), rmeta.STLvector, rmeta.Any), 2300 }, 2301 }, 2302 deps: []rbytes.StreamerInfo{ 2303 &StreamerInfo{ 2304 named: *rbase.NewNamed("Particle", "Particle"), 2305 objarr: rcont.NewObjArray(), 2306 elems: []rbytes.StreamerElement{ 2307 &StreamerObjectAny{ 2308 StreamerElement: Element{ 2309 Name: *rbase.NewNamed("pos", ""), 2310 Type: rmeta.Any, 2311 Size: 4 + 8, 2312 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2313 EName: "P2", 2314 }.New(), 2315 }, 2316 &StreamerString{Element{ 2317 Name: *rbase.NewNamed("name", ""), 2318 Type: rmeta.TString, 2319 Size: 24, 2320 EName: "TString", 2321 }.New()}, 2322 }, 2323 }, 2324 &StreamerInfo{ 2325 named: *rbase.NewNamed("P2", "P2"), 2326 objarr: rcont.NewObjArray(), 2327 elems: []rbytes.StreamerElement{ 2328 &StreamerBasicType{ 2329 StreamerElement: Element{ 2330 Name: *rbase.NewNamed("px", ""), 2331 Type: rmeta.Float32, 2332 Size: 4, 2333 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2334 EName: "float32", 2335 }.New(), 2336 }, 2337 &StreamerBasicType{ 2338 StreamerElement: Element{ 2339 Name: *rbase.NewNamed("py", ""), 2340 Type: rmeta.Float64, 2341 Size: 8, 2342 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2343 EName: "float64", 2344 }.New(), 2345 }, 2346 }, 2347 }, 2348 }, 2349 }, 2350 { 2351 name: "event-particles-tags", 2352 ptr: func() any { 2353 type P2 struct { 2354 Px float32 `groot:"px"` 2355 Py float64 `groot:"py"` 2356 } 2357 type Tag struct { 2358 Name string `groot:"name"` 2359 Alg string `groot:"alg"` 2360 } 2361 type Particle struct { 2362 Pos P2 `groot:"pos"` 2363 Name string `groot:"name"` 2364 Tags []Tag `groot:"tags"` 2365 } 2366 type T struct { 2367 Particles []Particle `groot:"particles"` 2368 } 2369 return &T{ 2370 Particles: []Particle{ 2371 {Pos: P2{142, 166}, Name: "HEP-1", Tags: []Tag{{"Tag11", "Alg11"}, {"Tag12", "Alg12"}}}, 2372 {Pos: P2{242, 266}, Name: "HEP-2", Tags: []Tag{{"Tag21", "Alg21"}, {"Tag22", "Alg22"}}}, 2373 {Pos: P2{342, 366}, Name: "HEP-3", Tags: []Tag{{"Tag31", "Alg31"}, {"Tag32", "Alg32"}}}, 2374 }, 2375 } 2376 }(), 2377 si: &StreamerInfo{ 2378 named: *rbase.NewNamed("T", "T"), 2379 objarr: rcont.NewObjArray(), 2380 elems: []rbytes.StreamerElement{ 2381 NewCxxStreamerSTL(Element{ 2382 Name: *rbase.NewNamed("particles", ""), 2383 Type: rmeta.Streamer, 2384 Size: 24, 2385 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2386 EName: "vector<Particle>", 2387 }.New(), rmeta.STLvector, rmeta.Any), 2388 }, 2389 }, 2390 deps: []rbytes.StreamerInfo{ 2391 &StreamerInfo{ 2392 named: *rbase.NewNamed("Particle", "Particle"), 2393 objarr: rcont.NewObjArray(), 2394 elems: []rbytes.StreamerElement{ 2395 &StreamerObjectAny{ 2396 StreamerElement: Element{ 2397 Name: *rbase.NewNamed("pos", ""), 2398 Type: rmeta.Any, 2399 Size: 4 + 8, 2400 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2401 EName: "P2", 2402 }.New(), 2403 }, 2404 &StreamerString{Element{ 2405 Name: *rbase.NewNamed("name", ""), 2406 Type: rmeta.TString, 2407 Size: 24, 2408 EName: "TString", 2409 }.New()}, 2410 NewCxxStreamerSTL(Element{ 2411 Name: *rbase.NewNamed("tags", ""), 2412 Type: rmeta.Streamer, 2413 Size: 24, 2414 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2415 EName: "vector<Tag>", 2416 }.New(), rmeta.STLvector, rmeta.Any), 2417 }, 2418 }, 2419 &StreamerInfo{ 2420 named: *rbase.NewNamed("P2", "P2"), 2421 objarr: rcont.NewObjArray(), 2422 elems: []rbytes.StreamerElement{ 2423 &StreamerBasicType{ 2424 StreamerElement: Element{ 2425 Name: *rbase.NewNamed("px", ""), 2426 Type: rmeta.Float32, 2427 Size: 4, 2428 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2429 EName: "float32", 2430 }.New(), 2431 }, 2432 &StreamerBasicType{ 2433 StreamerElement: Element{ 2434 Name: *rbase.NewNamed("py", ""), 2435 Type: rmeta.Float64, 2436 Size: 8, 2437 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2438 EName: "float64", 2439 }.New(), 2440 }, 2441 }, 2442 }, 2443 &StreamerInfo{ 2444 named: *rbase.NewNamed("Tag", "Tag"), 2445 objarr: rcont.NewObjArray(), 2446 elems: []rbytes.StreamerElement{ 2447 &StreamerString{Element{ 2448 Name: *rbase.NewNamed("name", ""), 2449 Type: rmeta.TString, 2450 Size: 24, 2451 EName: "TString", 2452 }.New()}, 2453 &StreamerString{Element{ 2454 Name: *rbase.NewNamed("alg", ""), 2455 Type: rmeta.TString, 2456 Size: 24, 2457 EName: "TString", 2458 }.New()}, 2459 }, 2460 }, 2461 }, 2462 }, 2463 { 2464 name: "set<i32>", 2465 ptr: func() any { 2466 type T struct { 2467 F []int32 2468 } 2469 return &T{ 2470 F: []int32{1, 2, 3}, 2471 } 2472 }(), 2473 si: &StreamerInfo{ 2474 named: *rbase.NewNamed("T", "T"), 2475 objarr: rcont.NewObjArray(), 2476 elems: []rbytes.StreamerElement{ 2477 NewCxxStreamerSTL(Element{ 2478 Name: *rbase.NewNamed("F", ""), 2479 Type: rmeta.Streamer, 2480 Size: 48, 2481 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2482 EName: "set<int32>", 2483 }.New(), rmeta.STLset, rmeta.Object), 2484 }, 2485 }, 2486 }, 2487 { 2488 name: "set<TString>", 2489 ptr: func() any { 2490 type T struct { 2491 F []string 2492 } 2493 return &T{ 2494 F: []string{"s1", "s22", "s333"}, 2495 } 2496 }(), 2497 si: &StreamerInfo{ 2498 named: *rbase.NewNamed("T", "T"), 2499 objarr: rcont.NewObjArray(), 2500 elems: []rbytes.StreamerElement{ 2501 NewCxxStreamerSTL(Element{ 2502 Name: *rbase.NewNamed("F", ""), 2503 Type: rmeta.Streamer, 2504 Size: 48, 2505 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2506 EName: "set<TString>", 2507 }.New(), rmeta.STLset, rmeta.Object), 2508 }, 2509 }, 2510 }, 2511 { 2512 name: "set<vector<float> >", 2513 ptr: func() any { 2514 type T struct { 2515 F [][]float32 2516 } 2517 return &T{ 2518 F: [][]float32{ 2519 {1, 2, 3, 4}, 2520 {5, 6}, 2521 {7, 8, 9, 10}, 2522 }, 2523 } 2524 }(), 2525 si: &StreamerInfo{ 2526 named: *rbase.NewNamed("T", "T"), 2527 objarr: rcont.NewObjArray(), 2528 elems: []rbytes.StreamerElement{ 2529 NewCxxStreamerSTL(Element{ 2530 Name: *rbase.NewNamed("F", ""), 2531 Type: rmeta.Streamer, 2532 Size: 48, 2533 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2534 EName: "set<vector<float> >", 2535 }.New(), rmeta.STLset, rmeta.Object), 2536 }, 2537 }, 2538 }, 2539 { 2540 name: "set<set<float> >", 2541 ptr: func() any { 2542 type T struct { 2543 F [][]float32 2544 } 2545 return &T{ 2546 F: [][]float32{ 2547 {1, 2, 3, 4}, 2548 {5, 6}, 2549 {7, 8, 9, 10}, 2550 }, 2551 } 2552 }(), 2553 si: &StreamerInfo{ 2554 named: *rbase.NewNamed("T", "T"), 2555 objarr: rcont.NewObjArray(), 2556 elems: []rbytes.StreamerElement{ 2557 NewCxxStreamerSTL(Element{ 2558 Name: *rbase.NewNamed("F", ""), 2559 Type: rmeta.Streamer, 2560 Size: 48, 2561 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2562 EName: "set<set<float> >", 2563 }.New(), rmeta.STLset, rmeta.Object), 2564 }, 2565 }, 2566 }, 2567 { 2568 name: "unordered_set<i32>", 2569 ptr: func() any { 2570 type T struct { 2571 F []int32 2572 } 2573 return &T{ 2574 F: []int32{1, 2, 3}, 2575 } 2576 }(), 2577 si: &StreamerInfo{ 2578 named: *rbase.NewNamed("T", "T"), 2579 objarr: rcont.NewObjArray(), 2580 elems: []rbytes.StreamerElement{ 2581 NewCxxStreamerSTL(Element{ 2582 Name: *rbase.NewNamed("F", ""), 2583 Type: rmeta.Streamer, 2584 Size: 56, 2585 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2586 EName: "unordered_set<int32>", 2587 }.New(), rmeta.STLunorderedset, rmeta.Int32), 2588 }, 2589 }, 2590 }, 2591 { 2592 name: "unordered_set<TString>", 2593 ptr: func() any { 2594 type T struct { 2595 F []string 2596 } 2597 return &T{ 2598 F: []string{"s1", "s22", "s333"}, 2599 } 2600 }(), 2601 si: &StreamerInfo{ 2602 named: *rbase.NewNamed("T", "T"), 2603 objarr: rcont.NewObjArray(), 2604 elems: []rbytes.StreamerElement{ 2605 NewCxxStreamerSTL(Element{ 2606 Name: *rbase.NewNamed("F", ""), 2607 Type: rmeta.Streamer, 2608 Size: 56, 2609 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2610 EName: "unordered_set<TString>", 2611 }.New(), rmeta.STLunorderedset, rmeta.Object), 2612 }, 2613 }, 2614 }, 2615 { 2616 name: "unordered_set<vector<float> >", 2617 ptr: func() any { 2618 type T struct { 2619 F [][]float32 2620 } 2621 return &T{ 2622 F: [][]float32{ 2623 {1, 2, 3, 4}, 2624 {5, 6}, 2625 {7, 8, 9, 10}, 2626 }, 2627 } 2628 }(), 2629 si: &StreamerInfo{ 2630 named: *rbase.NewNamed("T", "T"), 2631 objarr: rcont.NewObjArray(), 2632 elems: []rbytes.StreamerElement{ 2633 NewCxxStreamerSTL(Element{ 2634 Name: *rbase.NewNamed("F", ""), 2635 Type: rmeta.Streamer, 2636 Size: 56, 2637 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2638 EName: "unordered_set<vector<float> >", 2639 }.New(), rmeta.STLunorderedset, rmeta.Object), 2640 }, 2641 }, 2642 }, 2643 { 2644 name: "unordered_set<unordered_set<float> >", 2645 ptr: func() any { 2646 type T struct { 2647 F [][]float32 2648 } 2649 return &T{ 2650 F: [][]float32{ 2651 {1, 2, 3, 4}, 2652 {5, 6}, 2653 {7, 8, 9, 10}, 2654 }, 2655 } 2656 }(), 2657 si: &StreamerInfo{ 2658 named: *rbase.NewNamed("T", "T"), 2659 objarr: rcont.NewObjArray(), 2660 elems: []rbytes.StreamerElement{ 2661 NewCxxStreamerSTL(Element{ 2662 Name: *rbase.NewNamed("F", ""), 2663 Type: rmeta.Streamer, 2664 Size: 56, 2665 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2666 EName: "unordered_set<unordered_set<float> >", 2667 }.New(), rmeta.STLunorderedset, rmeta.Object), 2668 }, 2669 }, 2670 }, 2671 { 2672 name: "map<i32,i32>", 2673 ptr: func() any { 2674 type T struct { 2675 Map map[int32]int32 `groot:"m"` 2676 } 2677 return &T{ 2678 Map: map[int32]int32{ 2679 1: 10, 2680 2: 20, 2681 3: 30, 2682 }, 2683 } 2684 }(), 2685 si: &StreamerInfo{ 2686 named: *rbase.NewNamed("T", "T"), 2687 objarr: rcont.NewObjArray(), 2688 elems: []rbytes.StreamerElement{ 2689 NewCxxStreamerSTL(Element{ 2690 Name: *rbase.NewNamed("m", ""), 2691 Type: rmeta.Streamer, 2692 Size: 48, 2693 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2694 EName: "map<int32,int32>", 2695 }.New(), rmeta.STLmap, rmeta.Object), 2696 }, 2697 }, 2698 }, 2699 { 2700 name: "map<i32,string>", 2701 ptr: func() any { 2702 type T struct { 2703 Map map[int32]string `groot:"m"` 2704 } 2705 return &T{ 2706 Map: map[int32]string{ 2707 1: "one", 2708 2: "two", 2709 3: "three", 2710 }, 2711 } 2712 }(), 2713 si: &StreamerInfo{ 2714 named: *rbase.NewNamed("T", "T"), 2715 objarr: rcont.NewObjArray(), 2716 elems: []rbytes.StreamerElement{ 2717 NewCxxStreamerSTL(Element{ 2718 Name: *rbase.NewNamed("m", ""), 2719 Type: rmeta.Streamer, 2720 Size: 48, 2721 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2722 EName: "map<int32,TString>", 2723 }.New(), rmeta.STLmap, rmeta.Object), 2724 }, 2725 }, 2726 }, 2727 { 2728 name: "map<i32,map<i32,string> >", 2729 ptr: func() any { 2730 type T struct { 2731 Map map[int32]map[int32]string `groot:"m"` 2732 } 2733 return &T{ 2734 Map: map[int32]map[int32]string{ 2735 1: { 2736 1: "one", 2737 2: "two", 2738 3: "three", 2739 }, 2740 2: { 2741 1: "un", 2742 2: "deux", 2743 3: "trois", 2744 }, 2745 3: { 2746 1: "eins", 2747 2: "zwei", 2748 3: "drei", 2749 }, 2750 }, 2751 } 2752 }(), 2753 si: &StreamerInfo{ 2754 named: *rbase.NewNamed("T", "T"), 2755 objarr: rcont.NewObjArray(), 2756 elems: []rbytes.StreamerElement{ 2757 NewCxxStreamerSTL(Element{ 2758 Name: *rbase.NewNamed("m", ""), 2759 Type: rmeta.Streamer, 2760 Size: 48, 2761 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2762 EName: "map<int32,map<int32,string> >", 2763 }.New(), rmeta.STLmap, rmeta.Object), 2764 }, 2765 }, 2766 }, 2767 { 2768 name: "map<i32,vector<string> >", 2769 ptr: func() any { 2770 type T struct { 2771 Map map[int32][]string `groot:"m"` 2772 } 2773 return &T{ 2774 Map: map[int32][]string{ 2775 1: {"one", "un", "eins"}, 2776 2: {"two", "deux", "zwei"}, 2777 3: {"three", "trois", "drei"}, 2778 }, 2779 } 2780 }(), 2781 si: &StreamerInfo{ 2782 named: *rbase.NewNamed("T", "T"), 2783 objarr: rcont.NewObjArray(), 2784 elems: []rbytes.StreamerElement{ 2785 NewCxxStreamerSTL(Element{ 2786 Name: *rbase.NewNamed("m", ""), 2787 Type: rmeta.Streamer, 2788 Size: 48, 2789 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2790 EName: "map<int32,vector<string> >", 2791 }.New(), rmeta.STLmap, rmeta.Object), 2792 }, 2793 }, 2794 }, 2795 { 2796 name: "unordered_map<i32,i32>", 2797 ptr: func() any { 2798 type T struct { 2799 Map map[int32]int32 `groot:"m"` 2800 } 2801 return &T{ 2802 Map: map[int32]int32{ 2803 1: 10, 2804 2: 20, 2805 3: 30, 2806 }, 2807 } 2808 }(), 2809 si: &StreamerInfo{ 2810 named: *rbase.NewNamed("T", "T"), 2811 objarr: rcont.NewObjArray(), 2812 elems: []rbytes.StreamerElement{ 2813 NewCxxStreamerSTL(Element{ 2814 Name: *rbase.NewNamed("m", ""), 2815 Type: rmeta.Streamer, 2816 Size: 56, 2817 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2818 EName: "unordered_map<int32,int32>", 2819 }.New(), rmeta.STLunorderedmap, rmeta.Object), 2820 }, 2821 }, 2822 }, 2823 { 2824 name: "unordered_map<i32,string>", 2825 ptr: func() any { 2826 type T struct { 2827 Map map[int32]string `groot:"m"` 2828 } 2829 return &T{ 2830 Map: map[int32]string{ 2831 1: "one", 2832 2: "two", 2833 3: "three", 2834 }, 2835 } 2836 }(), 2837 si: &StreamerInfo{ 2838 named: *rbase.NewNamed("T", "T"), 2839 objarr: rcont.NewObjArray(), 2840 elems: []rbytes.StreamerElement{ 2841 NewCxxStreamerSTL(Element{ 2842 Name: *rbase.NewNamed("m", ""), 2843 Type: rmeta.Streamer, 2844 Size: 56, 2845 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2846 EName: "unordered_map<int32,TString>", 2847 }.New(), rmeta.STLunorderedmap, rmeta.Object), 2848 }, 2849 }, 2850 }, 2851 { 2852 name: "unordered_map<i32,unordered_map<i32,string> >", 2853 ptr: func() any { 2854 type T struct { 2855 Map map[int32]map[int32]string `groot:"m"` 2856 } 2857 return &T{ 2858 Map: map[int32]map[int32]string{ 2859 1: { 2860 1: "one", 2861 2: "two", 2862 3: "three", 2863 }, 2864 2: { 2865 1: "un", 2866 2: "deux", 2867 3: "trois", 2868 }, 2869 3: { 2870 1: "eins", 2871 2: "zwei", 2872 3: "drei", 2873 }, 2874 }, 2875 } 2876 }(), 2877 si: &StreamerInfo{ 2878 named: *rbase.NewNamed("T", "T"), 2879 objarr: rcont.NewObjArray(), 2880 elems: []rbytes.StreamerElement{ 2881 NewCxxStreamerSTL(Element{ 2882 Name: *rbase.NewNamed("m", ""), 2883 Type: rmeta.Streamer, 2884 Size: 56, 2885 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2886 EName: "unordered_map<int32,unordered_map<int32,string> >", 2887 }.New(), rmeta.STLunorderedmap, rmeta.Object), 2888 }, 2889 }, 2890 }, 2891 { 2892 name: "unordered_map<i32,vector<string> >", 2893 ptr: func() any { 2894 type T struct { 2895 Map map[int32][]string `groot:"m"` 2896 } 2897 return &T{ 2898 Map: map[int32][]string{ 2899 1: {"one", "un", "eins"}, 2900 2: {"two", "deux", "zwei"}, 2901 3: {"three", "trois", "drei"}, 2902 }, 2903 } 2904 }(), 2905 si: &StreamerInfo{ 2906 named: *rbase.NewNamed("T", "T"), 2907 objarr: rcont.NewObjArray(), 2908 elems: []rbytes.StreamerElement{ 2909 NewCxxStreamerSTL(Element{ 2910 Name: *rbase.NewNamed("m", ""), 2911 Type: rmeta.Streamer, 2912 Size: 56, 2913 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2914 EName: "unordered_map<int32,vector<string> >", 2915 }.New(), rmeta.STLunorderedmap, rmeta.Object), 2916 }, 2917 }, 2918 }, 2919 { 2920 name: "list<i32>", 2921 ptr: func() any { 2922 type T struct { 2923 F []int32 2924 } 2925 return &T{ 2926 F: []int32{1, 2, 3}, 2927 } 2928 }(), 2929 si: &StreamerInfo{ 2930 named: *rbase.NewNamed("T", "T"), 2931 objarr: rcont.NewObjArray(), 2932 elems: []rbytes.StreamerElement{ 2933 NewCxxStreamerSTL(Element{ 2934 Name: *rbase.NewNamed("F", ""), 2935 Type: rmeta.Streamer, 2936 Size: 24, 2937 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2938 EName: "list<int32>", 2939 }.New(), rmeta.STLlist, rmeta.Int32), 2940 }, 2941 }, 2942 }, 2943 { 2944 name: "list<TString>", 2945 ptr: func() any { 2946 type T struct { 2947 F []string 2948 } 2949 return &T{ 2950 F: []string{"s1", "s22", "s333"}, 2951 } 2952 }(), 2953 si: &StreamerInfo{ 2954 named: *rbase.NewNamed("T", "T"), 2955 objarr: rcont.NewObjArray(), 2956 elems: []rbytes.StreamerElement{ 2957 NewCxxStreamerSTL(Element{ 2958 Name: *rbase.NewNamed("F", ""), 2959 Type: rmeta.Streamer, 2960 Size: 24, 2961 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2962 EName: "list<TString>", 2963 }.New(), rmeta.STLlist, rmeta.Object), 2964 }, 2965 }, 2966 }, 2967 { 2968 name: "list<vector<float> >", 2969 ptr: func() any { 2970 type T struct { 2971 F [][]float32 2972 } 2973 return &T{ 2974 F: [][]float32{ 2975 {1, 2, 3, 4}, 2976 {5, 6}, 2977 {7, 8, 9, 10}, 2978 }, 2979 } 2980 }(), 2981 si: &StreamerInfo{ 2982 named: *rbase.NewNamed("T", "T"), 2983 objarr: rcont.NewObjArray(), 2984 elems: []rbytes.StreamerElement{ 2985 NewCxxStreamerSTL(Element{ 2986 Name: *rbase.NewNamed("F", ""), 2987 Type: rmeta.Streamer, 2988 Size: 24, 2989 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 2990 EName: "list<vector<float> >", 2991 }.New(), rmeta.STLlist, rmeta.Object), 2992 }, 2993 }, 2994 }, 2995 { 2996 name: "list<list<float> >", 2997 ptr: func() any { 2998 type T struct { 2999 F [][]float32 3000 } 3001 return &T{ 3002 F: [][]float32{ 3003 {1, 2, 3, 4}, 3004 {5, 6}, 3005 {7, 8, 9, 10}, 3006 }, 3007 } 3008 }(), 3009 si: &StreamerInfo{ 3010 named: *rbase.NewNamed("T", "T"), 3011 objarr: rcont.NewObjArray(), 3012 elems: []rbytes.StreamerElement{ 3013 NewCxxStreamerSTL(Element{ 3014 Name: *rbase.NewNamed("F", ""), 3015 Type: rmeta.Streamer, 3016 Size: 24, 3017 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3018 EName: "list<list<float> >", 3019 }.New(), rmeta.STLlist, rmeta.Object), 3020 }, 3021 }, 3022 }, 3023 { 3024 name: "deque<i32>", 3025 ptr: func() any { 3026 type T struct { 3027 F []int32 3028 } 3029 return &T{ 3030 F: []int32{1, 2, 3}, 3031 } 3032 }(), 3033 si: &StreamerInfo{ 3034 named: *rbase.NewNamed("T", "T"), 3035 objarr: rcont.NewObjArray(), 3036 elems: []rbytes.StreamerElement{ 3037 NewCxxStreamerSTL(Element{ 3038 Name: *rbase.NewNamed("F", ""), 3039 Type: rmeta.Streamer, 3040 Size: 80, 3041 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3042 EName: "deque<int32>", 3043 }.New(), rmeta.STLdeque, rmeta.Int32), 3044 }, 3045 }, 3046 }, 3047 { 3048 name: "deque<TString>", 3049 ptr: func() any { 3050 type T struct { 3051 F []string 3052 } 3053 return &T{ 3054 F: []string{"s1", "s22", "s333"}, 3055 } 3056 }(), 3057 si: &StreamerInfo{ 3058 named: *rbase.NewNamed("T", "T"), 3059 objarr: rcont.NewObjArray(), 3060 elems: []rbytes.StreamerElement{ 3061 NewCxxStreamerSTL(Element{ 3062 Name: *rbase.NewNamed("F", ""), 3063 Type: rmeta.Streamer, 3064 Size: 80, 3065 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3066 EName: "deque<TString>", 3067 }.New(), rmeta.STLdeque, rmeta.Object), 3068 }, 3069 }, 3070 }, 3071 { 3072 name: "deque<vector<float> >", 3073 ptr: func() any { 3074 type T struct { 3075 F [][]float32 3076 } 3077 return &T{ 3078 F: [][]float32{ 3079 {1, 2, 3, 4}, 3080 {5, 6}, 3081 {7, 8, 9, 10}, 3082 }, 3083 } 3084 }(), 3085 si: &StreamerInfo{ 3086 named: *rbase.NewNamed("T", "T"), 3087 objarr: rcont.NewObjArray(), 3088 elems: []rbytes.StreamerElement{ 3089 NewCxxStreamerSTL(Element{ 3090 Name: *rbase.NewNamed("F", ""), 3091 Type: rmeta.Streamer, 3092 Size: 80, 3093 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3094 EName: "deque<vector<float> >", 3095 }.New(), rmeta.STLdeque, rmeta.Object), 3096 }, 3097 }, 3098 }, 3099 { 3100 name: "deque<deque<float> >", 3101 ptr: func() any { 3102 type T struct { 3103 F [][]float32 3104 } 3105 return &T{ 3106 F: [][]float32{ 3107 {1, 2, 3, 4}, 3108 {5, 6}, 3109 {7, 8, 9, 10}, 3110 }, 3111 } 3112 }(), 3113 si: &StreamerInfo{ 3114 named: *rbase.NewNamed("T", "T"), 3115 objarr: rcont.NewObjArray(), 3116 elems: []rbytes.StreamerElement{ 3117 NewCxxStreamerSTL(Element{ 3118 Name: *rbase.NewNamed("F", ""), 3119 Type: rmeta.Streamer, 3120 Size: 80, 3121 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3122 EName: "deque<deque<float> >", 3123 }.New(), rmeta.STLdeque, rmeta.Object), 3124 }, 3125 }, 3126 }, 3127 { 3128 name: "rmeta-stl-string", 3129 ptr: &struct { 3130 F string 3131 }{"Go-HEP"}, 3132 si: &StreamerInfo{ 3133 named: *rbase.NewNamed("T", "T"), 3134 objarr: rcont.NewObjArray(), 3135 elems: []rbytes.StreamerElement{ 3136 &StreamerSTLstring{ 3137 StreamerSTL: *NewCxxStreamerSTL(Element{ 3138 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3139 Type: rmeta.STL, 3140 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3141 EName: "vector<string>", 3142 }.New(), rmeta.ESTLType(rmeta.STLstring), rmeta.STLstring), 3143 }, 3144 }, 3145 }, 3146 }, 3147 { 3148 name: "rmeta-stl-vector<float>", 3149 ptr: &struct { 3150 F []float32 3151 }{[]float32{1, 2, 3}}, 3152 si: &StreamerInfo{ 3153 named: *rbase.NewNamed("T", "T"), 3154 objarr: rcont.NewObjArray(), 3155 elems: []rbytes.StreamerElement{ 3156 NewCxxStreamerSTL(Element{ 3157 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3158 Type: rmeta.STL, 3159 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3160 EName: "vector<float>", 3161 }.New(), rmeta.STLvector, rmeta.Float32), 3162 }, 3163 }, 3164 }, 3165 { 3166 name: "rmeta-stl-set<float>", 3167 ptr: &struct { 3168 F []float32 3169 }{[]float32{1, 2, 3}}, 3170 si: &StreamerInfo{ 3171 named: *rbase.NewNamed("T", "T"), 3172 objarr: rcont.NewObjArray(), 3173 elems: []rbytes.StreamerElement{ 3174 NewCxxStreamerSTL(Element{ 3175 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3176 Type: rmeta.STL, 3177 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3178 EName: "set<float>", 3179 }.New(), rmeta.STLset, rmeta.Float32), 3180 }, 3181 }, 3182 }, 3183 { 3184 name: "rmeta-stl-list<float>", 3185 ptr: &struct { 3186 F []float32 3187 }{[]float32{1, 2, 3}}, 3188 si: &StreamerInfo{ 3189 named: *rbase.NewNamed("T", "T"), 3190 objarr: rcont.NewObjArray(), 3191 elems: []rbytes.StreamerElement{ 3192 NewCxxStreamerSTL(Element{ 3193 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3194 Type: rmeta.STL, 3195 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3196 EName: "list<float>", 3197 }.New(), rmeta.STLlist, rmeta.Float32), 3198 }, 3199 }, 3200 }, 3201 { 3202 name: "rmeta-stl-deque<float>", 3203 ptr: &struct { 3204 F []float32 3205 }{[]float32{1, 2, 3}}, 3206 si: &StreamerInfo{ 3207 named: *rbase.NewNamed("T", "T"), 3208 objarr: rcont.NewObjArray(), 3209 elems: []rbytes.StreamerElement{ 3210 NewCxxStreamerSTL(Element{ 3211 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3212 Type: rmeta.STL, 3213 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3214 EName: "deque<float>", 3215 }.New(), rmeta.STLdeque, rmeta.Float32), 3216 }, 3217 }, 3218 }, 3219 { 3220 name: "rmeta-stl-map<int,float>", 3221 ptr: &struct { 3222 F map[int32]float32 3223 }{map[int32]float32{1: 1, 2: 2, 3: 3}}, 3224 si: &StreamerInfo{ 3225 named: *rbase.NewNamed("T", "T"), 3226 objarr: rcont.NewObjArray(), 3227 elems: []rbytes.StreamerElement{ 3228 NewCxxStreamerSTL(Element{ 3229 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3230 Type: rmeta.STL, 3231 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3232 EName: "map<int,float>", 3233 }.New(), rmeta.STLmap, rmeta.Object), 3234 }, 3235 }, 3236 }, 3237 { 3238 name: "rmeta-stl-vector<string>", 3239 ptr: &struct { 3240 F []string 3241 }{[]string{"hello", "world", "Go-HEP"}}, 3242 si: &StreamerInfo{ 3243 named: *rbase.NewNamed("T", "T"), 3244 objarr: rcont.NewObjArray(), 3245 elems: []rbytes.StreamerElement{ 3246 NewCxxStreamerSTL(Element{ 3247 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3248 Type: rmeta.STL, 3249 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3250 EName: "vector<string>", 3251 }.New(), rmeta.STLvector, rmeta.STLstring), 3252 }, 3253 }, 3254 }, 3255 { 3256 name: "rmeta-stl-vector<set<int>>", 3257 ptr: &struct { 3258 F [][]int32 3259 }{[][]int32{{1}, {2, 3}}}, 3260 si: &StreamerInfo{ 3261 named: *rbase.NewNamed("T", "T"), 3262 objarr: rcont.NewObjArray(), 3263 elems: []rbytes.StreamerElement{ 3264 NewCxxStreamerSTL(Element{ 3265 Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"), 3266 Type: rmeta.STL, 3267 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3268 EName: "vector<set<int> >", 3269 }.New(), rmeta.STLvector, rmeta.Object), 3270 }, 3271 }, 3272 }, 3273 } { 3274 t.Run(tc.name, func(t *testing.T) { 3275 if tc.skip { 3276 t.Skipf("skipping %s", tc.name) 3277 } 3278 3279 for _, dep := range tc.deps { 3280 StreamerInfos.Add(dep) 3281 } 3282 defer func() { 3283 StreamerInfos.Lock() 3284 defer StreamerInfos.Unlock() 3285 for _, dep := range tc.deps { 3286 key := streamerDbKey{ 3287 class: dep.Name(), 3288 version: dep.ClassVersion(), 3289 } 3290 delete(StreamerInfos.db, key) 3291 } 3292 }() 3293 3294 err := tc.si.BuildStreamers() 3295 if err != nil { 3296 t.Fatalf("could not build streamers: %+v", err) 3297 } 3298 3299 wbuf := rbytes.NewWBuffer(nil, nil, 0, nil) 3300 enc, err := tc.si.NewEncoder(kind, wbuf) 3301 if err != nil { 3302 t.Fatalf("could not create encoder: %+v", err) 3303 } 3304 3305 err = enc.EncodeROOT(tc.ptr) 3306 if err != nil { 3307 t.Fatalf("could not encode value: %+v", err) 3308 } 3309 3310 rbuf := rbytes.NewRBuffer(wbuf.Bytes(), nil, 0, nil) 3311 dec, err := tc.si.NewDecoder(kind, rbuf) 3312 if err != nil { 3313 t.Fatalf("could not create decoder: %+v", err) 3314 } 3315 3316 rv := reflect.New(reflect.TypeOf(tc.ptr).Elem()).Elem() 3317 got := rv.Addr().Interface() 3318 err = dec.DecodeROOT(got) 3319 if err != nil { 3320 t.Fatalf("could not decode value: %+v", err) 3321 } 3322 3323 if got, want := got, tc.ptr; !reflect.DeepEqual(got, want) { 3324 t.Fatalf("invalid round-trip:\ngot= %#v\nwant=%#v", got, want) 3325 } 3326 }) 3327 } 3328 } 3329 3330 func TestRWStreamerInfo(t *testing.T) { 3331 const kind = rbytes.ObjectWise // FIXME(sbinet): also test MemberWise. 3332 3333 for _, tc := range []struct { 3334 name string 3335 skip bool 3336 si *StreamerInfo 3337 ptr any 3338 deps []rbytes.StreamerInfo 3339 err error 3340 }{ 3341 { 3342 name: "event", 3343 ptr: func() any { 3344 type P2 struct { 3345 Px float32 `groot:"px"` 3346 Py float64 `groot:"py"` 3347 } 3348 type Particle struct { 3349 Pos P2 `groot:"pos"` 3350 Name string `groot:"name"` 3351 } 3352 type T struct { 3353 Name string `groot:"name"` 3354 Particle Particle `groot:"particle"` 3355 } 3356 return &T{ 3357 Name: "Go-HEP", 3358 Particle: Particle{Pos: P2{142, 166}, Name: "HEP-1"}, 3359 } 3360 }(), 3361 si: &StreamerInfo{ 3362 named: *rbase.NewNamed("T", "T"), 3363 objarr: rcont.NewObjArray(), 3364 elems: []rbytes.StreamerElement{ 3365 &StreamerString{Element{ 3366 Name: *rbase.NewNamed("name", ""), 3367 Type: rmeta.TString, 3368 Size: 24, 3369 EName: "TString", 3370 }.New()}, 3371 &StreamerObjectAny{ 3372 StreamerElement: Element{ 3373 Name: *rbase.NewNamed("particle", ""), 3374 Type: rmeta.Any, 3375 Size: 4 + 8 + 24, 3376 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3377 EName: "Particle", 3378 }.New(), 3379 }, 3380 }, 3381 }, 3382 deps: []rbytes.StreamerInfo{ 3383 &StreamerInfo{ 3384 named: *rbase.NewNamed("Particle", "Particle"), 3385 objarr: rcont.NewObjArray(), 3386 elems: []rbytes.StreamerElement{ 3387 &StreamerObjectAny{ 3388 StreamerElement: Element{ 3389 Name: *rbase.NewNamed("pos", ""), 3390 Type: rmeta.Any, 3391 Size: 4 + 8, 3392 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3393 EName: "P2", 3394 }.New(), 3395 }, 3396 &StreamerString{Element{ 3397 Name: *rbase.NewNamed("name", ""), 3398 Type: rmeta.TString, 3399 Size: 24, 3400 EName: "TString", 3401 }.New()}, 3402 }, 3403 }, 3404 &StreamerInfo{ 3405 named: *rbase.NewNamed("P2", "P2"), 3406 objarr: rcont.NewObjArray(), 3407 elems: []rbytes.StreamerElement{ 3408 &StreamerBasicType{ 3409 StreamerElement: Element{ 3410 Name: *rbase.NewNamed("px", ""), 3411 Type: rmeta.Float32, 3412 Size: 4, 3413 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3414 EName: "float32", 3415 }.New(), 3416 }, 3417 &StreamerBasicType{ 3418 StreamerElement: Element{ 3419 Name: *rbase.NewNamed("py", ""), 3420 Type: rmeta.Float64, 3421 Size: 8, 3422 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3423 EName: "float64", 3424 }.New(), 3425 }, 3426 }, 3427 }, 3428 }, 3429 }, 3430 } { 3431 t.Run(tc.name, func(t *testing.T) { 3432 if tc.skip { 3433 t.Skipf("skipping %s", tc.name) 3434 } 3435 3436 for _, dep := range tc.deps { 3437 StreamerInfos.Add(dep) 3438 } 3439 defer func() { 3440 StreamerInfos.Lock() 3441 defer StreamerInfos.Unlock() 3442 for _, dep := range tc.deps { 3443 key := streamerDbKey{ 3444 class: dep.Name(), 3445 version: dep.ClassVersion(), 3446 } 3447 delete(StreamerInfos.db, key) 3448 } 3449 }() 3450 3451 err := tc.si.BuildStreamers() 3452 if err != nil { 3453 t.Fatalf("could not build streamers: %+v", err) 3454 } 3455 3456 wbuf := rbytes.NewWBuffer(nil, nil, 0, nil) 3457 3458 w, err := tc.si.NewWStreamer(kind) 3459 if err != nil { 3460 t.Fatalf("could not create write-streamer: %+v", err) 3461 } 3462 err = w.(rbytes.Binder).Bind(tc.ptr) 3463 if err != nil { 3464 t.Fatalf("could not bind write-streamer: %+v", err) 3465 } 3466 3467 err = w.WStreamROOT(wbuf) 3468 if err != nil { 3469 t.Fatalf("could not write value: %+v", err) 3470 } 3471 3472 rbuf := rbytes.NewRBuffer(wbuf.Bytes(), nil, 0, nil) 3473 r, err := tc.si.NewRStreamer(kind) 3474 if err != nil { 3475 t.Fatalf("could not create read-streamer: %+v", err) 3476 } 3477 3478 rv := reflect.New(reflect.TypeOf(tc.ptr).Elem()).Elem() 3479 got := rv.Addr().Interface() 3480 3481 err = r.(rbytes.Binder).Bind(got) 3482 if err != nil { 3483 t.Fatalf("could not bind read-streamer: %+v", err) 3484 } 3485 3486 err = r.RStreamROOT(rbuf) 3487 if err != nil { 3488 t.Fatalf("could not read value: %+v", err) 3489 } 3490 3491 if got, want := got, tc.ptr; !reflect.DeepEqual(got, want) { 3492 t.Fatalf("invalid round-trip:\ngot= %#v\nwant=%#v", got, want) 3493 } 3494 }) 3495 } 3496 } 3497 3498 func TestRWStreamerElem(t *testing.T) { 3499 const kind = rbytes.ObjectWise // FIXME(sbinet): also test MemberWise. 3500 3501 for _, tc := range []struct { 3502 name string 3503 skip bool 3504 si *StreamerInfo 3505 ptr any 3506 deps []rbytes.StreamerInfo 3507 err error 3508 }{ 3509 { 3510 name: "event", 3511 ptr: func() any { 3512 type P2 struct { 3513 Px float32 `groot:"px"` 3514 Py float64 `groot:"py"` 3515 } 3516 type Particle struct { 3517 Pos P2 `groot:"pos"` 3518 Name string `groot:"name"` 3519 } 3520 3521 type T struct { 3522 Name string `groot:"name"` 3523 3524 B bool `groot:"b"` 3525 I8 int8 `groot:"i8"` 3526 I16 int16 `groot:"i16"` 3527 I32 int32 `groot:"i32"` 3528 I64 int64 `groot:"i64"` 3529 U8 uint8 `groot:"u8"` 3530 U16 uint16 `groot:"u16"` 3531 U32 uint32 `groot:"u32"` 3532 U64 uint64 `groot:"u64"` 3533 F32 float32 `groot:"f32"` 3534 F64 float64 `groot:"f64"` 3535 3536 ArrB [3]bool `groot:"arrB[3]"` 3537 ArrI8 [3]int8 `groot:"arrU8[3]"` 3538 ArrI16 [3]int16 `groot:"arrU16[3]"` 3539 ArrI32 [3]int32 `groot:"arrU32[3]"` 3540 ArrI64 [3]int64 `groot:"arrU64[3]"` 3541 ArrU8 [3]uint8 `groot:"arrU8[3]"` 3542 ArrU16 [3]uint16 `groot:"arrU16[3]"` 3543 ArrU32 [3]uint32 `groot:"arrU32[3]"` 3544 ArrU64 [3]uint64 `groot:"arrU64[3]"` 3545 ArrF32 [3]float32 `groot:"arrF32[3]"` 3546 ArrF64 [3]float64 `groot:"arrF64[3]"` 3547 3548 N int32 `groot:"N"` 3549 SliB []bool `groot:"sliB[N]"` 3550 SliI8 []int8 `groot:"sliU8[N]"` 3551 SliI16 []int16 `groot:"sliU16[N]"` 3552 SliI32 []int32 `groot:"sliU32[N]"` 3553 SliI64 []int64 `groot:"sliU64[N]"` 3554 SliU8 []uint8 `groot:"sliU8[N]"` 3555 SliU16 []uint16 `groot:"sliU16[N]"` 3556 SliU32 []uint32 `groot:"sliU32[N]"` 3557 SliU64 []uint64 `groot:"sliU64[N]"` 3558 SliF32 []float32 `groot:"sliF32[N]"` 3559 SliF64 []float64 `groot:"sliF64[N]"` 3560 3561 Particle Particle `groot:"particle"` 3562 } 3563 return &T{ 3564 Name: "Go-HEP", 3565 3566 B: true, 3567 I8: -8, 3568 I16: -16, 3569 I32: -32, 3570 I64: -64, 3571 U8: 8, 3572 U16: 16, 3573 U32: 32, 3574 U64: 64, 3575 F32: -32, 3576 F64: -64, 3577 3578 ArrB: [3]bool{true, false, true}, 3579 ArrI8: [3]int8{-18, -28, -38}, 3580 ArrI16: [3]int16{-18, -28, -38}, 3581 ArrI32: [3]int32{-132, -232, -332}, 3582 ArrI64: [3]int64{-164, -264, -364}, 3583 ArrU8: [3]uint8{18, 28, 38}, 3584 ArrU16: [3]uint16{18, 28, 38}, 3585 ArrU32: [3]uint32{132, 232, 332}, 3586 ArrU64: [3]uint64{164, 264, 364}, 3587 ArrF32: [3]float32{-132, -232, -332}, 3588 ArrF64: [3]float64{-164, -264, -364}, 3589 3590 N: 2, 3591 SliB: []bool{true, false}, 3592 SliI8: []int8{-18, -28}, 3593 SliI16: []int16{-18, -28}, 3594 SliI32: []int32{-132, -232}, 3595 SliI64: []int64{-164, -264}, 3596 SliU8: []uint8{18, 28}, 3597 SliU16: []uint16{18, 28}, 3598 SliU32: []uint32{132, 232}, 3599 SliU64: []uint64{164, 264}, 3600 SliF32: []float32{-132, -232}, 3601 SliF64: []float64{-164, -264}, 3602 3603 Particle: Particle{Pos: P2{142, 166}, Name: "HEP-1"}, 3604 } 3605 }(), 3606 si: &StreamerInfo{ 3607 named: *rbase.NewNamed("T", "T"), 3608 objarr: rcont.NewObjArray(), 3609 elems: []rbytes.StreamerElement{ 3610 &StreamerString{Element{ 3611 Name: *rbase.NewNamed("name", ""), 3612 Type: rmeta.TString, 3613 Size: 24, 3614 EName: "TString", 3615 }.New()}, 3616 3617 &StreamerBasicType{ 3618 StreamerElement: Element{ 3619 Name: *rbase.NewNamed("b", ""), 3620 Type: rmeta.Bool, 3621 EName: "bool", 3622 }.New(), 3623 }, 3624 &StreamerBasicType{ 3625 StreamerElement: Element{ 3626 Name: *rbase.NewNamed("i8", ""), 3627 Type: rmeta.Int8, 3628 EName: "int8_t", 3629 }.New(), 3630 }, 3631 &StreamerBasicType{ 3632 StreamerElement: Element{ 3633 Name: *rbase.NewNamed("i16", ""), 3634 Type: rmeta.Int16, 3635 EName: "int16_t", 3636 }.New(), 3637 }, 3638 &StreamerBasicType{ 3639 StreamerElement: Element{ 3640 Name: *rbase.NewNamed("i32", ""), 3641 Type: rmeta.Int32, 3642 EName: "int32_t", 3643 }.New(), 3644 }, 3645 &StreamerBasicType{ 3646 StreamerElement: Element{ 3647 Name: *rbase.NewNamed("i64", ""), 3648 Type: rmeta.Int64, 3649 EName: "int64_t", 3650 }.New(), 3651 }, 3652 &StreamerBasicType{ 3653 StreamerElement: Element{ 3654 Name: *rbase.NewNamed("u8", ""), 3655 Type: rmeta.Uint8, 3656 EName: "uint8_t", 3657 }.New(), 3658 }, 3659 &StreamerBasicType{ 3660 StreamerElement: Element{ 3661 Name: *rbase.NewNamed("u16", ""), 3662 Type: rmeta.Uint16, 3663 EName: "uint16_t", 3664 }.New(), 3665 }, 3666 &StreamerBasicType{ 3667 StreamerElement: Element{ 3668 Name: *rbase.NewNamed("u32", ""), 3669 Type: rmeta.Uint32, 3670 EName: "uint32_t", 3671 }.New(), 3672 }, 3673 &StreamerBasicType{ 3674 StreamerElement: Element{ 3675 Name: *rbase.NewNamed("u64", ""), 3676 Type: rmeta.Uint64, 3677 EName: "uint64_t", 3678 }.New(), 3679 }, 3680 &StreamerBasicType{ 3681 StreamerElement: Element{ 3682 Name: *rbase.NewNamed("f32", ""), 3683 Type: rmeta.Float32, 3684 EName: "float32_t", 3685 }.New(), 3686 }, 3687 &StreamerBasicType{ 3688 StreamerElement: Element{ 3689 Name: *rbase.NewNamed("f64", ""), 3690 Type: rmeta.Float64, 3691 EName: "float64_t", 3692 }.New(), 3693 }, 3694 3695 // arrays 3696 &StreamerBasicType{ 3697 StreamerElement: Element{ 3698 Name: *rbase.NewNamed("arrB", ""), 3699 Type: rmeta.OffsetL + rmeta.Bool, 3700 Size: 3 * 1, 3701 ArrLen: 3, 3702 ArrDim: 1, 3703 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3704 EName: "bool*", 3705 }.New(), 3706 }, 3707 &StreamerBasicType{ 3708 StreamerElement: Element{ 3709 Name: *rbase.NewNamed("arrI8", ""), 3710 Type: rmeta.OffsetL + rmeta.Int8, 3711 Size: 3 * 1, 3712 ArrLen: 3, 3713 ArrDim: 1, 3714 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3715 EName: "int8_t*", 3716 }.New(), 3717 }, 3718 &StreamerBasicType{ 3719 StreamerElement: Element{ 3720 Name: *rbase.NewNamed("arrI16", ""), 3721 Type: rmeta.OffsetL + rmeta.Int16, 3722 Size: 3 * 2, 3723 ArrLen: 3, 3724 ArrDim: 1, 3725 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3726 EName: "int16_t*", 3727 }.New(), 3728 }, 3729 &StreamerBasicType{ 3730 StreamerElement: Element{ 3731 Name: *rbase.NewNamed("arrI32", ""), 3732 Type: rmeta.OffsetL + rmeta.Int32, 3733 Size: 3 * 4, 3734 ArrLen: 3, 3735 ArrDim: 1, 3736 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3737 EName: "int32_t*", 3738 }.New(), 3739 }, 3740 &StreamerBasicType{ 3741 StreamerElement: Element{ 3742 Name: *rbase.NewNamed("arrI64", ""), 3743 Type: rmeta.OffsetL + rmeta.Int64, 3744 Size: 3 * 8, 3745 ArrLen: 3, 3746 ArrDim: 1, 3747 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3748 EName: "int64_t*", 3749 }.New(), 3750 }, 3751 &StreamerBasicType{ 3752 StreamerElement: Element{ 3753 Name: *rbase.NewNamed("arrU8", ""), 3754 Type: rmeta.OffsetL + rmeta.Uint8, 3755 Size: 3 * 1, 3756 ArrLen: 3, 3757 ArrDim: 1, 3758 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3759 EName: "uint8_t*", 3760 }.New(), 3761 }, 3762 &StreamerBasicType{ 3763 StreamerElement: Element{ 3764 Name: *rbase.NewNamed("arrU16", ""), 3765 Type: rmeta.OffsetL + rmeta.Uint16, 3766 Size: 3 * 2, 3767 ArrLen: 3, 3768 ArrDim: 1, 3769 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3770 EName: "uint16_t*", 3771 }.New(), 3772 }, 3773 &StreamerBasicType{ 3774 StreamerElement: Element{ 3775 Name: *rbase.NewNamed("arrU32", ""), 3776 Type: rmeta.OffsetL + rmeta.Uint32, 3777 Size: 3 * 4, 3778 ArrLen: 3, 3779 ArrDim: 1, 3780 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3781 EName: "uint32_t*", 3782 }.New(), 3783 }, 3784 &StreamerBasicType{ 3785 StreamerElement: Element{ 3786 Name: *rbase.NewNamed("arrU64", ""), 3787 Type: rmeta.OffsetL + rmeta.Uint64, 3788 Size: 3 * 8, 3789 ArrLen: 3, 3790 ArrDim: 1, 3791 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3792 EName: "uint64_t*", 3793 }.New(), 3794 }, 3795 &StreamerBasicType{ 3796 StreamerElement: Element{ 3797 Name: *rbase.NewNamed("arrF32", ""), 3798 Type: rmeta.OffsetL + rmeta.Float32, 3799 Size: 3 * 4, 3800 ArrLen: 3, 3801 ArrDim: 1, 3802 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3803 EName: "float32_t*", 3804 }.New(), 3805 }, 3806 &StreamerBasicType{ 3807 StreamerElement: Element{ 3808 Name: *rbase.NewNamed("arrF64", ""), 3809 Type: rmeta.OffsetL + rmeta.Float64, 3810 Size: 3 * 8, 3811 ArrLen: 3, 3812 ArrDim: 1, 3813 MaxIdx: [5]int32{3, 0, 0, 0, 0}, 3814 EName: "float64_t*", 3815 }.New(), 3816 }, 3817 3818 // var-len arrays 3819 &StreamerBasicType{ 3820 StreamerElement: Element{ 3821 Name: *rbase.NewNamed("N", ""), 3822 Type: rmeta.Counter, 3823 Size: 4, 3824 EName: "int32_t", 3825 }.New(), 3826 }, 3827 NewStreamerBasicPointer( 3828 Element{ 3829 Name: *rbase.NewNamed("sliB", "[N]"), 3830 Type: rmeta.OffsetP + rmeta.Bool, 3831 Size: 1, 3832 EName: "bool*", 3833 }.New(), 1, "N", "T", 3834 ), 3835 NewStreamerBasicPointer( 3836 Element{ 3837 Name: *rbase.NewNamed("sliI8", "[N]"), 3838 Type: rmeta.OffsetP + rmeta.Int8, 3839 Size: 1, 3840 EName: "int8_t*", 3841 }.New(), 1, "N", "T", 3842 ), 3843 NewStreamerBasicPointer( 3844 Element{ 3845 Name: *rbase.NewNamed("sliI16", "[N]"), 3846 Type: rmeta.OffsetP + rmeta.Int16, 3847 Size: 1, 3848 EName: "int16_t*", 3849 }.New(), 1, "N", "T", 3850 ), 3851 NewStreamerBasicPointer( 3852 Element{ 3853 Name: *rbase.NewNamed("sliI32", "[N]"), 3854 Type: rmeta.OffsetP + rmeta.Int32, 3855 Size: 1, 3856 EName: "int32_t*", 3857 }.New(), 1, "N", "T", 3858 ), 3859 NewStreamerBasicPointer( 3860 Element{ 3861 Name: *rbase.NewNamed("sliI64", "[N]"), 3862 Type: rmeta.OffsetP + rmeta.Int64, 3863 Size: 1, 3864 EName: "int64_t*", 3865 }.New(), 1, "N", "T", 3866 ), 3867 NewStreamerBasicPointer( 3868 Element{ 3869 Name: *rbase.NewNamed("sliU8", "[N]"), 3870 Type: rmeta.OffsetP + rmeta.Uint8, 3871 Size: 1, 3872 EName: "uint8_t*", 3873 }.New(), 1, "N", "T", 3874 ), 3875 NewStreamerBasicPointer( 3876 Element{ 3877 Name: *rbase.NewNamed("sliU16", "[N]"), 3878 Type: rmeta.OffsetP + rmeta.Uint16, 3879 Size: 1, 3880 EName: "uint16_t*", 3881 }.New(), 1, "N", "T", 3882 ), 3883 NewStreamerBasicPointer( 3884 Element{ 3885 Name: *rbase.NewNamed("sliU32", "[N]"), 3886 Type: rmeta.OffsetP + rmeta.Uint32, 3887 Size: 1, 3888 EName: "uint32_t*", 3889 }.New(), 1, "N", "T", 3890 ), 3891 NewStreamerBasicPointer( 3892 Element{ 3893 Name: *rbase.NewNamed("sliU64", "[N]"), 3894 Type: rmeta.OffsetP + rmeta.Uint64, 3895 Size: 1, 3896 EName: "uint64_t*", 3897 }.New(), 1, "N", "T", 3898 ), 3899 NewStreamerBasicPointer( 3900 Element{ 3901 Name: *rbase.NewNamed("sliF32", "[N]"), 3902 Type: rmeta.OffsetP + rmeta.Float32, 3903 Size: 1, 3904 EName: "float32_t*", 3905 }.New(), 1, "N", "T", 3906 ), 3907 NewStreamerBasicPointer( 3908 Element{ 3909 Name: *rbase.NewNamed("sliF64", "[N]"), 3910 Type: rmeta.OffsetP + rmeta.Float64, 3911 Size: 1, 3912 EName: "float64_t*", 3913 }.New(), 1, "N", "T", 3914 ), 3915 3916 &StreamerObjectAny{ 3917 StreamerElement: Element{ 3918 Name: *rbase.NewNamed("particle", ""), 3919 Type: rmeta.Any, 3920 Size: 4 + 8 + 24, 3921 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3922 EName: "Particle", 3923 }.New(), 3924 }, 3925 }, 3926 }, 3927 deps: []rbytes.StreamerInfo{ 3928 &StreamerInfo{ 3929 named: *rbase.NewNamed("Particle", "Particle"), 3930 objarr: rcont.NewObjArray(), 3931 elems: []rbytes.StreamerElement{ 3932 &StreamerObjectAny{ 3933 StreamerElement: Element{ 3934 Name: *rbase.NewNamed("pos", ""), 3935 Type: rmeta.Any, 3936 Size: 4 + 8, 3937 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3938 EName: "P2", 3939 }.New(), 3940 }, 3941 &StreamerString{Element{ 3942 Name: *rbase.NewNamed("name", ""), 3943 Type: rmeta.TString, 3944 Size: 24, 3945 EName: "TString", 3946 }.New()}, 3947 }, 3948 }, 3949 &StreamerInfo{ 3950 named: *rbase.NewNamed("P2", "P2"), 3951 objarr: rcont.NewObjArray(), 3952 elems: []rbytes.StreamerElement{ 3953 &StreamerBasicType{ 3954 StreamerElement: Element{ 3955 Name: *rbase.NewNamed("px", ""), 3956 Type: rmeta.Float32, 3957 Size: 4, 3958 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3959 EName: "float32", 3960 }.New(), 3961 }, 3962 &StreamerBasicType{ 3963 StreamerElement: Element{ 3964 Name: *rbase.NewNamed("py", ""), 3965 Type: rmeta.Float64, 3966 Size: 8, 3967 MaxIdx: [5]int32{0, 0, 0, 0, 0}, 3968 EName: "float64", 3969 }.New(), 3970 }, 3971 }, 3972 }, 3973 }, 3974 }, 3975 } { 3976 t.Run(tc.name, func(t *testing.T) { 3977 if tc.skip { 3978 t.Skipf("skipping %s", tc.name) 3979 } 3980 3981 for _, dep := range tc.deps { 3982 StreamerInfos.Add(dep) 3983 } 3984 defer func() { 3985 StreamerInfos.Lock() 3986 defer StreamerInfos.Unlock() 3987 for _, dep := range tc.deps { 3988 key := streamerDbKey{ 3989 class: dep.Name(), 3990 version: dep.ClassVersion(), 3991 } 3992 delete(StreamerInfos.db, key) 3993 } 3994 }() 3995 3996 err := tc.si.BuildStreamers() 3997 if err != nil { 3998 t.Fatalf("could not build streamers: %+v", err) 3999 } 4000 4001 for i, se := range tc.si.Elements() { 4002 t.Run(se.Name(), func(t *testing.T) { 4003 ptr := reflect.ValueOf(tc.ptr).Elem().Field(i).Addr().Interface() 4004 4005 wbuf := rbytes.NewWBuffer(nil, nil, 0, nil) 4006 w, err := WStreamerOf(tc.si, i, kind) 4007 if err != nil { 4008 t.Fatalf("could not create write-streamer: %+v", err) 4009 } 4010 4011 err = w.(rbytes.Binder).Bind(ptr) 4012 if err != nil { 4013 t.Fatalf("could not bind write-streamer: %+v", err) 4014 } 4015 4016 if rv := reflect.ValueOf(ptr).Elem(); rv.Kind() == reflect.Slice { 4017 w.(*wstreamerElem).wop.cfg.count = func() int { return rv.Len() } 4018 } 4019 4020 err = w.WStreamROOT(wbuf) 4021 if err != nil { 4022 t.Fatalf("could not write value: %+v", err) 4023 } 4024 4025 rbuf := rbytes.NewRBuffer(wbuf.Bytes(), nil, 0, nil) 4026 r, err := RStreamerOf(tc.si, i, kind) 4027 if err != nil { 4028 t.Fatalf("could not create read-streamer: %+v", err) 4029 } 4030 4031 rv := reflect.New(reflect.TypeOf(ptr).Elem()).Elem() 4032 got := rv.Addr().Interface() 4033 4034 err = r.(rbytes.Binder).Bind(got) 4035 if err != nil { 4036 t.Fatalf("could not bind read-streamer: %+v", err) 4037 } 4038 4039 if rv := reflect.ValueOf(ptr).Elem(); rv.Kind() == reflect.Slice { 4040 err = r.(rbytes.Counter).Count(func() int { return rv.Len() }) 4041 if err != nil { 4042 t.Fatalf("could not set read-streamer counter: %+v", err) 4043 } 4044 } 4045 4046 err = r.RStreamROOT(rbuf) 4047 if err != nil { 4048 t.Fatalf("could not read value: %+v", err) 4049 } 4050 4051 if got, want := got, ptr; !reflect.DeepEqual(got, want) { 4052 t.Fatalf("invalid round-trip:\ngot= %#v\nwant=%#v", got, want) 4053 } 4054 }) 4055 } 4056 }) 4057 } 4058 } 4059 4060 type PtrToAny_T struct { 4061 Pos *rcont.ArrayD `groot:"pos"` 4062 Nil *rcont.ArrayD `groot:"nil"` 4063 } 4064 4065 func (*PtrToAny_T) RVersion() int16 { return 41 } 4066 func (*PtrToAny_T) Class() string { return "Particle" } 4067 4068 func (p *PtrToAny_T) MarshalROOT(w *rbytes.WBuffer) (int, error) { 4069 if w.Err() != nil { 4070 return 0, w.Err() 4071 } 4072 4073 hdr := w.WriteHeader(p.Class(), p.RVersion()) 4074 w.WriteObjectAny(p.Pos) 4075 w.WriteObjectAny(p.Nil) 4076 4077 return w.SetHeader(hdr) 4078 } 4079 4080 func (p *PtrToAny_T) UnmarshalROOT(r *rbytes.RBuffer) error { 4081 if r.Err() != nil { 4082 return r.Err() 4083 } 4084 4085 hdr := r.ReadHeader(p.Class(), p.RVersion()) 4086 if hdr.Vers != p.RVersion() { 4087 return fmt.Errorf("invalid particle version: got=%d, want=%d", hdr.Vers, p.RVersion()) 4088 } 4089 4090 p.Pos = nil 4091 if obj := r.ReadObjectAny(); obj != nil { 4092 p.Pos = obj.(*rcont.ArrayD) 4093 } 4094 4095 p.Nil = nil 4096 if obj := r.ReadObjectAny(); obj != nil { 4097 p.Nil = obj.(*rcont.ArrayD) 4098 } 4099 4100 r.CheckHeader(hdr) 4101 return r.Err() 4102 } 4103 4104 var ( 4105 _ root.Object = (*PtrToAny_T)(nil) 4106 _ rbytes.Marshaler = (*PtrToAny_T)(nil) 4107 _ rbytes.Unmarshaler = (*PtrToAny_T)(nil) 4108 )