Skip to content

Commit 7dfbd65

Browse files
committed
rdict: implement r/w rmeta.STL
1 parent d6b4ed8 commit 7dfbd65

File tree

3 files changed

+328
-93
lines changed

3 files changed

+328
-93
lines changed

groot/rdict/rstreamer.go

+100-49
Original file line numberDiff line numberDiff line change
@@ -102,55 +102,106 @@ func (si *StreamerInfo) makeROp(sictx rbytes.StreamerInfoContext, i int, descr e
102102
return rstreamer{rstreamTString, cfg}
103103

104104
case rmeta.STL:
105-
panic("not implemented: rmeta.STL")
106-
107-
// var (
108-
// se = descr.elem
109-
// newClass = descr.nclass
110-
// oldClass = descr.oclass
111-
// // _, isSTLbase = se.(*StreamerBase) // FIXME(sbinet)
112-
// )
113-
//
114-
// switch {
115-
// case se.ArrayLen() <= 1:
116-
// switch {
117-
// case newClass != oldClass:
118-
// panic("not implemented")
119-
// default:
120-
// switch se := se.(type) {
121-
// case *StreamerSTL:
122-
// switch se.STLType() {
123-
// case rmeta.STLvector:
124-
// ct := se.ContainedType()
125-
// return rstreamer{
126-
// rstreamStdVector(se.TypeName(), ropFuncFor(ct, &descr)),
127-
// &streamerConfig{si, i, &descr, descr.offset, 0},
128-
// }
129-
// case rmeta.STLmap, rmeta.STLmultimap,
130-
// rmeta.STLset, rmeta.STLmultiset,
131-
// rmeta.STLunorderedmap, rmeta.STLunorderedmultimap,
132-
// rmeta.STLunorderedset, rmeta.STLunorderedmultiset:
133-
// panic("not implemented")
134-
// default:
135-
// panic("not implemented")
136-
// }
137-
// case *StreamerSTLstring:
138-
// panic("not implemented")
139-
// default:
140-
// panic("not implemented")
141-
// }
142-
// }
143-
// default:
144-
// switch {
145-
// case newClass != oldClass:
146-
// panic("not implemented")
147-
// default:
148-
// return rstreamer{
149-
// rstreamSTL(rstreamSTLArrayMbrWise, rstreamSTLObjWise, descr.oclass),
150-
// &streamerConfig{si, i, &descr, descr.offset, se.ArrayLen()},
151-
// }
152-
// }
153-
// }
105+
var (
106+
se = descr.elem
107+
newClass = descr.nclass
108+
oldClass = descr.oclass
109+
// _, isSTLbase = se.(*StreamerBase) // FIXME(sbinet)
110+
)
111+
112+
switch {
113+
case se.ArrayLen() <= 1:
114+
switch {
115+
case newClass != oldClass:
116+
panic("rdict: rmeta.STL (w/ old-class != new-class) not implemented")
117+
default:
118+
switch se := se.(type) {
119+
default:
120+
panic(fmt.Errorf("rdict: invalid streamer element: %#v", se))
121+
122+
case *StreamerSTLstring:
123+
return rstreamer{rstreamStdString, cfg}
124+
case *StreamerSTL:
125+
switch se.STLType() {
126+
case rmeta.STLvector:
127+
var (
128+
ct = se.ContainedType()
129+
typename = se.TypeName()
130+
enames = rmeta.CxxTemplateArgsOf(typename)
131+
rop = ropFrom(sictx, enames[0], -1, ct, &descr)
132+
)
133+
return rstreamer{
134+
rstreamStdVector(typename, rop),
135+
cfg,
136+
}
137+
138+
case rmeta.STLset, rmeta.STLunorderedset:
139+
var (
140+
ct = se.ContainedType()
141+
typename = se.TypeName()
142+
enames = rmeta.CxxTemplateArgsOf(typename)
143+
rop = ropFrom(sictx, enames[0], -1, ct, &descr)
144+
)
145+
return rstreamer{
146+
rstreamStdSet(typename, rop),
147+
cfg,
148+
}
149+
150+
case rmeta.STLlist:
151+
var (
152+
ct = se.ContainedType()
153+
typename = se.TypeName()
154+
enames = rmeta.CxxTemplateArgsOf(typename)
155+
rop = ropFrom(sictx, enames[0], -1, ct, &descr)
156+
)
157+
return rstreamer{
158+
rstreamStdList(typename, rop),
159+
cfg,
160+
}
161+
162+
case rmeta.STLdeque:
163+
var (
164+
ct = se.ContainedType()
165+
typename = se.TypeName()
166+
enames = rmeta.CxxTemplateArgsOf(typename)
167+
rop = ropFrom(sictx, enames[0], -1, ct, &descr)
168+
)
169+
return rstreamer{
170+
rstreamStdList(typename, rop),
171+
cfg,
172+
}
173+
174+
case rmeta.STLmap, rmeta.STLunorderedmap:
175+
var (
176+
ct = se.ContainedType()
177+
enames = rmeta.CxxTemplateArgsOf(se.TypeName())
178+
kname = enames[0]
179+
vname = enames[1]
180+
)
181+
182+
krop := ropFrom(sictx, kname, -1, ct, &descr)
183+
vrop := ropFrom(sictx, vname, -1, ct, &descr)
184+
return rstreamer{
185+
rstreamStdMap(kname, vname, krop, vrop),
186+
cfg,
187+
}
188+
default:
189+
panic(fmt.Errorf("rdict: STL container type=%v not handled", se.STLType()))
190+
}
191+
}
192+
}
193+
default:
194+
panic("rdict: rmeta.STL (w/ array-len > 1) not implemented")
195+
// switch {
196+
// case newClass != oldClass:
197+
// panic("not implemented")
198+
// default:
199+
// return rstreamer{
200+
// rstreamSTL(rstreamSTLArrayMbrWise, rstreamSTLObjWise, descr.oclass),
201+
// &streamerConfig{si, i, &descr, descr.offset, se.ArrayLen()},
202+
// }
203+
// }
204+
}
154205

155206
case rmeta.Conv + rmeta.Bool:
156207
return rstreamer{rstreamCnv(descr.ntype, rstreamBool), cfg}

groot/rdict/rwstreamer_test.go

+128
Original file line numberDiff line numberDiff line change
@@ -2995,6 +2995,134 @@ func TestRWStream(t *testing.T) {
29952995
},
29962996
},
29972997
},
2998+
{
2999+
name: "rmeta-stl-string",
3000+
ptr: &struct {
3001+
F string
3002+
}{"Go-HEP"},
3003+
si: &StreamerInfo{
3004+
named: *rbase.NewNamed("T", "T"),
3005+
objarr: rcont.NewObjArray(),
3006+
elems: []rbytes.StreamerElement{
3007+
&StreamerSTLstring{
3008+
StreamerSTL: *NewCxxStreamerSTL(Element{
3009+
Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"),
3010+
Type: rmeta.STL,
3011+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
3012+
EName: "vector<string>",
3013+
}.New(), rmeta.ESTLType(rmeta.STLstring), rmeta.STLstring),
3014+
},
3015+
},
3016+
},
3017+
},
3018+
{
3019+
name: "rmeta-stl-vector<float>",
3020+
ptr: &struct {
3021+
F []float32
3022+
}{[]float32{1, 2, 3}},
3023+
si: &StreamerInfo{
3024+
named: *rbase.NewNamed("T", "T"),
3025+
objarr: rcont.NewObjArray(),
3026+
elems: []rbytes.StreamerElement{
3027+
NewCxxStreamerSTL(Element{
3028+
Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"),
3029+
Type: rmeta.STL,
3030+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
3031+
EName: "vector<float>",
3032+
}.New(), rmeta.STLvector, rmeta.Float32),
3033+
},
3034+
},
3035+
},
3036+
{
3037+
name: "rmeta-stl-set<float>",
3038+
ptr: &struct {
3039+
F []float32
3040+
}{[]float32{1, 2, 3}},
3041+
si: &StreamerInfo{
3042+
named: *rbase.NewNamed("T", "T"),
3043+
objarr: rcont.NewObjArray(),
3044+
elems: []rbytes.StreamerElement{
3045+
NewCxxStreamerSTL(Element{
3046+
Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"),
3047+
Type: rmeta.STL,
3048+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
3049+
EName: "set<float>",
3050+
}.New(), rmeta.STLset, rmeta.Float32),
3051+
},
3052+
},
3053+
},
3054+
{
3055+
name: "rmeta-stl-list<float>",
3056+
ptr: &struct {
3057+
F []float32
3058+
}{[]float32{1, 2, 3}},
3059+
si: &StreamerInfo{
3060+
named: *rbase.NewNamed("T", "T"),
3061+
objarr: rcont.NewObjArray(),
3062+
elems: []rbytes.StreamerElement{
3063+
NewCxxStreamerSTL(Element{
3064+
Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"),
3065+
Type: rmeta.STL,
3066+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
3067+
EName: "list<float>",
3068+
}.New(), rmeta.STLlist, rmeta.Float32),
3069+
},
3070+
},
3071+
},
3072+
{
3073+
name: "rmeta-stl-deque<float>",
3074+
ptr: &struct {
3075+
F []float32
3076+
}{[]float32{1, 2, 3}},
3077+
si: &StreamerInfo{
3078+
named: *rbase.NewNamed("T", "T"),
3079+
objarr: rcont.NewObjArray(),
3080+
elems: []rbytes.StreamerElement{
3081+
NewCxxStreamerSTL(Element{
3082+
Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"),
3083+
Type: rmeta.STL,
3084+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
3085+
EName: "deque<float>",
3086+
}.New(), rmeta.STLdeque, rmeta.Float32),
3087+
},
3088+
},
3089+
},
3090+
{
3091+
name: "rmeta-stl-map<int,float>",
3092+
ptr: &struct {
3093+
F map[int32]float32
3094+
}{map[int32]float32{1: 1, 2: 2, 3: 3}},
3095+
si: &StreamerInfo{
3096+
named: *rbase.NewNamed("T", "T"),
3097+
objarr: rcont.NewObjArray(),
3098+
elems: []rbytes.StreamerElement{
3099+
NewCxxStreamerSTL(Element{
3100+
Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"),
3101+
Type: rmeta.STL,
3102+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
3103+
EName: "map<int,float>",
3104+
}.New(), rmeta.STLmap, rmeta.Object),
3105+
},
3106+
},
3107+
},
3108+
{
3109+
name: "rmeta-stl-vector<string>",
3110+
ptr: &struct {
3111+
F []string
3112+
}{[]string{"hello", "world", "Go-HEP"}},
3113+
si: &StreamerInfo{
3114+
named: *rbase.NewNamed("T", "T"),
3115+
objarr: rcont.NewObjArray(),
3116+
elems: []rbytes.StreamerElement{
3117+
NewCxxStreamerSTL(Element{
3118+
Name: *rbase.NewNamed("This", "Used to call the proper TStreamerInfo case"),
3119+
Type: rmeta.STL,
3120+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
3121+
EName: "vector<string>",
3122+
}.New(), rmeta.STLvector, rmeta.STLstring),
3123+
},
3124+
},
3125+
},
29983126
} {
29993127
t.Run(tc.name, func(t *testing.T) {
30003128
if tc.skip {

0 commit comments

Comments
 (0)