go-hep.org/x/hep@v0.38.1/groot/gen.rbytes.go (about)

     1  // Copyright ©2020 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build ignore
     6  
     7  package main
     8  
     9  import (
    10  	"fmt"
    11  	"log"
    12  	"os"
    13  	"text/template"
    14  
    15  	"go-hep.org/x/hep/groot/internal/genroot"
    16  )
    17  
    18  func main() {
    19  	genRBuffer()
    20  	genWBuffer()
    21  }
    22  
    23  func genRBuffer() {
    24  	fname := "./rbytes/rbuffer_gen.go"
    25  	year := genroot.ExtractYear(fname)
    26  	f, err := os.Create(fname)
    27  	if err != nil {
    28  		log.Fatal(err)
    29  	}
    30  	defer f.Close()
    31  
    32  	genroot.GenImports(year, "rbytes", f,
    33  		"encoding/binary",
    34  		"fmt",
    35  		"math",
    36  		"",
    37  		"go-hep.org/x/hep/groot/rvers",
    38  	)
    39  
    40  	for i, typ := range []struct {
    41  		Name     string
    42  		Type     string
    43  		Size     int
    44  		REndian  string
    45  		Frombits string
    46  	}{
    47  		{
    48  			Name:     "U16",
    49  			Type:     "uint16",
    50  			Size:     2,
    51  			REndian:  "binary.BigEndian.Uint16",
    52  			Frombits: "",
    53  		},
    54  		{
    55  			Name:     "U32",
    56  			Type:     "uint32",
    57  			Size:     4,
    58  			REndian:  "binary.BigEndian.Uint32",
    59  			Frombits: "",
    60  		},
    61  		{
    62  			Name:     "U64",
    63  			Type:     "uint64",
    64  			Size:     8,
    65  			REndian:  "binary.BigEndian.Uint64",
    66  			Frombits: "",
    67  		},
    68  		{
    69  			Name:     "I16",
    70  			Type:     "int16",
    71  			Size:     2,
    72  			REndian:  "binary.BigEndian.Uint16",
    73  			Frombits: "int16",
    74  		},
    75  		{
    76  			Name:     "I32",
    77  			Type:     "int32",
    78  			Size:     4,
    79  			REndian:  "binary.BigEndian.Uint32",
    80  			Frombits: "int32",
    81  		},
    82  		{
    83  			Name:     "I64",
    84  			Type:     "int64",
    85  			Size:     8,
    86  			REndian:  "binary.BigEndian.Uint64",
    87  			Frombits: "int64",
    88  		},
    89  		{
    90  			Name:     "F32",
    91  			Type:     "float32",
    92  			Size:     4,
    93  			REndian:  "binary.BigEndian.Uint32",
    94  			Frombits: "math.Float32frombits",
    95  		},
    96  		{
    97  			Name:     "F64",
    98  			Type:     "float64",
    99  			Size:     8,
   100  			REndian:  "binary.BigEndian.Uint64",
   101  			Frombits: "math.Float64frombits",
   102  		},
   103  	} {
   104  		if i > 0 {
   105  			fmt.Fprintf(f, "\n")
   106  		}
   107  		tmpl := template.Must(template.New(typ.Name).Parse(rbufferTmpl))
   108  		err = tmpl.Execute(f, typ)
   109  		if err != nil {
   110  			log.Fatalf("error executing template for %q: %v\n", typ.Name, err)
   111  		}
   112  	}
   113  
   114  	err = f.Close()
   115  	if err != nil {
   116  		log.Fatal(err)
   117  	}
   118  	genroot.GoFmt(f)
   119  }
   120  
   121  const rbufferTmpl = `func (r *RBuffer) ReadArray{{.Name}}(sli []{{.Type}}) {
   122  	if r.err != nil {
   123  		return
   124  	}
   125  	n := len(sli)
   126  	if n <= 0 || int64(n) > r.Len() {
   127  		return
   128  	}
   129  
   130  	cur := r.r.c
   131  	end := r.r.c + {{.Size}}*len(sli)
   132  	sub := r.r.p[cur:end]
   133  	cur = 0
   134  	for i := range sli {
   135  		beg := cur
   136  		end := cur + {{.Size}}
   137  		cur = end
   138  		v := {{.REndian}}(sub[beg:end])
   139  {{- if eq .Frombits ""}}
   140  		sli[i] = v
   141  {{else}}
   142  		sli[i] = {{.Frombits}}(v)
   143  {{- end}}
   144  	}
   145  	r.r.c = end
   146  }
   147  
   148  func (r *RBuffer) Read{{.Name}}() {{.Type}} {
   149  	if r.err != nil {
   150  		return 0
   151  	}
   152  	beg := r.r.c
   153  	r.r.c += {{.Size}}
   154  	v := {{.REndian}}(r.r.p[beg:r.r.c])
   155  {{- if eq .Frombits ""}}
   156  	return v
   157  {{else}}
   158  	return {{.Frombits}}(v)
   159  {{- end}}
   160  }
   161  
   162  func (r *RBuffer) ReadStdVector{{.Name}}(sli *[]{{.Type}}) {
   163  	if r.err != nil {
   164  		return
   165  	}
   166  	
   167  	hdr := r.ReadHeader("vector<{{.Type}}>", rvers.StreamerBaseSTL)
   168  	if hdr.Vers > rvers.StreamerBaseSTL {
   169  		r.err = fmt.Errorf(
   170  			"rbytes: invalid %s version: got=%d, want=%d",
   171  			hdr.Name, hdr.Vers, rvers.StreamerBaseSTL,
   172  		)
   173  		return
   174  	}
   175  	n := int(r.ReadI32())
   176  	*sli = Resize{{.Name}}(*sli, n)
   177  	for i := range *sli {
   178  		(*sli)[i] = r.Read{{.Name}}()
   179  	}
   180  
   181  	r.CheckHeader(hdr)
   182  }
   183  `
   184  
   185  func genWBuffer() {
   186  	fname := "./rbytes/wbuffer_gen.go"
   187  	year := genroot.ExtractYear(fname)
   188  	f, err := os.Create(fname)
   189  	if err != nil {
   190  		log.Fatal(err)
   191  	}
   192  	defer f.Close()
   193  
   194  	genroot.GenImports(year, "rbytes", f,
   195  		"encoding/binary",
   196  		"math",
   197  		"",
   198  		"go-hep.org/x/hep/groot/rvers",
   199  	)
   200  
   201  	for i, typ := range []struct {
   202  		Name    string
   203  		Type    string
   204  		Size    int
   205  		WEndian string
   206  		Tobits  string
   207  	}{
   208  		{
   209  			Name:    "U16",
   210  			Type:    "uint16",
   211  			Size:    2,
   212  			WEndian: "binary.BigEndian.PutUint16",
   213  		},
   214  		{
   215  			Name:    "U32",
   216  			Type:    "uint32",
   217  			Size:    4,
   218  			WEndian: "binary.BigEndian.PutUint32",
   219  		},
   220  		{
   221  			Name:    "U64",
   222  			Type:    "uint64",
   223  			Size:    8,
   224  			WEndian: "binary.BigEndian.PutUint64",
   225  		},
   226  		{
   227  			Name:    "I16",
   228  			Type:    "int16",
   229  			Size:    2,
   230  			WEndian: "binary.BigEndian.PutUint16",
   231  			Tobits:  "uint16",
   232  		},
   233  		{
   234  			Name:    "I32",
   235  			Type:    "int32",
   236  			Size:    4,
   237  			WEndian: "binary.BigEndian.PutUint32",
   238  			Tobits:  "uint32",
   239  		},
   240  		{
   241  			Name:    "I64",
   242  			Type:    "int64",
   243  			Size:    8,
   244  			WEndian: "binary.BigEndian.PutUint64",
   245  			Tobits:  "uint64",
   246  		},
   247  		{
   248  			Name:    "F32",
   249  			Type:    "float32",
   250  			Size:    4,
   251  			WEndian: "binary.BigEndian.PutUint32",
   252  			Tobits:  "math.Float32bits",
   253  		},
   254  		{
   255  			Name:    "F64",
   256  			Type:    "float64",
   257  			Size:    8,
   258  			WEndian: "binary.BigEndian.PutUint64",
   259  			Tobits:  "math.Float64bits",
   260  		},
   261  	} {
   262  		if i > 0 {
   263  			fmt.Fprintf(f, "\n")
   264  		}
   265  		tmpl := template.Must(template.New(typ.Name).Parse(wbufferTmpl))
   266  		err = tmpl.Execute(f, typ)
   267  		if err != nil {
   268  			log.Fatalf("error executing template for %q: %v\n", typ.Name, err)
   269  		}
   270  	}
   271  
   272  	err = f.Close()
   273  	if err != nil {
   274  		log.Fatal(err)
   275  	}
   276  	genroot.GoFmt(f)
   277  }
   278  
   279  const wbufferTmpl = `func (w *WBuffer) WriteArray{{.Name}}(sli []{{.Type}}) {
   280  	if w.err != nil {
   281  		return
   282  	}
   283  	w.w.grow(len(sli)*{{.Size}})
   284  
   285  	cur := w.w.c
   286  	for _, v := range sli {
   287  		beg := cur
   288  		end := cur + {{.Size}}
   289  		cur = end
   290  {{- if eq .Tobits ""}}
   291  		{{.WEndian}}(w.w.p[beg:end], v)
   292  {{else}}
   293  		{{.WEndian}}(w.w.p[beg:end], {{.Tobits}}(v))
   294  {{- end}}
   295  	}
   296  	w.w.c += {{.Size}}*len(sli)
   297  }
   298  
   299  func (w *WBuffer) Write{{.Name}}(v {{.Type}}) {
   300  	if w.err != nil {
   301  		return
   302  	}
   303  	w.w.grow({{.Size}})
   304  	beg := w.w.c
   305  	end := w.w.c + {{.Size}}
   306  {{- if eq .Tobits ""}}
   307  	{{.WEndian}}(w.w.p[beg:end], v)
   308  {{else}}
   309  	{{.WEndian}}(w.w.p[beg:end], {{.Tobits}}(v))
   310  {{- end}}
   311  	w.w.c += {{.Size}}
   312  }
   313  
   314  func (w *WBuffer) WriteStdVector{{.Name}}(sli []{{.Type}}) {
   315  	if w.err != nil {
   316  		return
   317  	}
   318  
   319  	hdr := w.WriteHeader("vector<{{.Type}}>", rvers.StreamerBaseSTL)
   320  	w.WriteI32(int32(len(sli)))
   321  	w.w.grow(len(sli)*{{.Size}})
   322  
   323  	cur := w.w.c
   324  	for _, v := range sli {
   325  		beg := cur
   326  		end := cur + {{.Size}}
   327  		cur = end
   328  {{- if eq .Tobits ""}}
   329  		{{.WEndian}}(w.w.p[beg:end], v)
   330  {{else}}
   331  		{{.WEndian}}(w.w.p[beg:end], {{.Tobits}}(v))
   332  {{- end}}
   333  	}
   334  	w.w.c += {{.Size}}*len(sli)
   335  
   336  	if w.err != nil {
   337  		return
   338  	}
   339  	_, w.err = w.SetHeader(hdr)
   340  }
   341  `