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 )