/
streamers.go
65 lines (55 loc) · 1.51 KB
/
streamers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Copyright ©2017 The go-hep Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package riofs
import (
"fmt"
"regexp"
"strings"
"go-hep.org/x/hep/groot/rbytes"
"go-hep.org/x/hep/groot/rdict"
"go-hep.org/x/hep/groot/rmeta"
"go-hep.org/x/hep/groot/root"
)
var (
reStdVector = regexp.MustCompile("^vector<(.+)>$")
)
func stdvecSIFrom(name, ename string, ctx rbytes.StreamerInfoContext) rbytes.StreamerInfo {
const vers = 1
ename = strings.TrimSpace(ename)
if etyp, ok := rmeta.CxxBuiltins[ename]; ok {
si := rdict.NewStreamerInfo(name, vers, []rbytes.StreamerElement{
rdict.NewStreamerSTL(
name, rmeta.STLvector, rmeta.GoType2ROOTEnum[etyp],
),
})
return si
}
esi, err := ctx.StreamerInfo(ename, -1)
if esi == nil || err != nil {
return nil
}
si := rdict.NewStreamerInfo(name, vers, []rbytes.StreamerElement{
rdict.NewStreamerSTL(name, rmeta.STLvector, rmeta.Object),
})
return si
}
type streamerInfoStore interface {
addStreamer(si rbytes.StreamerInfo)
}
func streamerInfoFrom(obj root.Object, sictx streamerInfoStore) (rbytes.StreamerInfo, error) {
var (
typename = obj.Class()
cxxtype = rdict.GoName2Cxx(typename)
vers = -1
)
if o, ok := obj.(rbytes.RVersioner); ok {
vers = int(o.RVersion())
}
si, ok := rdict.StreamerInfos.Get(cxxtype, vers)
if !ok {
return nil, fmt.Errorf("riofs: could not find streamer for %q (version=%d)", cxxtype, vers)
}
sictx.addStreamer(si)
return si, nil
}