Skip to content

Commit

Permalink
groot/{rcmd,riofs,rmeta}: add support for read std::vector<T,my_alloc…
Browse files Browse the repository at this point in the history
…<T>>

Fixes #820.
  • Loading branch information
sbinet committed Feb 21, 2022
1 parent 551dabd commit 0bd7c62
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 26 deletions.
4 changes: 4 additions & 0 deletions groot/rcmd/dump_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,10 @@ key[003]: eff;1 "efficiency" (TEfficiency) => ignoring key of type *rhist.Effici
name: "../testdata/pod-advanced.root",
want: loadRef("testdata/pod-advanced.root.txt"),
},
{
name: "../testdata/uproot/uproot-issue-172.root",
want: loadRef("testdata/uproot-issue-172.root.txt"),
},
} {
t.Run(tc.name, func(t *testing.T) {
got := new(strings.Builder)
Expand Down
102 changes: 102 additions & 0 deletions groot/rcmd/testdata/uproot-issue-172.root.txt

Large diffs are not rendered by default.

17 changes: 10 additions & 7 deletions groot/riofs/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -797,13 +797,16 @@ func (f *File) StreamerInfo(name string, version int) (rbytes.StreamerInfo, erro
// no streamer for "name" in that file.
// try whether "name" isn't actually std::vector<T> and a streamer
// for T is in that file.
o := reStdVector.FindStringSubmatch(name)
if o != nil {
si := stdvecSIFrom(name, o[1], f)
if si != nil {
f.sinfos = append(f.sinfos, si)
rdict.StreamerInfos.Add(si)
return si, nil
if strings.Contains(name, "<") {
cxx := rmeta.CxxTemplateFrom(name)
switch cxx.Name {
case "vector":
si := stdvecSIFrom(name, cxx.Args[0], f)
if si != nil {
f.sinfos = append(f.sinfos, si)
rdict.StreamerInfos.Add(si)
return si, nil
}
}
}

Expand Down
26 changes: 7 additions & 19 deletions groot/riofs/streamers.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,27 @@ package riofs

import (
"fmt"
"regexp"
"strings"
"reflect"

"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
return rdict.StreamerOf(ctx, reflect.SliceOf(etyp))
}
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
etyp, err := rdict.TypeFromSI(ctx, esi)
if err != nil || etyp == nil {
return nil
}
return rdict.StreamerOf(ctx, reflect.SliceOf(etyp))
}

type streamerInfoStore interface {
Expand Down
7 changes: 7 additions & 0 deletions groot/rmeta/rmeta_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ func TestCxxTemplate(t *testing.T) {
Args: []string{"T", "alloc<T>"},
},
},
{
name: "vector<float,ROOT::Detail::VecOps::RAdoptAllocator<float> >",
want: rmeta.CxxTemplate{
Name: "vector",
Args: []string{"float", "ROOT::Detail::VecOps::RAdoptAllocator<float>"},
},
},
{
name: "std::vector<std::map<K,V,Cmp>>",
want: rmeta.CxxTemplate{
Expand Down
Binary file added groot/testdata/uproot/uproot-issue-172.root
Binary file not shown.

0 comments on commit 0bd7c62

Please sign in to comment.