npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
NtupleRecordTypes.hh
1 #ifndef NPSTAT_NTUPLERECORDTYPES_HH_
2 #define NPSTAT_NTUPLERECORDTYPES_HH_
3 
4 //=========================================================================
5 // NtupleRecordTypes.hh
6 //
7 // Special record types for storing ArchivedNtuple contents in the archives.
8 // Applications should never use this header directly.
9 //
10 // Author: I. Volobouev
11 //
12 // November 2010
13 //=========================================================================
14 
15 #include <stdexcept>
16 
17 #include "geners/AbsRecord.hh"
18 #include "geners/AbsReference.hh"
19 #include "geners/binaryIO.hh"
20 
21 #include "npstat/stat/NtupleRecordTypesFwd.hh"
22 
23 namespace npstat {
24 namespace Private {
25  template<class Ntuple>
26  class NtupleHeaderRecord : public gs::AbsRecord
27  {
28  public:
29  inline explicit NtupleHeaderRecord(const Ntuple& obj)
30  : gs::AbsRecord(obj.classId(), "npstat::NtupleHeader",
31  obj.name_.c_str(), obj.category_.c_str()),
32  obj_(obj) {}
33 
34  inline virtual ~NtupleHeaderRecord() {}
35 
36  inline bool writeData(std::ostream& os) const
37  {
38  obj_.classId().write(os);
39  obj_.fillBuffer_.classId().write(os);
40  gs::write_pod_vector(os, obj_.columnNames());
41  gs::write_pod(os, obj_.title());
42  const unsigned long rowsPerBuffer = obj_.rowsPerBuffer();
43  gs::write_pod(os, rowsPerBuffer);
44  gs::write_pod(os, obj_.writesByColumn());
45 
46  return !os.fail();
47  }
48 
49  private:
51  const Ntuple& obj_;
52  };
53 
54 
55  template<class Ntuple>
56  class NtupleFooterRecord : public gs::AbsRecord
57  {
58  public:
59  inline explicit NtupleFooterRecord(const Ntuple& obj)
60  : gs::AbsRecord(obj.classId(), "npstat::NtupleFooter",
61  obj.name_.c_str(), obj.category_.c_str()),
62  obj_(obj) {}
63 
64  inline virtual ~NtupleFooterRecord() {}
65 
66  inline bool writeData(std::ostream& os) const
67  {
68  unsigned long nrows = obj_.nRows();
69  gs::write_pod(os, nrows);
70  gs::write_pod(os, obj_.headerSaved_);
71  gs::write_pod_vector(os, obj_.idlist_);
72  const unsigned char writeColumnWise = obj_.writesByColumn();
73  gs::write_pod(os, writeColumnWise);
74  if (writeColumnWise)
75  gs::write_pod_vector(os, obj_.columnOffsets_);
76 
77  return !os.fail();
78  }
79 
80  private:
82  const Ntuple& obj_;
83  };
84 
85 
86  template<class Ntuple>
87  class NtupleBufferRecord : public gs::AbsRecord
88  {
89  public:
90  inline explicit NtupleBufferRecord(const Ntuple& obj)
91  : gs::AbsRecord(obj.fillBuffer_.classId(), "npstat::NtupleBuffer",
92  obj.name_.c_str(), obj.category_.c_str()),
93  obj_(obj) {}
94 
95  inline virtual ~NtupleBufferRecord() {}
96 
97  inline bool writeData(std::ostream& os) const
98  {return obj_.fillBuffer_.write(os);}
99 
100  private:
102  const Ntuple& obj_;
103  };
104 
105 
106  template<class Ntuple>
107  class NtupleBufferReference : public gs::AbsReference
108  {
109  public:
111 
112  inline NtupleBufferReference(const Ntuple& obj,
113  const unsigned long long itemId)
114  : gs::AbsReference(obj.ar_, obj.bufferClass_,
115  "npstat::NtupleBuffer", itemId), obj_(obj) {}
116 
117  inline virtual ~NtupleBufferReference() {}
118 
119  inline void restore(const unsigned long number, Buffer* buf) const
120  {
121  const unsigned long long itemId = id(number);
122  if (itemId == 0ULL) throw std::out_of_range(
123  "In npstat::NtupleBufferReference::restore: "
124  "buffer number out of range");
125  Buffer::restore(obj_.bufferClass_,
126  this->positionInputStream(itemId), buf);
127  }
128 
129  private:
130  const Ntuple& obj_;
131  };
132 
133 
134  template<class Ntuple>
135  class NtupleColumnReference : public gs::AbsReference
136  {
137  public:
138  inline NtupleColumnReference(const Ntuple& obj,
139  const unsigned long long itemId,
140  const unsigned long column,
141  const long long offset)
142  : gs::AbsReference(obj.ar_, obj.bufferClass_,
143  "npstat::NtupleBuffer", itemId),
144  obj_(obj), offset_(offset), col_(column) {}
145 
146  inline virtual ~NtupleColumnReference() {}
147 
148  inline bool fillItems(typename Ntuple::value_type* buf,
149  const unsigned long lenBuf) const
150  {
151  const unsigned long long itemId = id(0);
152  if (itemId == 0)
153  return false;
154  else
155  {
157  obj_.bufferClass_, this->positionInputStream(itemId),
158  col_, offset_, buf, lenBuf);
159  return true;
160  }
161  }
162 
163  private:
164  const Ntuple& obj_;
165  long long offset_;
166  unsigned long col_;
167  };
168 
169 
170  // We want to see the ntuple footer reference before reading
171  // the ntuple, so do not use an ntuple object to construct
172  // this reference.
173  struct NtupleFooterReference : public gs::AbsReference
174  {
175  inline NtupleFooterReference(
176  gs::AbsArchive& ar, const gs::ClassId& classId,
177  const char* name, const char* category)
178  : gs::AbsReference(ar, classId, "npstat::NtupleFooter",
179  name, category) {}
180 
181  inline virtual ~NtupleFooterReference() {}
182 
183  inline bool fillItems(unsigned long* nrows,
184  unsigned long long* headerId,
185  std::vector<unsigned long long>* idlist,
186  std::vector<long long>* columnOffsets,
187  unsigned long long* recordOffset,
188  const unsigned long number) const
189  {
190  const unsigned long long itemId = id(number);
191  if (itemId == 0)
192  return false;
193 
194  std::istream& s = this->positionInputStream(itemId);
195  *recordOffset = archive().catalogEntry(itemId)->offset();
196  gs::read_pod(s, nrows);
197  gs::read_pod(s, headerId);
198  gs::read_pod_vector(s, idlist);
199  unsigned char writeColumnWise = false;
200  gs::read_pod(s, &writeColumnWise);
201  if (writeColumnWise)
202  gs::read_pod_vector(s, columnOffsets);
203  else
204  columnOffsets->clear();
205 
206  return !s.fail();
207  }
208  };
209 }
210 }
211 
212 #endif // NPSTAT_NTUPLERECORDTYPES_HH_
Definition: NtupleBuffer.hh:25
Definition: NtupleRecordTypes.hh:88
Definition: NtupleRecordTypes.hh:108
Definition: NtupleRecordTypes.hh:136
Definition: NtupleRecordTypes.hh:57
Definition: NtupleRecordTypes.hh:27
Definition: AbsArrayProjector.hh:14
Definition: NtupleRecordTypes.hh:174