From a882ddeb9a89ea1aaf7194b80424959eb2d2d7f0 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Fri, 11 Sep 2020 16:16:51 +0200 Subject: [PATCH] groot/rbytes: export r/w std::vector --- groot/rbytes/rbuffer.go | 15 +++++++++++++++ groot/rbytes/rw_test.go | 25 +++++++++++++++++++++++++ groot/rbytes/wbuffer.go | 22 ++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/groot/rbytes/rbuffer.go b/groot/rbytes/rbuffer.go index 10fa1367b..ad0b4cc2d 100644 --- a/groot/rbytes/rbuffer.go +++ b/groot/rbytes/rbuffer.go @@ -456,6 +456,21 @@ func (r *RBuffer) ReadArrayString(arr []string) { } } +func (r *RBuffer) ReadStdVectorStrs(sli *[]string) { + if r.err != nil { + return + } + const typename = "vector" + 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 diff --git a/groot/rbytes/rw_test.go b/groot/rbytes/rw_test.go index 5e41a11f7..086124a2a 100644 --- a/groot/rbytes/rw_test.go +++ b/groot/rbytes/rw_test.go @@ -6,6 +6,7 @@ package rbytes_test import ( "reflect" + "strings" "testing" "go-hep.org/x/hep/groot/rbase" @@ -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{ diff --git a/groot/rbytes/wbuffer.go b/groot/rbytes/wbuffer.go index f7df23736..03026105a 100644 --- a/groot/rbytes/wbuffer.go +++ b/groot/rbytes/wbuffer.go @@ -730,6 +730,28 @@ func (w *WBuffer) WriteFastArrayString(v []string) { } } +func (w *WBuffer) WriteStdVectorStrs(v []string) { + const typename = "vector" + 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) )