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  )