Skip to content

Commit c31af82

Browse files
committed
groot/{cmd/root-gen-type,riofs}: add testdata for base+derived classes
1 parent 8883629 commit c31af82

File tree

5 files changed

+365
-0
lines changed

5 files changed

+365
-0
lines changed

groot/cmd/root-gen-type/main_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ func TestGenerate(t *testing.T) {
3737
want: "testdata/small-evnt-tree-fullsplit.txt",
3838
types: []string{"Event", "P3"},
3939
},
40+
{
41+
fname: "../../testdata/tbase.root",
42+
want: "testdata/tbase.txt",
43+
types: []string{"Base", "D1", "D2"},
44+
},
4045
} {
4146
t.Run(tc.fname, func(t *testing.T) {
4247
oname := filepath.Base(tc.fname) + ".go"
+284
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
// DO NOT EDIT; automatically generated by root-gen-type
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
"reflect"
8+
9+
"go-hep.org/x/hep/groot/rbase"
10+
"go-hep.org/x/hep/groot/rbytes"
11+
"go-hep.org/x/hep/groot/rdict"
12+
"go-hep.org/x/hep/groot/rmeta"
13+
"go-hep.org/x/hep/groot/root"
14+
"go-hep.org/x/hep/groot/rtypes"
15+
)
16+
17+
type D1 struct {
18+
base0 Base `groot:"BASE-Base"` // base class
19+
D32 int32 `groot:"D32"`
20+
}
21+
22+
func (*D1) Class() string {
23+
return "D1"
24+
}
25+
26+
func (*D1) RVersion() int16 {
27+
return 1
28+
}
29+
30+
// MarshalROOT implements rbytes.Marshaler
31+
func (o *D1) MarshalROOT(w *rbytes.WBuffer) (int, error) {
32+
if w.Err() != nil {
33+
return 0, w.Err()
34+
}
35+
36+
hdr := w.WriteHeader(o.Class(), o.RVersion())
37+
38+
w.WriteObject(&o.base0)
39+
w.WriteI32(o.D32)
40+
41+
return w.SetHeader(hdr)
42+
}
43+
44+
// UnmarshalROOT implements rbytes.Unmarshaler
45+
func (o *D1) UnmarshalROOT(r *rbytes.RBuffer) error {
46+
if r.Err() != nil {
47+
return r.Err()
48+
}
49+
50+
hdr := r.ReadHeader(o.Class())
51+
if hdr.Vers > o.RVersion() {
52+
panic(fmt.Errorf(
53+
"rbytes: invalid %s version=%d > %d",
54+
o.Class(), hdr.Vers, o.RVersion(),
55+
))
56+
}
57+
58+
r.ReadObject(&o.base0)
59+
o.D32 = r.ReadI32()
60+
61+
r.CheckHeader(hdr)
62+
return r.Err()
63+
}
64+
65+
func init() {
66+
f := func() reflect.Value {
67+
var o D1
68+
return reflect.ValueOf(&o)
69+
}
70+
rtypes.Factory.Add("D1", f)
71+
}
72+
73+
func init() {
74+
// Streamer for D1.
75+
rdict.StreamerInfos.Add(rdict.NewCxxStreamerInfo("D1", 1, 0x665ff02a, []rbytes.StreamerElement{
76+
rdict.NewStreamerBase(rdict.Element{
77+
Name: *rbase.NewNamed("Base", ""),
78+
Type: rmeta.Base,
79+
Size: 0,
80+
ArrLen: 0,
81+
ArrDim: 0,
82+
MaxIdx: [5]int32{0, 2285240, 0, 0, 0},
83+
Offset: 0,
84+
EName: "BASE",
85+
XMin: 0.000000,
86+
XMax: 0.000000,
87+
Factor: 0.000000,
88+
}.New(), -1),
89+
&rdict.StreamerBasicType{StreamerElement: rdict.Element{
90+
Name: *rbase.NewNamed("D32", ""),
91+
Type: rmeta.Int,
92+
Size: 4,
93+
ArrLen: 0,
94+
ArrDim: 0,
95+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
96+
Offset: 0,
97+
EName: "int",
98+
XMin: 0.000000,
99+
XMax: 0.000000,
100+
Factor: 0.000000,
101+
}.New()},
102+
}))
103+
}
104+
105+
var (
106+
_ root.Object = (*D1)(nil)
107+
_ rbytes.RVersioner = (*D1)(nil)
108+
_ rbytes.Marshaler = (*D1)(nil)
109+
_ rbytes.Unmarshaler = (*D1)(nil)
110+
)
111+
112+
type Base struct {
113+
I32 int32 `groot:"I32"`
114+
}
115+
116+
func (*Base) Class() string {
117+
return "Base"
118+
}
119+
120+
func (*Base) RVersion() int16 {
121+
return 1
122+
}
123+
124+
// MarshalROOT implements rbytes.Marshaler
125+
func (o *Base) MarshalROOT(w *rbytes.WBuffer) (int, error) {
126+
if w.Err() != nil {
127+
return 0, w.Err()
128+
}
129+
130+
hdr := w.WriteHeader(o.Class(), o.RVersion())
131+
132+
w.WriteI32(o.I32)
133+
134+
return w.SetHeader(hdr)
135+
}
136+
137+
// UnmarshalROOT implements rbytes.Unmarshaler
138+
func (o *Base) UnmarshalROOT(r *rbytes.RBuffer) error {
139+
if r.Err() != nil {
140+
return r.Err()
141+
}
142+
143+
hdr := r.ReadHeader(o.Class())
144+
if hdr.Vers > o.RVersion() {
145+
panic(fmt.Errorf(
146+
"rbytes: invalid %s version=%d > %d",
147+
o.Class(), hdr.Vers, o.RVersion(),
148+
))
149+
}
150+
151+
o.I32 = r.ReadI32()
152+
153+
r.CheckHeader(hdr)
154+
return r.Err()
155+
}
156+
157+
func init() {
158+
f := func() reflect.Value {
159+
var o Base
160+
return reflect.ValueOf(&o)
161+
}
162+
rtypes.Factory.Add("Base", f)
163+
}
164+
165+
func init() {
166+
// Streamer for Base.
167+
rdict.StreamerInfos.Add(rdict.NewCxxStreamerInfo("Base", 1, 0x22deb8, []rbytes.StreamerElement{
168+
&rdict.StreamerBasicType{StreamerElement: rdict.Element{
169+
Name: *rbase.NewNamed("I32", ""),
170+
Type: rmeta.Int,
171+
Size: 4,
172+
ArrLen: 0,
173+
ArrDim: 0,
174+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
175+
Offset: 0,
176+
EName: "int",
177+
XMin: 0.000000,
178+
XMax: 0.000000,
179+
Factor: 0.000000,
180+
}.New()},
181+
}))
182+
}
183+
184+
var (
185+
_ root.Object = (*Base)(nil)
186+
_ rbytes.RVersioner = (*Base)(nil)
187+
_ rbytes.Marshaler = (*Base)(nil)
188+
_ rbytes.Unmarshaler = (*Base)(nil)
189+
)
190+
191+
type D2 struct {
192+
base0 Base `groot:"BASE-Base"` // base class
193+
I32 int32 `groot:"I32"`
194+
}
195+
196+
func (*D2) Class() string {
197+
return "D2"
198+
}
199+
200+
func (*D2) RVersion() int16 {
201+
return 1
202+
}
203+
204+
// MarshalROOT implements rbytes.Marshaler
205+
func (o *D2) MarshalROOT(w *rbytes.WBuffer) (int, error) {
206+
if w.Err() != nil {
207+
return 0, w.Err()
208+
}
209+
210+
hdr := w.WriteHeader(o.Class(), o.RVersion())
211+
212+
w.WriteObject(&o.base0)
213+
w.WriteI32(o.I32)
214+
215+
return w.SetHeader(hdr)
216+
}
217+
218+
// UnmarshalROOT implements rbytes.Unmarshaler
219+
func (o *D2) UnmarshalROOT(r *rbytes.RBuffer) error {
220+
if r.Err() != nil {
221+
return r.Err()
222+
}
223+
224+
hdr := r.ReadHeader(o.Class())
225+
if hdr.Vers > o.RVersion() {
226+
panic(fmt.Errorf(
227+
"rbytes: invalid %s version=%d > %d",
228+
o.Class(), hdr.Vers, o.RVersion(),
229+
))
230+
}
231+
232+
r.ReadObject(&o.base0)
233+
o.I32 = r.ReadI32()
234+
235+
r.CheckHeader(hdr)
236+
return r.Err()
237+
}
238+
239+
func init() {
240+
f := func() reflect.Value {
241+
var o D2
242+
return reflect.ValueOf(&o)
243+
}
244+
rtypes.Factory.Add("D2", f)
245+
}
246+
247+
func init() {
248+
// Streamer for D2.
249+
rdict.StreamerInfos.Add(rdict.NewCxxStreamerInfo("D2", 1, 0x6662a8e4, []rbytes.StreamerElement{
250+
rdict.NewStreamerBase(rdict.Element{
251+
Name: *rbase.NewNamed("Base", ""),
252+
Type: rmeta.Base,
253+
Size: 0,
254+
ArrLen: 0,
255+
ArrDim: 0,
256+
MaxIdx: [5]int32{0, 2285240, 0, 0, 0},
257+
Offset: 0,
258+
EName: "BASE",
259+
XMin: 0.000000,
260+
XMax: 0.000000,
261+
Factor: 0.000000,
262+
}.New(), -1),
263+
&rdict.StreamerBasicType{StreamerElement: rdict.Element{
264+
Name: *rbase.NewNamed("I32", ""),
265+
Type: rmeta.Int,
266+
Size: 4,
267+
ArrLen: 0,
268+
ArrDim: 0,
269+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
270+
Offset: 0,
271+
EName: "int",
272+
XMin: 0.000000,
273+
XMax: 0.000000,
274+
Factor: 0.000000,
275+
}.New()},
276+
}))
277+
}
278+
279+
var (
280+
_ root.Object = (*D2)(nil)
281+
_ rbytes.RVersioner = (*D2)(nil)
282+
_ rbytes.Marshaler = (*D2)(nil)
283+
_ rbytes.Unmarshaler = (*D2)(nil)
284+
)

groot/riofs/gendata/gen-base.go

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// Copyright ©2022 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+
//go:build ignore
6+
7+
package main
8+
9+
import (
10+
"flag"
11+
"log"
12+
13+
"go-hep.org/x/hep/groot/internal/rtests"
14+
)
15+
16+
var (
17+
root = flag.String("f", "test-base.root", "output ROOT file")
18+
split = flag.Int("split", 0, "default split-level for TTree")
19+
)
20+
21+
func main() {
22+
flag.Parse()
23+
24+
out, err := rtests.RunCxxROOT("gentree", []byte(script), *root, *split)
25+
if err != nil {
26+
log.Fatalf("could not run ROOT macro:\noutput:\n%v\nerror: %+v", string(out), err)
27+
}
28+
}
29+
30+
const script = `
31+
#include <stdint.h>
32+
33+
class Base {
34+
public:
35+
int32_t I32;
36+
};
37+
38+
class D1 : public Base {
39+
public:
40+
int32_t D32;
41+
};
42+
43+
class D2 : public Base {
44+
public:
45+
int32_t I32;
46+
};
47+
48+
void gentree(const char* fname, int splitlvl = 99) {
49+
int bufsize = 32000;
50+
int evtmax = 2;
51+
52+
auto f = TFile::Open(fname, "RECREATE");
53+
auto t = new TTree("tree", "my tree title");
54+
55+
D1 d1;
56+
D2 d2;
57+
58+
t->Branch("d1", &d1, bufsize, splitlvl);
59+
t->Branch("d2", &d2, bufsize, splitlvl);
60+
61+
for (int i = 0; i != evtmax; i++) {
62+
d1.I32 = i+1;
63+
d1.D32 = i+2;
64+
((Base*)&d2)->I32 = i+3;
65+
d2.I32 = i+4;
66+
67+
t->Fill();
68+
}
69+
70+
f->Write();
71+
f->Close();
72+
73+
exit(0);
74+
}
75+
`

groot/riofs/riofs.go

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
//go:generate go run ./gendata/gen-tprofile.go -f ../testdata/tprofile.root
3535
//go:generate go run ./gendata/gen-tgme.go -f ../testdata/tgme.root
3636
//go:generate go run ./gendata/gen-tdatime.go -f ../testdata/tdatime.root
37+
//go:generate go run ./gendata/gen-base.go -f ../testdata/tbase.root
3738

3839
// Directory describes a ROOT directory structure in memory.
3940
type Directory interface {

groot/testdata/tbase.root

6.17 KB
Binary file not shown.

0 commit comments

Comments
 (0)