libdballe  7.21
message.h
1 #ifndef DBALLE_MESSAGE_H
2 #define DBALLE_MESSAGE_H
3 
4 #include <dballe/types.h>
5 #include <wreport/varinfo.h>
6 #include <vector>
7 #include <memory>
8 #include <iterator>
9 
10 namespace wreport {
11 struct Var;
12 }
13 
14 namespace dballe {
15 
28 struct Message
29 {
30  virtual ~Message();
31 
33  virtual Datetime get_datetime() const = 0;
34 
36  virtual std::unique_ptr<Message> clone() const = 0;
37 
44  virtual const wreport::Var* get(wreport::Varcode code, const Level& lev, const Trange& tr) const = 0;
45 
47  virtual void print(FILE* out) const = 0;
48 
58  virtual unsigned diff(const Message& msg) const = 0;
59 };
60 
67 class Messages
68 {
69 protected:
70  std::vector<Message*> msgs;
71 
72  // Convert an iterator over pointers to an iterator over values
73  template<typename VAL, typename WRAPPED>
74  class base_iterator : public std::iterator<std::random_access_iterator_tag, VAL, typename WRAPPED::difference_type, VAL*, VAL&>
75  {
76  protected:
77  WRAPPED current;
78 
79  public:
80  base_iterator() {}
81  explicit base_iterator(const WRAPPED& o) : current(o) {}
82 
83  // Forward iterator requirements
84  inline VAL& operator*() const { return **current; }
85  inline VAL* operator->() const { return *current; }
86  inline base_iterator& operator++() { ++current; return *this; }
87  inline base_iterator operator++(int) { return base_iterator(current++); }
88 
89  // Bidirectional iterator requirements
90  inline base_iterator& operator--() { --current; return *this; }
91  inline base_iterator operator--(int) { return base_iterator(current--); }
92 
93  // Random access iterator requirements
94  inline VAL& operator[](typename WRAPPED::difference_type n) const { return *current[n]; }
95  inline base_iterator& operator+=(typename WRAPPED::difference_type n) { current += n; return *this; }
96  inline base_iterator operator+(typename WRAPPED::difference_type n) const { return base_iterator(current + n); }
97  inline base_iterator& operator-=(typename WRAPPED::difference_type n) { current -= n; return *this; }
98  inline base_iterator operator-(typename WRAPPED::difference_type n) const { return base_iterator(current - n); }
99 
100  // Forward iterator requirements
101  template<typename O> inline bool operator==(const O& o) const { return current == o.current; }
102  template<typename O> inline bool operator!=(const O& o) const { return current != o.current; }
103  template<typename O> inline bool operator<(const O& o) const { return current < o.current; }
104  template<typename O> inline bool operator<=(const O& o) const { return current <= o.current; }
105  template<typename O> inline bool operator>(const O& o) const { return current > o.current; }
106  template<typename O> inline bool operator>=(const O& o) const { return current >= o.current; }
107  template<typename O> inline typename WRAPPED::difference_type operator-(const O& o) const { return current - o.current; }
108  };
109 
110 public:
113 
114  Messages();
115  Messages(const Messages& o);
116  Messages(Messages&& o);
117  ~Messages();
118 
119  Messages& operator=(const Messages& o);
120  Messages& operator=(Messages&& o);
121 
122  iterator begin() { return iterator(msgs.begin()); }
123  iterator end() { return iterator(msgs.end()); }
124  const_iterator begin() const { return const_iterator(msgs.begin()); }
125  const_iterator end() const { return const_iterator(msgs.end()); }
126 
127  Message& operator[](size_t pos) { return *msgs[pos]; }
128  const Message& operator[](size_t pos) const { return *msgs[pos]; }
129 
131  bool empty() const;
132 
134  size_t size() const;
135 
137  void append(const Message& msg);
138 
140  void append(std::unique_ptr<Message>&& msg);
141 
143  void clear();
144 
146  void print(FILE* out) const;
147 
159  unsigned diff(const Messages& msgs) const;
160 };
161 
162 }
163 #endif
Common base types used by most of DB-All.e code.
Information on how a value has been sampled or computed with regards to time.
Definition: types.h:587
A bulletin that has been decoded and physically interpreted.
Definition: message.h:28
Copyright (C) 2008–2010 ARPA-SIM urpsim@smr.arpa.emr.it
Definition: cmdline.h:17
Definition: message.h:74
Vertical level or layer.
Definition: types.h:532
uint16_t Varcode
Ordered collection of messages.
Definition: message.h:67
Date and time.
Definition: types.h:158