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 `