Skip to content

Commit

Permalink
groot/rbytes: export r/w std::vector<std::string>
Browse files Browse the repository at this point in the history
  • Loading branch information
sbinet committed Sep 18, 2020
1 parent 4672fa2 commit a882dde
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 0 deletions.
15 changes: 15 additions & 0 deletions groot/rbytes/rbuffer.go
Expand Up @@ -456,6 +456,21 @@ func (r *RBuffer) ReadArrayString(arr []string) {
}
}

func (r *RBuffer) ReadStdVectorStrs(sli *[]string) {
if r.err != nil {
return
}
const typename = "vector<string>"
beg := r.Pos()
_ /*vers*/, pos, bcnt := r.ReadVersion(typename)
n := int(r.ReadI32())
*sli = ResizeStr(*sli, n)
for i := range *sli {
(*sli)[i] = r.ReadString()
}
r.CheckByteCount(pos, bcnt, beg, typename)
}

func (r *RBuffer) ReadVersion(class string) (vers int16, pos, n int32) {
if r.err != nil {
return
Expand Down
25 changes: 25 additions & 0 deletions groot/rbytes/rw_test.go
Expand Up @@ -6,6 +6,7 @@ package rbytes_test

import (
"reflect"
"strings"
"testing"

"go-hep.org/x/hep/groot/rbase"
Expand Down Expand Up @@ -88,6 +89,30 @@ func TestRWStrings(t *testing.T) {
}
}

func TestRWStdVecStrings(t *testing.T) {
want := [][]string{
{"", "x", "", "xx", "", "xxx"},
{"x", "", "xx", "", "xxx"},
{"", "x", "", "xx", "", "xxx"},
{"x", "", "xx", "", "xxx", strings.Repeat("1!", 256)},
}
wbuf := rbytes.NewWBuffer(nil, nil, 0, nil)
for i, str := range want {
wbuf.WriteStdVectorStrs(str)
if err := wbuf.Err(); err != nil {
t.Errorf("could not write string #%d: %+v", i, err)
}
}
rbuf := rbytes.NewRBuffer(wbuf.Bytes(), nil, 0, nil)
for i := range want {
var got []string
rbuf.ReadStdVectorStrs(&got)
if got, want := got, want[i]; !reflect.DeepEqual(got, want) {
t.Errorf("invalid string at %d: got=%q, want=%q", i, got, want)
}
}
}

func TestRWFloat16(t *testing.T) {
makeElm := func(title string) rbytes.StreamerElement {
elm := rdict.Element{
Expand Down
22 changes: 22 additions & 0 deletions groot/rbytes/wbuffer.go
Expand Up @@ -730,6 +730,28 @@ func (w *WBuffer) WriteFastArrayString(v []string) {
}
}

func (w *WBuffer) WriteStdVectorStrs(v []string) {
const typename = "vector<string>"
if w.err != nil {
return
}
var (
pos = w.WriteVersion(rvers.StreamerInfo)
)
w.WriteI32(int32(len(v)))

n := 0
for _, v := range v {
n += w.strlen(v)
}
w.w.grow(n)

for _, v := range v {
w.writeString(v)
}
_, _ = w.SetByteCount(pos, typename)
}

var (
_ StreamerInfoContext = (*WBuffer)(nil)
)

0 comments on commit a882dde

Please sign in to comment.