25 ClassImp(TLeafElement);
30 TLeafElement::TLeafElement(): TLeaf()
40 TLeafElement::TLeafElement(TBranch *parent,
const char *name, Int_t
id, Int_t type)
41 : TLeaf(parent, name,name)
47 if (type < TVirtualStreamerInfo::kObject) {
48 Int_t bareType = type;
49 if (bareType > TVirtualStreamerInfo::kOffsetP)
50 bareType -= TVirtualStreamerInfo::kOffsetP;
51 else if (bareType > TVirtualStreamerInfo::kOffsetL)
52 bareType -= TVirtualStreamerInfo::kOffsetL;
54 if ((bareType >= TVirtualStreamerInfo::kUChar && bareType <= TVirtualStreamerInfo::kULong)
55 || bareType == TVirtualStreamerInfo::kULong64)
60 auto bareTypeCopy =
static_cast<EDataType
>(bareType);
61 switch (bareTypeCopy) {
93 case kDataTypeAliasUnsigned_t:
94 case kDataTypeAliasSignedChar_t:
104 TLeafElement::~TLeafElement()
110 TLeaf::DeserializeType
111 TLeafElement::GetDeserializeType()
const
113 if (R__likely(fDeserializeTypeCache.load(std::memory_order_relaxed) != DeserializeType::kInvalid))
114 return fDeserializeTypeCache;
116 TClass *clptr =
nullptr;
117 EDataType type = EDataType::kOther_t;
118 if (fBranch->GetExpectedType(clptr, type)) {
119 fDeserializeTypeCache.store(DeserializeType::kDestructive, std::memory_order_relaxed);
120 return DeserializeType::kDestructive;
122 fDataTypeCache.store(type, std::memory_order_release);
124 fDeserializeTypeCache.store(DeserializeType::kDestructive, std::memory_order_relaxed);
125 return DeserializeType::kDestructive;
128 if ((fType == EDataType::kChar_t) || fType == EDataType::kUChar_t || type == EDataType::kBool_t) {
129 fDeserializeTypeCache.store(DeserializeType::kZeroCopy, std::memory_order_relaxed);
130 return DeserializeType::kZeroCopy;
131 }
else if ((type == EDataType::kFloat_t) || (type == EDataType::kDouble_t) ||
132 (type == EDataType::kInt_t) || (type == EDataType::kUInt_t) ||
133 (type == EDataType::kLong64_t) || (type == EDataType::kULong64_t)) {
134 fDeserializeTypeCache.store(DeserializeType::kInPlace, std::memory_order_relaxed);
135 return DeserializeType::kInPlace;
138 fDeserializeTypeCache.store(DeserializeType::kDestructive, std::memory_order_relaxed);
139 return DeserializeType::kDestructive;
144 Bool_t TLeafElement::ReadBasketFast(TBuffer &input_buf, Long64_t N)
146 EDataType type = fDataTypeCache.load(std::memory_order_consume);
147 return input_buf.ByteSwapBuffer(fLen*N, type);
155 TMethodCall *TLeafElement::GetMethodCall(
const char * )
164 Bool_t TLeafElement::IncludeRange(TLeaf *input)
167 if (input->GetMaximum() > this->GetMaximum())
168 ((TBranchElement*)fBranch)->fMaximum = input->GetMaximum();
178 Bool_t TLeafElement::IsOnTerminalBranch()
const
180 if (fBranch->GetListOfBranches()->GetEntriesFast())
return kFALSE;