go-hep.org/x/hep@v0.38.1/groot/exp/rntup/rntup.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  // Package rntup contains types to handle RNTuple-related data.
     6  package rntup // import "go-hep.org/x/hep/groot/exp/rntup"
     7  
     8  import (
     9  	"fmt"
    10  	"reflect"
    11  
    12  	"go-hep.org/x/hep/groot/rbytes"
    13  	"go-hep.org/x/hep/groot/root"
    14  	"go-hep.org/x/hep/groot/rtypes"
    15  )
    16  
    17  type span struct {
    18  	seek   uint64
    19  	nbytes uint32
    20  	length uint32
    21  }
    22  
    23  type NTuple struct {
    24  	rvers uint32
    25  	size  uint32
    26  
    27  	header span
    28  	footer span
    29  
    30  	reserved uint64
    31  }
    32  
    33  func (*NTuple) Class() string {
    34  	return "ROOT::Experimental::RNTuple"
    35  }
    36  
    37  func (*NTuple) RVersion() int16 {
    38  	return 1 // FIXME(sbinet): generate through gen.rboot
    39  }
    40  
    41  func (nt *NTuple) String() string {
    42  	return fmt.Sprintf("NTuple{version:%d, size:%d, header:%v, footer:%v}",
    43  		nt.rvers, nt.size, nt.header, nt.footer,
    44  	)
    45  }
    46  
    47  func (nt *NTuple) MarshalROOT(w *rbytes.WBuffer) (int, error) {
    48  	if w.Err() != nil {
    49  		return 0, w.Err()
    50  	}
    51  
    52  	hdr := w.WriteHeader(nt.Class(), nt.RVersion())
    53  
    54  	w.WriteU32(nt.rvers)
    55  	w.WriteU32(nt.size)
    56  
    57  	w.WriteU64(nt.header.seek)
    58  	w.WriteU32(nt.header.nbytes)
    59  	w.WriteU32(nt.header.length)
    60  
    61  	w.WriteU64(nt.footer.seek)
    62  	w.WriteU32(nt.footer.nbytes)
    63  	w.WriteU32(nt.footer.length)
    64  
    65  	w.WriteU64(nt.reserved)
    66  
    67  	return w.SetHeader(hdr)
    68  }
    69  
    70  func (nt *NTuple) UnmarshalROOT(r *rbytes.RBuffer) error {
    71  	if r.Err() != nil {
    72  		return r.Err()
    73  	}
    74  
    75  	hdr := r.ReadHeader(nt.Class(), nt.RVersion())
    76  
    77  	nt.rvers = r.ReadU32()
    78  	nt.size = r.ReadU32()
    79  
    80  	nt.header.seek = r.ReadU64()
    81  	nt.header.nbytes = r.ReadU32()
    82  	nt.header.length = r.ReadU32()
    83  
    84  	nt.footer.seek = r.ReadU64()
    85  	nt.footer.nbytes = r.ReadU32()
    86  	nt.footer.length = r.ReadU32()
    87  
    88  	nt.reserved = r.ReadU64()
    89  
    90  	r.CheckHeader(hdr)
    91  	return r.Err()
    92  }
    93  
    94  func init() {
    95  	{
    96  		f := func() reflect.Value {
    97  			o := &NTuple{}
    98  			return reflect.ValueOf(o)
    99  		}
   100  		rtypes.Factory.Add("ROOT::Experimental::RNTuple", f)
   101  	}
   102  }
   103  
   104  var (
   105  	_ root.Object        = (*NTuple)(nil)
   106  	_ rbytes.RVersioner  = (*NTuple)(nil)
   107  	_ rbytes.Marshaler   = (*NTuple)(nil)
   108  	_ rbytes.Unmarshaler = (*NTuple)(nil)
   109  )