// Format of StreamerInfo record in release 3.02.06.
// It is probably not accessed by its key, but from its offset given in the file header.
// The StreamerInfo record DATA consists of a TList (list) object containing elements
// of class TStreamerInfo.
// ----------TKey-(never compressed)----------------------
// byte 0->3 Nbytes = Number of bytes in compressed record (TKey+data) TKey::fNbytes
// 4->5 Version = TKey class version identifier TKey::fVersion
// 6->9 ObjLen = Number of bytes of uncompressed data TKey::fObjLen
// 10->13 Datime = Date and time when record was written to file TKey::fDatime
// | (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
// 14->15 KeyLen = Number of bytes in key structure (TKey) (64) TKey::fKeyLen
// 16->17 Cycle = Cycle of key TKey::fCycle
// 18->21 SeekKey = Byte offset of record itself (consistency check) TKey::fSeekKey
// 22->25 SeekPdir = Byte offset of parent directory record (TFile) TKey::fSeekPdir
// 26->26 lname = Number of bytes in the class name (5) TKey::fClassName
// 27->31 ClassName = Object Class Name ("TList") TKey::fClassName
// 32->32 lname = Number of bytes in the object name (12) TNamed::fName
// 33->44 Name = lName bytes with the name of the object ("StreamerInfo") TNamed::fName
// 45->45 lTitle = Number of bytes in the object title (18) TNamed::fTitle
// 46->63 Title = lTitle bytes with the title of the object TNamed::fTitle
// | ("Doubly linked list")
// ----------TList-(always compressed at level 1 (even if compression level 0))----
// The DATA is a TList collection object containing TStreamerInfo objects.
// Below is the format of this TList data.
//
// Here is the format of a TList object in Release 3.02.06.
// Comments and offsets refer specifically to its use in the StreamerInfo record.
//--------
// 0->3 ByteCount = Number of remaining bytes in TList object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->5 Version = Version of TList Class
// 6->15 = TObject object (a base class of TList) (see tobject.txt).
// | Objects in StreamerInfo record are not referenced.
// | Would be two bytes longer (6->17) if object were referenced.
// 16->16 fName = Number of bytes in name of TList object, followed by the
// | name itself. (TCollection::fName). The TList object in
// | StreamerInfo record is unnamed, so byte contains 0.
// 17->20 nObjects = Number of objects in list.
// 21->.. objects = Sequentially, TStreamerInfo Objects in the list.
// | In the StreamerInfo record, the objects in the list are
// | TStreamerInfo objects. There will be one TStreamerInfo
// | object for every class used in data records other than
// | core records and the the StreamerInfo record itself.
//-------
// Here is the format of a TStreamerInfo object in Release 3.02.06.
// Note: Although TStreamerInfo does not use the default streamer, it has the same
// format as if it did. (compare with dobject.txt)
// 0->3 ByteCount = Number of remaining bytes in TStreamerInfo object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->.. ClassInfo = Information about TStreamerInfo class
// | If this is the first occurrence of a TStreamerInfo object in the record
// | 4->7 -1 = New class tag (constant kNewClassTag = 0xffffffff)
// | 8->21 Classname = Object Class Name "TStreamerInfo" (null terminated)
// | Otherwise
// | 4->7 clIdx = Byte offset of new class tag in record, plus 2.
// | OR'd with kClassMask (0x80000000)
// 0->3 ByteCount = Number of remaining bytes in TStreamerInfo object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->5 Version = Version of TStreamerInfo Class
// -Begin TNamed object (Base class of TStreamerInfo)
// 6->9 ByteCount = Number of remaining bytes in TNamed object
// | OR'd with kByteCountMask (0x40000000)
// 10->11 Version = Version of TNamed Class
// 12->21 = TObject object (Base class of TNamed) (see tobject.txt).
// | Objects in StreamerInfo record are not referenced.
// | Would be two bytes longer (12->23) if object were referenced.
// 22->.. fName = Number of bytes in name of class that this TStreamerInfo object
// | describes, followed by the class name itself. (TNamed::fName).
// 0->.. fTitle = Number of bytes in title of class that this TStreamerInfo object
// | describes, followed by the class title itself. (TNamed::fTitle).
// | (Class title may be zero length)
// -End TNamed object
// 0->3 fCheckSum = Check sum for class that this TStreamerInfo object describes.
// | This checksum is over all base classes and all persistent
// | non-static data members. It is computed by TClass::GetCheckSum().
// | (TStreamerInfo::fCheckSum)
// 4->7 fClassVersion = Version of class that this TStreamerInfo object describes.
// | (TStreamerInfo::fClassVersion)
// -Begin TObjArray object (Data member of TStreamerInfo)
// 0->3 ByteCount = Number of remaining bytes in TObjArray object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->.. ClassInfo = Information about TObjArray class
// | If this is the first occurrence of a TObjArray object in the record
// | 4->7 -1 = New class tag (constant kNewClassTag = 0xffffffff)
// | 8->17 Classname = Object Class Name "TObjArray" (null terminated)
// | Otherwise
// | 4->7 clIdx = Byte offset of new class tag in record, plus 2.
// | OR'd with kClassMask (0x80000000)
// 0->3 ByteCount = Number of remaining bytes in TObjArray object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->5 Version = Version of TObjArray Class
// 6->15 = TObject object (a base class of TObjArray) (see tobject.txt).
// | Objects in StreamerInfo record are not referenced.
// | Would be two bytes longer (6->17) if object were referenced.
// 16->16 fName = Number of bytes in name of TObjArray object, followed by the
// | name itself. (TCollection::fName). TObjArray objects in
// | StreamerInfo record are unnamed, so byte contains 0.
// 17->20 nObjects = Number of objects (derived from TStreamerElement) in array.
// 21->24 fLowerBound = Lower bound of array. Will always be 0 in StreamerInfo record.
// 25->.. objects = Sequentially, TStreamerElement objects in the array.
// | In a TStreamerInfo object, the objects in the TObjArray are
// | of various types (described below), all of which inherit
// | directly from TStreamerElement objects. There will be one
// | such object for every base class of the class that the
// | TStreamerInfo object describes, and also one such object for
// | each persistent non-static data member of the class that the
// | TStreamerInfo object describes.
// -End TObjArray object and TStreamerInfo object
//-------
// The objects stored in the TObjectArray in TStreamerInfo are of various classes, each of
// which inherits directly from the TStreamerElement class. The possible classes (which
// we refer to collectively as TStreamer<XXX>) are:
//
// TStreamerBase: Used for a base class. All others below used for data members.
// TStreamerBasicType: For a basic type
// TStreamerString: For type TString
// TStreamerBasicPointer: For pointer to array of basic types
// TStreamerObject: For an object derived from TObject
// TStreamerObjectPointer: For pointer to an object derived from TObject
// TStreamerLoop: For pointer to an array of objects
// TStreamerObjectAny: For an object not derived from TObject
// TStreamerSTL: For an STL container (not yet used??)
// TStreamerSTLString: For an STL string (not yet used??)
//-------
// Here is the format of a TStreamer<XXX> object in Release 3.02.06.
// In description below,
// 0->3 ByteCount = Number of remaining bytes in TStreamer<XXX> object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->.. ClassInfo = Information about the specific TStreamer<XXX> class
// | If this is the first occurrence of a TStreamerXXX object in the record
// | 4->7 -1 = New class tag (constant kNewClassTag = 0xffffffff)
// | 8->.. Classname = Object Class Name "TStreamer<XXX>" (null terminated)
// | Otherwise
// | 4->7 clIdx = Byte offset of new class tag in record, plus 2.
// | OR'd with kClassMask (0x80000000)
// 0->3 ByteCount = Number of remaining bytes in TStreamer<XXX> object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->5 Version = Version of TStreamer<XXX> Class
// -Begin TStreamerElement object (Base class of TStreamerXXX)
// 0->3 ByteCount = Number of remaining bytes in TStreamerElement object (uncompressed)
// | OR'd with kByteCountMask (0x40000000)
// 4->5 Version = Version of TStreamerElement Class
// -Begin TNamed object (Base class of TStreamerElement)
// 6->9 ByteCount = Number of remaining bytes in TNamed object
// | OR'd with kByteCountMask (0x40000000)
// 10->11 Version = Version of TNamed Class
// 12->21 = TObject object (Base class of TNamed) (see tobject.txt).
// | Objects in StreamerInfo record are not referenced.
// | Would be two bytes longer (12->23) if object were referenced.
// 22->.. fName = Number of bytes in class name of base class or member name of
// | data member that this TStreamerElement object describes,
// | followed by the name itself. (TNamed::fName).
// 0->.. fTitle = Number of bytes in title of base class or data member that this
// | TStreamerElement object describes, followed by the title itself.
// | (TNamed::fTitle).
// -End TNamed object
// 0->3 fType = Type of data described by this TStreamerElement.
// | (TStreamerElement::fType)
// | Built in types:
// | 1:char, 2:short, 3:int, 4:long, 5:float, 8:double
// | 11, 12, 13, 14:unsigned char, short, int, long respectively
// | 6: an array dimension (counter)
// | 15: bit mask (used for fBits field)
// |
// | Pointers to built in types:
// | 40 + fType of built in type (e.g. 43: pointer to int)
// |
// | Objects:
// | 65:TString, 66:TObject, 67:TNamed
// | 0: base class (other than TObject or TNamed)
// | 61: object data member derived from TObject (other than TObject or TNamed)
// | 62: object data member not derived from TObject
// | 63: pointer to object derived from TObject (pointer can't be null)
// | 64: pointer to object derived from TObject (pointer may be null)
// | 501: pointer to an array of objects
// | 500: an STL string or container
// |
// | Arrays:
// | 20 + fType of array element (e.g. 23: array of int)
// |
// 4->7 fSize = Size of built in type or of pointer to built in type. 0 otherwise.
// | (TStreamerElement::fSize).
// 8->11 fArrayLength = Size of array (0 if not array)
// | (TStreamerElement::fArrayLength).
// 12->15 fArrayDim = Number of dimensions of array (0 if not an array)
// | (TStreamerElement::fArrayDim).
// 16->35 fMaxIndex = Five integers giving the array dimensions (0 if not applicable)
// | (TStreamerElement::fMaxIndex).
// 36->.. fTypeName = Number of bytes in name of the data type of the data member that
// | the TStreamerElement object describes, followed by the name
// | itself. If this TStreamerElement object defines a base class
// | rather than a data member, the name used is 'BASE'.
// | (TStreamerElement::fTypeName).
// -End TStreamerElement object
// The remaining data is specific to the type of TStreamer<XXX> class.
// For TStreamerInfoBase:
// 0->3 fBaseVersion = Version of base class that this TStreamerElement describes.
// For TStreamerBasicType:
// No specific data
// For TStreamerString:
// No specific data
// For TStreamerBasicPointer:
// 0->3 fCountVersion = Version of class with the count (array dimension)
// 4->.. fCountName= Number of bytes in the name of the data member holding
// | the count, followed by the name itself.
// 0->.. fCountName= Number of bytes in the name of the class holding the
// | count, followed by the name itself.
// For TStreamerObject:
// No specific data
// For TStreamerObjectPointer:
// No specific data
// For TStreamerLoop:
// 0->3 fCountVersion = Version of class with the count (array dimension)
// 4->.. fCountName= Number of bytes in the name of the data member holding
// | the count, followed by the name itself.
// 0->.. fCountClass= Number of bytes in the name of the class holding the
// | count, followed by the name itself.
// For TStreamerObjectAny:
// No specific data
// For TStreamerSTL:
// 0->3 fSTLtype = Type of STL container:
// | 1:vector, 2:list, 3:deque, 4:map, 5:set, 6:multimap, 7:multiset
// 4->7 fCType = Type contained in STL container:
// | Same values as for fType above, with one addition: 365:STL string
// For TStreamerSTLString:
// No specific data