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 
35 
39 template< typename XValueType > class MHO_BinaryFileStreamerSingleType
40 {
41  public:
44 
46  {
47  //TODO flag this for big-endian machines
48  s.GetStream().read(reinterpret_cast< char* >(&obj), sizeof(XValueType));
49  return s.Self();
50  }
51 
53  const XValueType& obj)
54  {
55  //TODO flag this for big-endian machines
56  s.GetStream().write(reinterpret_cast< const char* >(&obj), sizeof(XValueType));
57  s.AddBytesWritten(sizeof(XValueType));
58  return s.Self();
59  }
60 
67  virtual std::fstream& GetStream() = 0;
68 
73  virtual void ResetByteCount() = 0;
74 
81  virtual void AddBytesWritten(uint64_t) = 0;
82 
89  virtual uint64_t GetNBytesWritten() const = 0;
90 
91  protected:
98  virtual MHO_BinaryFileStreamer& Self() = 0;
99 };
100 
101 
106 template<> class MHO_BinaryFileStreamerSingleType< std::string >
107 {
108  public:
111 
112  //read in
114  {
115  uint64_t size;
116  s.GetStream().read(reinterpret_cast< char* >(&size), sizeof(uint64_t));
117  obj.resize(size);
118  s.GetStream().read(&obj[0], size);
119  return s.Self();
120  }
121 
122  //write out
124  const std::string& obj)
125  {
126  uint64_t size = obj.size();
127  s.GetStream().write(reinterpret_cast< const char* >(&size), sizeof(uint64_t));
128  s.GetStream().write(obj.c_str(), size);
129 
130  s.AddBytesWritten(sizeof(uint64_t));
131  s.AddBytesWritten(size);
132  return s.Self();
133  }
134 
141  virtual std::fstream& GetStream() = 0;
142 
147  virtual void ResetByteCount() = 0;
154  virtual void AddBytesWritten(uint64_t) = 0;
161  virtual uint64_t GetNBytesWritten() const = 0;
162 
163  protected:
170  virtual MHO_BinaryFileStreamer& Self() = 0;
171 };
172 
173 
179 {
180  public:
183 
184  //read in
186  {
187  uint64_t size;
188  uint64_t encoding;
189  s.GetStream().read(reinterpret_cast< char* >(&size), sizeof(uint64_t));
190  s.GetStream().read(reinterpret_cast< char* >(&encoding), sizeof(uint64_t));
191  std::vector< std::uint8_t > data;
192  data.resize(size);
193  s.GetStream().read(reinterpret_cast< char* >(&(data[0])), size);
194  //TODO FIXME - Add the ability to support other JSON encodings besides CBOR
195  //now decode from CBOR
196  if(encoding == 0)
197  {
198  obj = mho_json::from_cbor(data);
199  }
200  return s.Self();
201  }
202 
203  //write out
205  {
206 
207  std::vector< std::uint8_t > data = mho_json::to_cbor(obj);
208  uint64_t size = data.size();
209  //must encode to CBOR
210  //TODO FIXME - Add the ability to support other JSON encodings
211  uint64_t encoding = 0; //CBOR is 0
212  s.GetStream().write(reinterpret_cast< const char* >(&size), sizeof(uint64_t));
213  s.GetStream().write(reinterpret_cast< const char* >(&encoding), sizeof(uint64_t));
214  s.GetStream().write(reinterpret_cast< const char* >(&(data[0])), size);
215  s.AddBytesWritten(sizeof(uint64_t));
216  s.AddBytesWritten(sizeof(uint64_t));
217  s.AddBytesWritten(size);
218  return s.Self();
219  }
220 
227  virtual std::fstream& GetStream() = 0;
228 
233  virtual void ResetByteCount() = 0;
240  virtual void AddBytesWritten(uint64_t) = 0;
247  virtual uint64_t GetNBytesWritten() const = 0;
248 
249  protected:
256  virtual MHO_BinaryFileStreamer& Self() = 0;
257 };
258 
263 template< typename... XValueTypeS > class MHO_BinaryFileStreamerMultiType;
264 
265 
272 template< typename XValueType >
273 class MHO_BinaryFileStreamerMultiType< XValueType >: public MHO_BinaryFileStreamerSingleType< XValueType >
274 {};
275 
280 template< typename XValueType, typename... XValueTypeS >
281 class MHO_BinaryFileStreamerMultiType< XValueType, XValueTypeS... >: public MHO_BinaryFileStreamerMultiType< XValueType >,
282  public MHO_BinaryFileStreamerMultiType< XValueTypeS... >
283 {};
284 
285 //construct the multi-type streamer for most basic POD types and some vectors
286 typedef MHO_BinaryFileStreamerMultiType< bool, char, unsigned char, short, unsigned short, int, unsigned int, long,
287  unsigned long, long long, unsigned long long, float, double, long double,
288  std::complex< float >, std::complex< double >, std::complex< long double >,
289  std::string, mho_json >
291 
292 
298 {
299  public:
301 
303 
308  virtual void OpenToRead() override;
309 
314  virtual void OpenToWrite() override;
315 
320  virtual void OpenToAppend() override;
321 
326  virtual void Close() override;
327 
334  virtual std::fstream& GetStream() override { return MHO_FileStreamer::GetStream(); }
335 
342  virtual const std::fstream& GetStream() const override { return MHO_FileStreamer::GetStream(); }
343 
348  virtual void ResetByteCount() override { fNBytesWritten = 0; }
349 
356  virtual void AddBytesWritten(uint64_t b) override { fNBytesWritten += b; }
357 
364  virtual uint64_t GetNBytesWritten() const override { return fNBytesWritten; };
365 
366  protected:
367  uint64_t fNBytesWritten;
368 
374  MHO_BinaryFileStreamer& Self() override { return *this; }
375 };
376 
377 } // namespace hops
378 
379 #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:263
Class MHO_BinaryFileStreamerSingleType<mho_json> specialization for mho_json type (special,...
Definition: MHO_BinaryFileStreamer.hh:179
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:204
virtual void AddBytesWritten(uint64_t)=0
Increments fNBytesWritten.
MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:181
virtual ~MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:182
friend MHO_BinaryFileStreamer & operator>>(MHO_BinaryFileStreamerSingleType< mho_json > &s, mho_json &obj)
Definition: MHO_BinaryFileStreamer.hh:185
Class MHO_BinaryFileStreamerSingleType<std::string> specialization for string type (special among the...
Definition: MHO_BinaryFileStreamer.hh:107
virtual void ResetByteCount()=0
Resets the byte count to zero.
virtual ~MHO_BinaryFileStreamerSingleType()
Definition: MHO_BinaryFileStreamer.hh:110
friend MHO_BinaryFileStreamer & operator>>(MHO_BinaryFileStreamerSingleType< std::string > &s, std::string &obj)
Definition: MHO_BinaryFileStreamer.hh:113
friend MHO_BinaryFileStreamer & operator<<(MHO_BinaryFileStreamerSingleType< std::string > &s, const std::string &obj)
Definition: MHO_BinaryFileStreamer.hh:123
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:109
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:40
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:42
friend MHO_BinaryFileStreamer & operator<<(MHO_BinaryFileStreamerSingleType< XValueType > &s, const XValueType &obj)
Definition: MHO_BinaryFileStreamer.hh:52
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:43
friend MHO_BinaryFileStreamer & operator>>(MHO_BinaryFileStreamerSingleType< XValueType > &s, XValueType &obj)
Definition: MHO_BinaryFileStreamer.hh:45
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:298
uint64_t fNBytesWritten
Definition: MHO_BinaryFileStreamer.hh:364
MHO_BinaryFileStreamer & Self() override
Returns a reference to the current instance of MHO_BinaryFileStreamer.
Definition: MHO_BinaryFileStreamer.hh:374
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:302
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:342
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:356
MHO_BinaryFileStreamer()
Definition: MHO_BinaryFileStreamer.hh:300
virtual void ResetByteCount() override
Resets byte count to zero.
Definition: MHO_BinaryFileStreamer.hh:348
virtual uint64_t GetNBytesWritten() const override
Getter for N bytes written.
Definition: MHO_BinaryFileStreamer.hh:364
virtual std::fstream & GetStream() override
Getter for fstream object.
Definition: MHO_BinaryFileStreamer.hh:334
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:169
Definition: MHO_ChannelLabeler.hh:17
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:290