// @(#)root/tree:$Id$ // Author: Rene Brun 19/01/96 /************************************************************************* * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. * * All rights reserved. * * * * For the licensing terms see $ROOTSYS/LICENSE. * * For the list of contributors see $ROOTSYS/README/CREDITS. * *************************************************************************/ #ifndef ROOT_TBasket #define ROOT_TBasket ////////////////////////////////////////////////////////////////////////// // // // TBasket // // // // The TBasket objects are created at run time to collect TTree entries // // in buffers. When a Basket is full, it is written to the file. // // The Basket is kept in memory if there is enough space. // // (see the fMaxVirtualsize of TTree). // // // // The Basket class derives from TKey. // ////////////////////////////////////////////////////////////////////////// #include "TKey.h" class TFile; class TTree; class TBranch; class TBasket : public TKey { friend class TBranch; private: TBasket(const TBasket&); ///< TBasket objects are not copiable. TBasket& operator=(const TBasket&); ///< TBasket objects are not copiable. // Internal corner cases for ReadBasketBuffers Int_t ReadBasketBuffersUnzip(char*, Int_t, Bool_t, TFile*); Int_t ReadBasketBuffersUncompressedCase(); // Helper for managing the compressed buffer. void InitializeCompressedBuffer(Int_t len, TFile* file); // Handles special logic around deleting / reseting the entry offset pointer. void ResetEntryOffset(); // Get entry offset as result of a calculation. Int_t *GetCalculatedEntryOffset(); // Returns true if the underlying TLeaf can regenerate the entry offsets for us. Bool_t CanGenerateOffsetArray(); // Manage buffer ownership. void DisownBuffer(); void AdoptBuffer(TBuffer *user_buffer); protected: Int_t fBufferSize{0}; ///< fBuffer length in bytes Int_t fNevBufSize{0}; ///< Length in Int_t of fEntryOffset OR fixed length of each entry if fEntryOffset is null! Int_t fNevBuf{0}; ///< Number of entries in basket Int_t fLast{0}; ///< Pointer to last used byte in basket Bool_t fHeaderOnly{kFALSE}; ///< True when only the basket header must be read/written UChar_t fIOBits{0}; ///(-1)) ? fEntryOffset : GetCalculatedEntryOffset(); } Int_t GetEntryPointer(Int_t Entry); Int_t GetNevBuf() const {return fNevBuf;} Int_t GetNevBufSize() const {return fNevBufSize;} Int_t GetLast() const {return fLast;} virtual void MoveEntries(Int_t dentries); virtual void PrepareBasket(Long64_t /* entry */) {}; Int_t ReadBasketBuffers(Long64_t pos, Int_t len, TFile *file); Int_t ReadBasketBytes(Long64_t pos, TFile *file); virtual void WriteReset(); // Time spent reseting basket sizes (typically, at event cluster boundaries), in microseconds #ifdef R__TRACK_BASKET_ALLOC_TIME ULong64_t GetResetAllocationTime() const { return fResetAllocationTime; } #endif // Count of resets performed of basket size. Bool_t GetResetAllocationCount() const { return fResetAllocation; } Int_t LoadBasketBuffers(Long64_t pos, Int_t len, TFile *file, TTree *tree = nullptr); Long64_t CopyTo(TFile *to); void SetBranch(TBranch *branch) { fBranch = branch; } void SetNevBufSize(Int_t n) { fNevBufSize=n; } virtual void SetReadMode(); virtual void SetWriteMode(); inline void Update(Int_t newlast) { Update(newlast,newlast); }; virtual void Update(Int_t newlast, Int_t skipped); virtual Int_t WriteBuffer(); ClassDefOverride(TBasket, 3); // the TBranch buffers }; #endif