HOPS
HOPS class reference
MHO_BinaryFileStreamer.hh
Go to the documentation of this file.
1 #ifndef MHO_BinaryFileStreamer_HH__
2 #define MHO_BinaryFileStreamer_HH__
3 
4 #include <complex>
5 #include <cstddef>
6 #include <fstream>
7 #include <iostream>
8 #include <stdint.h>
9 #include <stdio.h>
10 #include <string>
11 #include <vector>
12 
13 #include "MHO_FileStreamer.hh"
14 #include "MHO_JSONHeaderWrapper.hh"
15 #include "MHO_Types.hh"
16 
17 namespace hops
18 {
19 
29 //forward declare our binary data streamer (for plain old data types ((POD))
33 class MHO_BinaryFileStreamer;
34 
38 template< typename XValueType > class MHO_BinaryFileStreamerSingleType
39 {
40  public:
43 
45  {
46  //TODO flag this for big-endian machines
47  s.GetStream().read(reinterpret_cast< char* >(&obj), sizeof(XValueType));
48  return s.Self();
49  }
50 
52  const XValueType& obj)
53  {
54  //TODO flag this for big-endian machines
55  s.GetStream().write(reinterpret_cast< const char* >(&obj), sizeof(XValueType));
56  s.AddBytesWritten(sizeof(XValueType));
57  return s.Self();
58  }
59 
66  virtual std::fstream& GetStream() = 0;
67 
72  virtual void ResetByteCount() = 0;
73 
80  virtual void AddBytesWritten(uint64_t) = 0;
81 
88  virtual uint64_t GetNBytesWritten() const = 0;
89 
90  protected:
97  virtual MHO_BinaryFileStreamer& Self() = 0;
98 };
99 
104 template<> class MHO_BinaryFileStreamerSingleType< std::string >
105 {
106  public:
109 
110  //read in
112  {
113  uint64_t size;
114  s.GetStream().read(reinterpret_cast< char* >(&size), sizeof(uint64_t));
115  obj.resize(size);
116  s.GetStream().read(&obj[0], size);
117  return s.Self();
118  }
119 
120  //write out
122  const std::string& obj)
123  {
124  uint64_t size = obj.size();
125  s.GetStream().write(reinterpret_cast< const char* >(&size), sizeof(uint64_t));
126  s.GetStream().write(obj.c_str(), size);
127 
128  s.AddBytesWritten(sizeof(uint64_t));
129  s.AddBytesWritten(size);
130  return s.Self();
131  }
132 
139  virtual std::fstream& GetStream() = 0;
140 
145  virtual void ResetByteCount() = 0;
152  virtual void AddBytesWritten(uint64_t) = 0;
159  virtual uint64_t GetNBytesWritten() const = 0;
160 
161  protected:
168  virtual MHO_BinaryFileStreamer& Self() = 0;
169 };
170 
176 {
177  public:
180 
181  //read in
183  {
184  uint64_t size;
185  uint64_t encoding;
186  s.GetStream().read(reinterpret_cast< char* >(&size), sizeof(uint64_t));
187  s.GetStream().read(reinterpret_cast< char* >(&encoding), sizeof(uint64_t));
188  std::vector< std::uint8_t > data;
189  data.resize(size);
190  s.GetStream().read(reinterpret_cast< char* >(&(data[0])), size);
191  //TODO FIXME - Add the ability to support other JSON encodings besides CBOR
192  //now decode from CBOR
193  if(encoding == 0)
194  {
195  obj = mho_json::from_cbor(data);
196  }
197  return s.Self();
198  }
199 
200  //write out
202  {
203 
204  std::vector< std::uint8_t > data = mho_json::to_cbor(obj);
205  uint64_t size = data.size();
206  //must encode to CBOR
207  //TODO FIXME - Add the ability to support other JSON encodings
208  uint64_t encoding = 0; //CBOR is 0
209  s.GetStream().write(reinterpret_cast< const char* >(&size), sizeof(uint64_t));
210  s.GetStream().write(reinterpret_cast< const char* >(&encoding), sizeof(uint64_t));
211  s.GetStream().write(reinterpret_cast< const char* >(&(data[0])), size);
212  s.AddBytesWritten(sizeof(uint64_t));
213  s.AddBytesWritten(sizeof(uint64_t));
214  s.AddBytesWritten(size);
215  return s.Self();
216  }
217 
224  virtual std::fstream& GetStream() = 0;
225 
230  virtual void ResetByteCount() = 0;
237  virtual void AddBytesWritten(uint64_t) = 0;
244  virtual uint64_t GetNBytesWritten() const = 0;
245 
246  protected:
253  virtual MHO_BinaryFileStreamer& Self() = 0;
254 };
255 
260 template< typename... XValueTypeS > class MHO_BinaryFileStreamerMultiType;
261 
268 template< typename XValueType >
269 class MHO_BinaryFileStreamerMultiType< XValueType >: public MHO_BinaryFileStreamerSingleType< XValueType >
270 {};
271 
276 template< typename XValueType, typename... XValueTypeS >
277 class MHO_BinaryFileStreamerMultiType< XValueType, XValueTypeS... >: public MHO_BinaryFileStreamerMultiType< XValueType >,
278  public MHO_BinaryFileStreamerMultiType< XValueTypeS... >
279 {};
280 
281 //construct the multi-type streamer for most basic POD types and some vectors
282 typedef MHO_BinaryFileStreamerMultiType< bool, char, unsigned char, short, unsigned short, int, unsigned int, long,
283  unsigned long, long long, unsigned long long, float, double, long double,
284  std::complex< float >, std::complex< double >, std::complex< long double >,
285  std::string, mho_json >
287 
293 {
294  public:
296 
298 
303  virtual void OpenToRead() override;
304 
309  virtual void OpenToWrite() override;
310 
315  virtual void OpenToAppend() override;
316 
321  virtual void Close() override;
322 
329  virtual std::fstream& GetStream() override { return MHO_FileStreamer::GetStream(); }
330 
337  virtual const std::fstream& GetStream() const override { return MHO_FileStreamer::GetStream(); }
338 
343  virtual void ResetByteCount() override { fNBytesWritten = 0; }
344 
351  virtual void AddBytesWritten(uint64_t b) override { fNBytesWritten += b; }
352 
359  virtual uint64_t GetNBytesWritten() const override { return fNBytesWritten; };
360 
361  protected:
362  uint64_t fNBytesWritten;
363 
369  MHO_BinaryFileStreamer& Self() override { return *this; }
370 };
371 
372 } // namespace hops
373 
374 #endif
nlohmann::json mho_json
Definition: MHO_JSONHeaderWrapper.hh:5
Class MHO_BinaryFileStreamerMultiType declares a multi-type streamer with a variadic template paramet...
Definition: MHO_BinaryFileStreamer.hh:260
Class MHO_BinaryFileStreamerSingleType<mho_json> specialization for mho_json type (special,...
Definition: MHO_BinaryFileStreamer.hh:176
virtual void ResetByteCount()=0
Resets byte count to zero.
virtual MHO_BinaryFileStreamer & Self()=0
Returns a reference to the current instance of MHO_BinaryFileStreamer.
virtual uint64_t GetNBytesWritten() const =0
Getter for nbytes written.
virtual std::fstream & GetStream()=0
Getter for fstream object.
friend MHO_BinaryFileStreamer & operator<<(MHO_BinaryFileStreamerSingleType< mho_json > &s, const mho_json &obj)
Definition: MHO_BinaryFileStreamer.hh:201
virtual void AddBytesWritten(uint64_t)=0
Increments fNBytesWritten.
MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:178
virtual ~MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:179
friend MHO_BinaryFileStreamer & operator>>(MHO_BinaryFileStreamerSingleType< mho_json > &s, mho_json &obj)
Definition: MHO_BinaryFileStreamer.hh:182
Class MHO_BinaryFileStreamerSingleType<std::string> specialization for string type (special among the...
Definition: MHO_BinaryFileStreamer.hh:105
virtual void ResetByteCount()=0
Resets the byte count to zero.
virtual ~MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:108
friend MHO_BinaryFileStreamer & operator>>(MHO_BinaryFileStreamerSingleType< std::string > &s, std::string &obj)
Definition: MHO_BinaryFileStreamer.hh:111
friend MHO_BinaryFileStreamer & operator<<(MHO_BinaryFileStreamerSingleType< std::string > &s, const std::string &obj)
Definition: MHO_BinaryFileStreamer.hh:121
virtual MHO_BinaryFileStreamer & Self()=0
Returns a reference to the current instance of MHO_BinaryFileStreamer.
virtual std::fstream & GetStream()=0
Getter for fstream object.
MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:107
virtual uint64_t GetNBytesWritten() const =0
Getter for nbytes written.
virtual void AddBytesWritten(uint64_t)=0
Increments fNBytesWritten.
Class MHO_BinaryFileStreamerSingleType - template class for a single-type streamer,...
Definition: MHO_BinaryFileStreamer.hh:39
virtual void AddBytesWritten(uint64_t)=0
Increments the total bytes written by the provided value.
virtual std::fstream & GetStream()=0
Getter for stream (std::fstream) object.
MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:41
friend MHO_BinaryFileStreamer & operator<<(MHO_BinaryFileStreamerSingleType< XValueType > &s, const XValueType &obj)
Definition: MHO_BinaryFileStreamer.hh:51
virtual void ResetByteCount()=0
Resets the byte count to zero.
virtual uint64_t GetNBytesWritten() const =0
Getter for nbytes written.
virtual ~MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:42
friend MHO_BinaryFileStreamer & operator>>(MHO_BinaryFileStreamerSingleType< XValueType > &s, XValueType &obj)
Definition: MHO_BinaryFileStreamer.hh:44
virtual MHO_BinaryFileStreamer & Self()=0
Returns a reference to the current instance of MHO_BinaryFileStreamer.
Class MHO_BinaryFileStreamer declare the concrete class which does the work for file streams.
Definition: MHO_BinaryFileStreamer.hh:293
uint64_t fNBytesWritten
Definition: MHO_BinaryFileStreamer.hh:359
MHO_BinaryFileStreamer & Self() override
Returns a reference to the current instance of MHO_BinaryFileStreamer.
Definition: MHO_BinaryFileStreamer.hh:369
virtual void OpenToWrite() override
Opens a file for binary writing and sets appropriate state.
Definition: MHO_BinaryFileStreamer.cc:39
virtual ~MHO_BinaryFileStreamer()
Definition: MHO_BinaryFileStreamer.hh:297
virtual void OpenToAppend() override
Opens a binary file for appending and sets appropriate file state.
Definition: MHO_BinaryFileStreamer.cc:23
virtual const std::fstream & GetStream() const override
Getter for fstream object.
Definition: MHO_BinaryFileStreamer.hh:337
virtual void OpenToRead() override
Opens a file for binary reading and sets appropriate state.
Definition: MHO_BinaryFileStreamer.cc:7
virtual void AddBytesWritten(uint64_t b) override
Increments the total bytes written by the given amount.
Definition: MHO_BinaryFileStreamer.hh:351
MHO_BinaryFileStreamer()
Definition: MHO_BinaryFileStreamer.hh:295
virtual void ResetByteCount() override
Resets byte count to zero.
Definition: MHO_BinaryFileStreamer.hh:343
virtual uint64_t GetNBytesWritten() const override
Getter for N bytes written.
Definition: MHO_BinaryFileStreamer.hh:359
virtual std::fstream & GetStream() override
Getter for fstream object.
Definition: MHO_BinaryFileStreamer.hh:329
virtual void Close() override
Closes the open file if it exists and sets the file state to closed.
Definition: MHO_BinaryFileStreamer.cc:55
Class MHO_FileStreamer.
Definition: MHO_FileStreamer.hh:23
virtual std::fstream & GetStream()
Getter for stream.
Definition: MHO_FileStreamer.hh:168
Definition: fit_gsl.h:54
Definition: MHO_AdhocFlagging.hh:18
MHO_BinaryFileStreamerMultiType< bool, char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double, long double, std::complex< float >, std::complex< double >, std::complex< long double >, std::string, mho_json > MHO_BinaryFileStreamerBasicTypes
Definition: MHO_BinaryFileStreamer.hh:286