go-hep.org/x/hep@v0.38.1/groot/rcont/objarray.go (about)

     1  // Copyright ©2017 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 rcont
     6  
     7  import (
     8  	"reflect"
     9  
    10  	"go-hep.org/x/hep/groot/rbase"
    11  	"go-hep.org/x/hep/groot/rbytes"
    12  	"go-hep.org/x/hep/groot/root"
    13  	"go-hep.org/x/hep/groot/rtypes"
    14  	"go-hep.org/x/hep/groot/rvers"
    15  )
    16  
    17  type ObjArray struct {
    18  	obj  rbase.Object
    19  	name string
    20  	last int
    21  	objs []root.Object
    22  	low  int32
    23  }
    24  
    25  func NewObjArray() *ObjArray {
    26  	return &ObjArray{
    27  		obj:  *rbase.NewObject(),
    28  		objs: make([]root.Object, 0),
    29  	}
    30  }
    31  
    32  func (*ObjArray) RVersion() int16 {
    33  	return rvers.ObjArray
    34  }
    35  
    36  func (*ObjArray) Class() string {
    37  	return "TObjArray"
    38  }
    39  
    40  func (arr *ObjArray) UID() uint32 {
    41  	return arr.obj.UID()
    42  }
    43  
    44  func (arr *ObjArray) Name() string {
    45  	n := arr.name
    46  	if n == "" {
    47  		return "TObjArray"
    48  	}
    49  	return n
    50  }
    51  
    52  func (arr *ObjArray) Title() string {
    53  	return "An array of objects"
    54  }
    55  
    56  func (arr *ObjArray) TestBits(bits uint32) bool {
    57  	return arr.obj.TestBits(bits)
    58  }
    59  
    60  func (arr *ObjArray) At(i int) root.Object {
    61  	return arr.objs[i]
    62  }
    63  
    64  func (arr *ObjArray) Last() int {
    65  	return arr.last
    66  }
    67  
    68  func (arr *ObjArray) Len() int {
    69  	return len(arr.objs)
    70  }
    71  
    72  func (arr *ObjArray) LowerBound() int {
    73  	return int(arr.low)
    74  }
    75  
    76  func (arr *ObjArray) SetElems(v []root.Object) {
    77  	arr.objs = v
    78  	arr.last = len(v) - 1
    79  }
    80  
    81  // ROOTMarshaler is the interface implemented by an object that can
    82  // marshal itself to a ROOT buffer
    83  func (arr *ObjArray) MarshalROOT(w *rbytes.WBuffer) (int, error) {
    84  	if w.Err() != nil {
    85  		return 0, w.Err()
    86  	}
    87  
    88  	hdr := w.WriteHeader(arr.Class(), arr.RVersion())
    89  	w.WriteObject(&arr.obj)
    90  	w.WriteString(arr.name)
    91  
    92  	w.WriteI32(int32(len(arr.objs)))
    93  	w.WriteI32(arr.low)
    94  
    95  	for _, obj := range arr.objs {
    96  		w.WriteObjectAny(obj)
    97  	}
    98  
    99  	return w.SetHeader(hdr)
   100  }
   101  
   102  // ROOTUnmarshaler is the interface implemented by an object that can
   103  // unmarshal itself from a ROOT buffer
   104  func (arr *ObjArray) UnmarshalROOT(r *rbytes.RBuffer) error {
   105  	if r.Err() != nil {
   106  		return r.Err()
   107  	}
   108  
   109  	hdr := r.ReadHeader(arr.Class(), arr.RVersion())
   110  
   111  	if hdr.Vers > 2 {
   112  		r.ReadObject(&arr.obj)
   113  	}
   114  	if hdr.Vers > 1 {
   115  		arr.name = r.ReadString()
   116  	}
   117  
   118  	nobjs := int(r.ReadI32())
   119  	arr.low = r.ReadI32()
   120  
   121  	arr.objs = make([]root.Object, nobjs)
   122  	arr.last = -1
   123  	for i := range arr.objs {
   124  		obj := r.ReadObjectAny()
   125  		if r.Err() != nil {
   126  			return r.Err()
   127  		}
   128  		if obj != nil {
   129  			arr.last = i
   130  			arr.objs[i] = obj
   131  		}
   132  	}
   133  
   134  	r.CheckHeader(hdr)
   135  	return r.Err()
   136  }
   137  
   138  func init() {
   139  	f := func() reflect.Value {
   140  		o := NewObjArray()
   141  		return reflect.ValueOf(o)
   142  	}
   143  	rtypes.Factory.Add("TObjArray", f)
   144  }
   145  
   146  var (
   147  	_ root.Object        = (*ObjArray)(nil)
   148  	_ root.UIDer         = (*ObjArray)(nil)
   149  	_ root.Named         = (*ObjArray)(nil)
   150  	_ root.ObjArray      = (*ObjArray)(nil)
   151  	_ rbytes.Marshaler   = (*ObjArray)(nil)
   152  	_ rbytes.Unmarshaler = (*ObjArray)(nil)
   153  )