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  )