CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
DataStream.hh
Go to the documentation of this file.
1 #ifndef DATASTREAM_HH
2 #define DATASTREAM_HH
3 #include <vector>
4 #include <string>
5 #include <iostream>
6 #include <functional>
7 namespace CASM {
8 
11  class DataStream {
12  public:
14  none = 0,
15  skipfail = (1u << 0),
16  failbit = (1u << 1)
17  };
18 
19  static DataStream &endl(DataStream &_strm) {
20  return _strm.newline();
21  }
22 
23  static std::function<DataStream &(DataStream &_strm)> failure(std::string const &_msg);
24 
26  m_traits(_traits) {}
27 
28  virtual ~DataStream() {}
29 
30  virtual DataStream &operator<<(const std::string &) {
31  return *this;
32  }
33 
34  virtual DataStream &operator<<(long) {
35  return *this;
36  }
37 
38  virtual DataStream &operator<<(double) {
39  return *this;
40  }
41 
42  virtual DataStream &operator<<(bool) {
43  return *this;
44  }
45 
46  virtual DataStream &operator<<(char) {
47  return *this;
48  }
49 
50  /* Some day? This seems annoying...
51  virtual DataStream &operator<<(std::complex<double>) {
52  return *this;
53  }
54  */
55 
57  return F(*this);
58  }
59 
60  DataStream &operator<<(const std::function<DataStream & (DataStream &)> &F) {
61  return F(*this);
62  }
63 
64  virtual DataStream &newline() {
65  return *this;
66  }
67 
69  m_traits |= set_bits;
70  return *this;
71  }
72 
73  bool fail() const {
74  return m_traits & failbit;
75  }
76 
77  void clear_fail() {
78  m_traits &= ~failbit;
79  m_err_msg.clear();
80  }
81 
82  std::string const &err_msg() const {
83  return m_err_msg;
84  }
85 
86  protected:
87 
88  void _set_err_msg(std::string const &_msg) {
89  m_err_msg = _msg;
90  }
91 
92  bool _skipfail() {
93  return m_traits & skipfail;
94  }
95 
96  private:
97  int m_traits;
98  std::string m_err_msg;
99  };
100 
101  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
102  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
103  // Count the number of POD objects streamed
104  class CountDataStream : public DataStream {
105  public:
106  CountDataStream(bool newline_reset = true) :
107  DataStream(none), m_newline_reset(newline_reset), m_count(0) {}
108 
109  DataStream &operator<<(const std::string &) override {
110  return increment();
111  }
112 
113  DataStream &operator<<(long) override {
114  return increment();
115  }
116 
117  DataStream &operator<<(double) override {
118  return increment();
119  }
120 
121  DataStream &operator<<(bool) override {
122  return increment();
123  }
124 
125  DataStream &operator<<(char) override {
126  return increment();
127  }
128 
129  DataStream &newline() override {
130  if(m_newline_reset)
131  m_count = 0;
132  return *this;
133  }
134 
135  int count() const {
136  return m_count;
137  }
138  private:
140  m_count++;
141  return *this;
142  }
143 
145  int m_count;
146 
147  };
148 
149  inline
150  std::function<DataStream &(DataStream &_strm)> DataStream::failure(std::string const &_msg) {
151  return [&_msg](DataStream & _stream)->DataStream & {
152  _stream << failbit;
153  _stream._set_err_msg(_msg);
154  return _stream;
155  };
156  }
157 
158  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
159  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
160 
161  namespace DataStream_impl {
162  template<typename OutType>
164  template<typename InType>
165  static OutType promote(InType a) {
166  return static_cast<OutType>(a);
167  }
168  };
169 
170  template<>
171  struct DataStreamPromoter<std::string> {
172  template<typename InType>
173  static std::string promote(InType a) {
174  return static_cast<std::string>(a);
175  }
176 
177  };
178 
179  // Specialized String Promoters
180  template<>
181  std::string DataStreamPromoter<std::string>::promote(long a);
182 
183  template<>
184  std::string DataStreamPromoter<std::string>::promote(double a);
185 
186  template<>
187  std::string DataStreamPromoter<std::string>::promote(char a);
188 
189  template<>
190  std::string DataStreamPromoter<std::string>::promote(bool a);
191  //\End specialized string promoters
192 
193  template<>
194  struct DataStreamPromoter<double> {
195  template<typename InType>
196  static double promote(InType a) {
197  return static_cast<double>(a);
198  }
199 
200  };
201 
202  //Specialized double promoter
203  template<>
204  double DataStreamPromoter<double>::promote(std::string a);
205 
206  template<>
207  struct DataStreamPromoter<long> {
208  template<typename InType>
209  static long promote(InType a) {
210  return static_cast<long>(a);
211  }
212 
213  };
214 
215  //Specialized long promotion
216  template<>
217  long DataStreamPromoter<long>::promote(double a);
218 
219  template<>
220  long DataStreamPromoter<long>::promote(std::string a);
221  //\End Specialized long promotion
222 
223  template<>
224  struct DataStreamPromoter<bool> {
225  template<typename InType>
226  static bool promote(InType a) {
227  return static_cast<bool>(a);
228  }
229 
230  };
231 
232  // Specialized bool promotion
233  template<>
234  bool DataStreamPromoter<bool>:: promote(double a);
235 
236  template<>
237  bool DataStreamPromoter<bool>:: promote(std::string a);
238 
239  template<>
241  //\End Specialized bool promotion
242 
243  template<>
244  struct DataStreamPromoter<char> {
245  template<typename InType>
246  static char promote(InType a) {
247  return static_cast<char>(a);
248  }
249  };
250 
251  //Specialized char promotion
252  template<>
253  char DataStreamPromoter<char>::promote(double a);
254 
255  template<>
256  char DataStreamPromoter<char>::promote(std::string a);
257 
258  template<>
260  //\End specialized char promotion
261 
262  }
263 
264  template <typename T, typename Promoter = DataStream_impl::DataStreamPromoter<T> >
265  class ValueDataStream : public DataStream {
266  public:
267 
269  DataStream(_traits) {}
270 
271  DataStream &operator<<(const std::string &val) override {
272  m_value = Promoter::promote(val);
273  return *this;
274  }
275 
276  DataStream &operator<<(long val) override {
277  m_value = Promoter::promote(val);
278  return *this;
279  }
280 
281  DataStream &operator<<(double val) override {
282  m_value = Promoter::promote(val);
283  return *this;
284  }
285 
286  DataStream &operator<<(bool val) override {
287  m_value = Promoter::promote(val);
288  return *this;
289  }
290 
291  DataStream &operator<<(char val) override {
292  m_value = Promoter::promote(val);
293  return *this;
294  }
295 
296  const T &value()const {
297  return m_value;
298  }
299  private:
301  };
302 
303 
304  template <typename T, typename Promoter = DataStream_impl::DataStreamPromoter<T> >
305  class VectorDataStream : public DataStream {
306  public:
307 
309  DataStream(_traits) {}
310 
311  DataStream &operator<<(const std::string &val) override {
312  m_vector.push_back(Promoter::promote(val));
313  return *this;
314  }
315 
316  DataStream &operator<<(long val) override {
317  m_vector.push_back(Promoter::promote(val));
318  return *this;
319  }
320 
321  DataStream &operator<<(double val) override {
322  m_vector.push_back(Promoter::promote(val));
323  return *this;
324  }
325 
326  DataStream &operator<<(bool val) override {
327  m_vector.push_back(Promoter::promote(val));
328  return *this;
329  }
330 
331  DataStream &operator<<(char val) override {
332  m_vector.push_back(Promoter::promote(val));
333  return *this;
334  }
335 
336  const std::vector<T> &vector()const {
337  return m_vector;
338  }
339  private:
340  std::vector<T> m_vector;
341  };
342 
343 
344  inline
345  DataStream &operator<<(DataStream &_stream, int i) {
346  return (_stream << (long)i);
347  }
348 
349  inline
350  DataStream &operator<<(DataStream &_stream, float f) {
351  return (_stream << (double)f);
352  }
353 
354  inline
355  DataStream &operator<<(DataStream &_stream, unsigned int i) {
356  return (_stream << (long)i);
357  }
358 
359  inline
360  DataStream &operator<<(DataStream &_stream, unsigned long i) {
361  return (_stream << (long)i);
362  }
363 
364  template<class T>
365  inline
366  DataStream &operator<<(DataStream &_stream, const std::vector<T> &vec) {
367  for(auto it = vec.cbegin(); it != vec.cend(); ++it) {
368  _stream << *it;
369  }
370  return _stream;
371  }
372 
373 }
374 
375 #include "casm/external/Eigen/Dense"
376 namespace Eigen {
377  template <typename Derived>
378  CASM::DataStream &operator<<(CASM::DataStream &_stream, const MatrixBase<Derived> &value) {
379  for(int i = 0; i < value.rows(); i++) {
380  for(int j = 0; j < value.cols(); j++) {
381  _stream << value(i, j);
382  }
383  }
384  return _stream;
385  }
386 
387 }
388 #endif
DataStream & operator<<(DataStreamTraits set_bits)
Definition: DataStream.hh:68
static std::function< DataStream &(DataStream &_strm)> failure(std::string const &_msg)
Definition: DataStream.hh:150
DataStream & operator<<(double val) override
Definition: DataStream.hh:321
DataStream & operator<<(long) override
Definition: DataStream.hh:113
CountDataStream(bool newline_reset=true)
Definition: DataStream.hh:106
Main CASM namespace.
Definition: complete.cpp:8
virtual DataStream & operator<<(double)
Definition: DataStream.hh:38
DataStream & operator<<(long val) override
Definition: DataStream.hh:316
virtual DataStream & operator<<(char)
Definition: DataStream.hh:46
int count() const
Definition: DataStream.hh:135
std::string const & err_msg() const
Definition: DataStream.hh:82
void _set_err_msg(std::string const &_msg)
Definition: DataStream.hh:88
std::ostream & operator<<(std::ostream &_stream, const FormattedPrintable &_formatted)
DataStream & newline() override
Definition: DataStream.hh:129
virtual DataStream & operator<<(const std::string &)
Definition: DataStream.hh:30
DataStream & operator<<(char val) override
Definition: DataStream.hh:291
VectorDataStream(DataStreamTraits _traits=none)
Definition: DataStream.hh:308
DataStream & operator<<(const std::string &val) override
Definition: DataStream.hh:271
DataStream & operator<<(double val) override
Definition: DataStream.hh:281
virtual DataStream & operator<<(long)
Definition: DataStream.hh:34
DataStream & operator<<(const std::string &) override
Definition: DataStream.hh:109
DataStream & operator<<(char) override
Definition: DataStream.hh:125
DataStream & operator<<(DataStream &(*F)(DataStream &))
Definition: DataStream.hh:56
virtual DataStream & newline()
Definition: DataStream.hh:64
DataStream & increment()
Definition: DataStream.hh:139
std::vector< T > m_vector
Definition: DataStream.hh:340
const T & value() const
Definition: DataStream.hh:296
DataStream & operator<<(double) override
Definition: DataStream.hh:117
std::string m_err_msg
Definition: DataStream.hh:98
DataStream & operator<<(bool) override
Definition: DataStream.hh:121
bool fail() const
Definition: DataStream.hh:73
ValueDataStream(DataStreamTraits _traits=none)
Definition: DataStream.hh:268
DataStream & operator<<(long val) override
Definition: DataStream.hh:276
DataStream & operator<<(char val) override
Definition: DataStream.hh:331
static DataStream & endl(DataStream &_strm)
Definition: DataStream.hh:19
DataStream & operator<<(const std::string &val) override
Definition: DataStream.hh:311
DataStream & operator<<(bool val) override
Definition: DataStream.hh:326
virtual DataStream & operator<<(bool)
Definition: DataStream.hh:42
const std::vector< T > & vector() const
Definition: DataStream.hh:336
virtual ~DataStream()
Definition: DataStream.hh:28
DataStream(DataStreamTraits _traits=none)
Definition: DataStream.hh:25
DataStream & operator<<(bool val) override
Definition: DataStream.hh:286