go-hep.org/x/hep@v0.38.1/groot/rbase/object.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 rbase 6 7 import ( 8 "reflect" 9 10 "go-hep.org/x/hep/groot/rbytes" 11 "go-hep.org/x/hep/groot/root" 12 "go-hep.org/x/hep/groot/rtypes" 13 "go-hep.org/x/hep/groot/rvers" 14 ) 15 16 type Object struct { 17 ID uint32 18 Bits uint32 19 } 20 21 func NewObject() *Object { 22 return &Object{ID: 0x0, Bits: 0x3000000} 23 } 24 25 func (*Object) Class() string { 26 return "TObject" 27 } 28 29 func (obj *Object) UID() uint32 { 30 return obj.ID 31 } 32 33 func (*Object) RVersion() int { 34 return rvers.Object 35 } 36 37 func (obj *Object) SetID(id uint32) { obj.ID = id } 38 func (obj *Object) SetBit(bit uint32) { obj.Bits |= bit & kBitMask } 39 func (obj *Object) ResetBit(bit uint32) { obj.Bits &= ^(bit & kBitMask) } 40 func (obj *Object) SetBits(bits uint32) { obj.Bits = bits } 41 func (obj *Object) TestBits(bits uint32) bool { return obj.Bits&bits != 0 } 42 43 func (obj *Object) UnmarshalROOT(r *rbytes.RBuffer) error { 44 r.SkipVersion("") 45 obj.ID = r.ReadU32() 46 obj.Bits = r.ReadU32() 47 obj.Bits |= kIsOnHeap 48 if obj.TestBits(kIsReferenced) { 49 _ = r.ReadU16() 50 } 51 return r.Err() 52 } 53 54 func (obj *Object) MarshalROOT(w *rbytes.WBuffer) (int, error) { 55 n := w.Pos() 56 w.WriteU16(uint16(obj.RVersion())) 57 switch { 58 case obj.TestBits(kIsReferenced): 59 uid := obj.ID & 0xffffff 60 w.WriteU32(uid) 61 w.WriteU32(obj.Bits) 62 w.WriteU16(0) // FIXME(sbinet): implement referenced objects. 63 // panic(fmt.Errorf("rbase: writing referenced objects are not supported")) 64 default: 65 w.WriteU32(obj.ID) 66 w.WriteU32(obj.Bits) 67 } 68 69 return int(w.Pos() - n), w.Err() 70 } 71 72 func (obj *Object) RMembers() []rbytes.Member { 73 return []rbytes.Member{ 74 {Name: "fUniqueID", Value: &obj.ID}, 75 {Name: "fBits", Value: &obj.Bits}, 76 } 77 } 78 79 func init() { 80 f := func() reflect.Value { 81 o := &Object{} 82 return reflect.ValueOf(o) 83 } 84 rtypes.Factory.Add("TObject", f) 85 } 86 87 var ( 88 _ root.Object = (*Object)(nil) 89 _ root.UIDer = (*Object)(nil) 90 _ rbytes.Marshaler = (*Object)(nil) 91 _ rbytes.Unmarshaler = (*Object)(nil) 92 )