Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TBufferIO.h
Go to the documentation of this file.
1 // @(#)root/io:$Id$
2 // Author: Sergey Linev 21/02/2018
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2018, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TBufferIO
13 #define ROOT_TBufferIO
14 
15 //////////////////////////////////////////////////////////////////////////
16 // //
17 // TBufferIO //
18 // //
19 // Direct subclass of TBuffer, implements common methods for //
20 // TBufferFile and TBufferText classes //
21 // //
22 //////////////////////////////////////////////////////////////////////////
23 
24 #include "TBuffer.h"
25 
26 #include "TString.h"
27 
28 class TExMap;
29 
30 class TBufferIO : public TBuffer {
31 
32 protected:
33  enum { kNullTag = 0 }; ///< tag value for nullptr in objects map
34 
35  Int_t fMapCount{0}; ///< Number of objects or classes in map
36  Int_t fMapSize{0}; ///< Default size of map
37  Int_t fDisplacement{0}; ///< Value to be added to the map offsets
38  UShort_t fPidOffset{0}; ///< Offset to be added to the pid index in this key/buffer.
39  TExMap *fMap{nullptr}; ///< Map containing object,offset pairs for reading/writing
40  TExMap *fClassMap{nullptr}; ///< Map containing object,class pairs for reading
41 
42  static Int_t fgMapSize; ///< Default map size for all TBuffer objects
43 
44  TBufferIO() {} // NOLINT: not allowed to use = default because of TObject::kIsOnHeap detection, see ROOT-10300
45 
46  TBufferIO(TBuffer::EMode mode);
47  TBufferIO(TBuffer::EMode mode, Int_t bufsiz);
48  TBufferIO(TBuffer::EMode mode, Int_t bufsiz, void *buf, Bool_t adopt = kTRUE,
49  ReAllocCharFun_t reallocfunc = nullptr);
50 
51  ////////////////////////////////////////////////////////////////////////////////
52  /// Return hash value for provided object.
53  static R__ALWAYS_INLINE ULong_t Void_Hash(const void *ptr) { return TString::Hash(&ptr, sizeof(void *)); }
54 
55  // method used in TBufferFile, keep here for full compatibility
56  virtual void CheckCount(UInt_t) {}
57 
58  Long64_t GetObjectTag(const void *obj);
59 
60  virtual void WriteObjectClass(const void *actualObjStart, const TClass *actualClass, Bool_t cacheReuse) = 0;
61 
62 public:
63  enum { kMapSize = 503 }; ///< default objects map size
64 
65  enum EStatusBits {
66  kNotDecompressed = BIT(15), // indicates a weird buffer, used by TBasket
67  kTextBasedStreaming = BIT(18), // indicates if buffer used for XML/SQL object streaming
68 
69  kUser1 = BIT(21), // free for user
70  kUser2 = BIT(22), // free for user
71  kUser3 = BIT(23) // free for user
72  };
73 
74  virtual ~TBufferIO();
75 
76  Int_t GetVersionOwner() const override;
77 
78  // See comment in TBuffer::SetPidOffset
79  UShort_t GetPidOffset() const override { return fPidOffset; }
80  void SetPidOffset(UShort_t offset) override;
81  Int_t GetBufferDisplacement() const override { return fDisplacement; }
82  void SetBufferDisplacement() override { fDisplacement = 0; }
83  void SetBufferDisplacement(Int_t skipped) override { fDisplacement = (Int_t)(Length() - skipped); }
84 
85  // Utilities for objects map
86  void SetReadParam(Int_t mapsize) override;
87  void SetWriteParam(Int_t mapsize) override;
88  void InitMap() override;
89  void ResetMap() override;
90  void Reset() override;
91  Int_t GetMapCount() const override { return fMapCount; }
92  void MapObject(const TObject *obj, UInt_t offset = 1) override;
93  void MapObject(const void *obj, const TClass *cl, UInt_t offset = 1) override;
94  Bool_t CheckObject(const TObject *obj) override;
95  Bool_t CheckObject(const void *obj, const TClass *ptrClass) override;
96  void GetMappedObject(UInt_t tag, void *&ptr, TClass *&ClassPtr) const override;
97 
98  // Utilities for TStreamerInfo
99  void ForceWriteInfo(TVirtualStreamerInfo *info, Bool_t force) override;
100  void ForceWriteInfoClones(TClonesArray *a) override;
101  Int_t ReadClones(TClonesArray *a, Int_t nobjects, Version_t objvers) override;
102  Int_t WriteClones(TClonesArray *a, Int_t nobjects) override;
103  void TagStreamerInfo(TVirtualStreamerInfo *info) override;
104 
105  // Special basic ROOT objects and collections
106  TProcessID *GetLastProcessID(TRefTable *reftable) const override;
107  UInt_t GetTRefExecId() override;
108  TProcessID *ReadProcessID(UShort_t pidf) override;
109  UShort_t WriteProcessID(TProcessID *pid) override;
110 
111  Int_t WriteObjectAny(const void *obj, const TClass *ptrClass, Bool_t cacheReuse = kTRUE) override;
112  void WriteObject(const TObject *obj, Bool_t cacheReuse = kTRUE) override;
113  using TBuffer::WriteObject;
114 
115  static void SetGlobalReadParam(Int_t mapsize);
116  static void SetGlobalWriteParam(Int_t mapsize);
117  static Int_t GetGlobalReadParam();
118  static Int_t GetGlobalWriteParam();
119 
120  ClassDefOverride(TBufferIO, 0) // base class, share methods for TBufferFile and TBufferText
121 };
122 
123 #endif