libdballe  9.11
types.h
Go to the documentation of this file.
1 #ifndef DBALLE_TYPES_H
2 #define DBALLE_TYPES_H
3 
8 #include <dballe/fwd.h>
9 #include <wreport/varinfo.h>
10 #include <memory>
11 #include <iosfwd>
12 #include <functional>
13 
14 namespace wreport {
15 class Var;
16 }
17 
18 namespace dballe {
19 struct CSVWriter;
20 
27 struct Date
28 {
29  unsigned short year;
30  unsigned char month;
31  unsigned char day;
32 
34  Date();
35 
42  Date(int ye, int mo=1, int da=1);
43 
45  Date(const Date& d) = default;
46 
48  static Date from_julian(int jday);
49 
51  bool is_missing() const;
52 
54  int to_julian() const;
55 
59  void to_stream_iso8601(std::ostream& out) const;
60 
64  void to_csv_iso8601(CSVWriter& out) const;
65 
73  int compare(const Date& other) const;
74 
75  bool operator<(const Date& dt) const;
76  bool operator>(const Date& dt) const;
77  bool operator==(const Date& dt) const;
78  bool operator!=(const Date& dt) const;
79 
81  static void validate(int ye, int mo, int da);
83  static int days_in_month(int year, int month);
85  static int calendar_to_julian(int year, int month, int day);
87  static void julian_to_calendar(int jday, unsigned short& year, unsigned char& month, unsigned char& day);
88 };
89 
90 std::ostream& operator<<(std::ostream& out, const Date& dt);
91 
92 
99 struct Time
100 {
101  unsigned char hour;
102  unsigned char minute;
103  unsigned char second;
104 
106  Time();
107 
114  Time(int ho, int mi=0, int se=0);
115 
116  Time(const Time& t) = default;
117 
119  bool is_missing() const;
120 
125  void to_stream_iso8601(std::ostream& out) const;
126 
130  void to_csv_iso8601(CSVWriter& out) const;
131 
139  int compare(const Time& other) const;
140 
141  bool operator<(const Time& dt) const;
142  bool operator>(const Time& dt) const;
143  bool operator==(const Time& dt) const;
144  bool operator!=(const Time& dt) const;
145 
152  static void validate(int ho, int mi, int se);
153 };
154 
155 std::ostream& operator<<(std::ostream& out, const Time& t);
156 
157 
164 struct Datetime
165 {
166  unsigned short year;
167  unsigned char month;
168  unsigned char day;
169  unsigned char hour;
170  unsigned char minute;
171  unsigned char second;
172 
174  Datetime();
175  Datetime(const Date& date, const Time& time);
176 
183  Datetime(int ye, int mo=1, int da=1, int ho=0, int mi=0, int se=0);
184 
186  static Datetime from_julian(int jday, int ho=0, int mi=0, int se=0);
187 
192  static Datetime lower_bound(int ye, int mo, int da, int ho, int mi, int se);
193 
198  static Datetime upper_bound(int ye, int mo, int da, int ho, int mi, int se);
199 
201  void set_lower_bound();
202 
204  void set_upper_bound();
205 
207  Date date() const;
208 
210  Time time() const;
211 
213  bool is_missing() const;
214 
216  int to_julian() const;
217 
225  int compare(const Datetime& other) const;
226 
227  bool operator==(const Datetime& o) const;
228  bool operator!=(const Datetime& o) const;
229  bool operator<(const Datetime& o) const;
230  bool operator>(const Datetime& o) const;
231  bool operator<=(const Datetime& o) const;
232  bool operator>=(const Datetime& o) const;
233 
237  int print_iso8601(FILE* out, char sep='T', const char* end="\n") const;
238 
242  int print(FILE* out, const char* end="\n") const;
243 
251  void to_stream_iso8601(std::ostream& out, char sep='T', const char* tz="") const;
252 
256  void to_csv_iso8601(CSVWriter& out, char sep='T', const char* tz="") const;
257 
259  std::string to_string(char sep='T', const char* tz="") const;
260 
266  static Datetime from_iso8601(const char* str);
267 
276  static void validate(int ye, int mo, int da, int ho, int mi, int se);
277 
282  static void normalise_h24(int& ye, int& mo, int& da, int& ho, int& mi, int& se);
283 };
284 
285 std::ostream& operator<<(std::ostream& out, const Datetime& dt);
286 
287 
295 {
300 
301  DatetimeRange() = default;
302  DatetimeRange(const Datetime& min, const Datetime& max) : min(min), max(max) {}
304  int yemin, int momin, int damin, int homin, int mimin, int semin,
305  int yemax, int momax, int damax, int homax, int mimax, int semax);
306 
308  bool is_missing() const;
309 
310  bool operator==(const DatetimeRange& o) const;
311  bool operator!=(const DatetimeRange& o) const;
312  bool operator<(const DatetimeRange& o) const;
313  bool operator<=(const DatetimeRange& o) const;
314  bool operator>(const DatetimeRange& o) const;
315  bool operator>=(const DatetimeRange& o) const;
316 
318  void set(const Datetime& min, const Datetime& max);
319 
332  void set(int yemin, int momin, int damin, int homin, int mimin, int semin,
333  int yemax, int momax, int damax, int homax, int mimax, int semax);
334 
339  void merge(const DatetimeRange& range);
340 
342  bool contains(const Datetime& dt) const;
343 
345  bool contains(const DatetimeRange& dtr) const;
346 
348  bool is_disjoint(const DatetimeRange& dtr) const;
349 
351  int print(FILE* out, const char* end="\n") const;
352 };
353 
354 std::ostream& operator<<(std::ostream& out, const DatetimeRange& dtr);
355 
356 
368 struct Coords
369 {
371  int lat = MISSING_INT;
372 
377  int lon = MISSING_INT;
378 
380  Coords() = default;
382  Coords(int lat, int lon);
384  Coords(double lat, double lon);
385 
387  bool is_missing() const;
388 
390  void set_lat(double lat);
391 
393  void set_lon(double lon);
394 
396  void set_lat(int lat);
397 
399  void set_lon(int lon);
400 
402  void set(int lat, int lon);
403 
405  void set(double lat, double lon);
406 
408  double dlat() const;
409 
411  double dlon() const;
412 
423  int compare(const Coords& o) const;
424 
425  bool operator==(const Coords& o) const;
426  bool operator!=(const Coords& o) const;
427  bool operator<(const Coords& o) const;
428  bool operator>(const Coords& o) const;
429  bool operator<=(const Coords& o) const;
430  bool operator>=(const Coords& o) const;
431 
433  int print(FILE* out, const char* end="\n") const;
434 
436  std::string to_string(const char* undef="-") const;
437 
439  static int lat_to_int(double lat);
440 
442  static int lon_to_int(double lat);
443 
445  static double lat_from_int(int lat);
446 
448  static double lon_from_int(int lon);
449 };
450 
451 std::ostream& operator<<(std::ostream&, const Coords&);
452 
453 
467 struct LatRange
468 {
470  static constexpr int IMIN = -9000000;
472  static constexpr int IMAX = 9000000;
474  static constexpr double DMIN = -90.0;
476  static constexpr double DMAX = 90.0;
477 
479  int imin = IMIN;
481  int imax = IMAX;
482 
484  LatRange() = default;
486  LatRange(int min, int max);
488  LatRange(double min, double max);
489 
490  bool operator==(const LatRange& lr) const;
491  bool operator!=(const LatRange& lr) const;
492 
494  bool is_missing() const;
495 
497  double dmin() const;
498 
500  double dmax() const;
501 
503  void get(double& min, double& max) const;
504 
506  void set(int min, int max);
507 
509  void set(double min, double max);
510 
512  bool contains(int lat) const;
513 
515  bool contains(double lat) const;
516 
518  bool contains(const LatRange& lr) const;
519 
526  int print(FILE* out, const char* end="\n") const;
527 };
528 
529 std::ostream& operator<<(std::ostream& out, const LatRange& lr);
530 
531 
551 struct LonRange
552 {
554  int imin = MISSING_INT;
556  int imax = MISSING_INT;
557 
559  LonRange() = default;
561  LonRange(int min, int max);
563  LonRange(double min, double max);
564 
565  bool operator==(const LonRange& lr) const;
566  bool operator!=(const LonRange& lr) const;
567 
569  bool is_missing() const;
570 
572  double dmin() const;
573 
575  double dmax() const;
576 
582  void get(double& min, double& max) const;
583 
588  void set(int min, int max);
589 
594  void set(double min, double max);
595 
600  void set(const LonRange& lr);
601 
603  bool contains(int lon) const;
604 
606  bool contains(double lon) const;
607 
609  bool contains(const LonRange& lr) const;
610 
617  int print(FILE* out, const char* end="\n") const;
618 };
619 
620 std::ostream& operator<<(std::ostream& out, const LonRange& lr);
621 
622 
624 struct Level
625 {
627  int ltype1;
629  int l1;
631  int ltype2;
633  int l2;
634 
635  Level(int ltype1=MISSING_INT, int l1=MISSING_INT, int ltype2=MISSING_INT, int l2=MISSING_INT)
636  : ltype1(ltype1), l1(l1), ltype2(ltype2), l2(l2) {}
637 
639  bool is_missing() const;
640 
641  bool operator==(const Level& o) const;
642  bool operator!=(const Level& o) const;
643  bool operator<(const Level& o) const;
644  bool operator>(const Level& o) const;
645  bool operator<=(const Level& o) const;
646  bool operator>=(const Level& o) const;
647 
655  int compare(const Level& l) const;
656 
660  std::string describe() const;
661 
663  void to_stream(std::ostream& out, const char* undef="-") const;
664 
666  std::string to_string(const char* undef="-") const;
667 
671  void to_csv(CSVWriter& out) const;
672 
674  static Level cloud(int ltype2=MISSING_INT, int l2=MISSING_INT);
675 
677  int print(FILE* out, const char* undef="-", const char* end="\n") const;
678 };
679 
680 std::ostream& operator<<(std::ostream& out, const Level& l);
681 
682 
686 struct Trange
687 {
689  int pind;
691  int p1;
693  int p2;
694 
695  Trange(int pind=MISSING_INT, int p1=MISSING_INT, int p2=MISSING_INT)
696  : pind(pind), p1(p1), p2(p2) {}
697 
699  bool is_missing() const;
700 
708  int compare(const Trange& t) const;
709 
710  bool operator==(const Trange& o) const;
711  bool operator!=(const Trange& o) const;
712  bool operator<(const Trange& o) const;
713  bool operator>(const Trange& o) const;
714  bool operator<=(const Trange& o) const;
715  bool operator>=(const Trange& o) const;
716 
720  std::string describe() const;
721 
723  void to_stream(std::ostream& out, const char* undef="-") const;
724 
726  std::string to_string(const char* undef="-") const;
727 
731  void to_csv(CSVWriter& out) const;
732 
734  static Trange instant();
735 
737  int print(FILE* out, const char* undef="-", const char* end="\n") const;
738 };
739 
740 std::ostream& operator<<(std::ostream& out, const Trange& l);
741 
742 
747 class Ident
748 {
749 protected:
750  char* value = nullptr;
751 
752 public:
753  Ident() = default;
754  Ident(const char* value);
755  Ident(const std::string& value);
756  Ident(const Ident& o);
757  Ident(Ident&& o);
758  ~Ident();
759  Ident& operator=(const Ident& o);
760  Ident& operator=(Ident&& o);
761  Ident& operator=(const char* o);
762  Ident& operator=(const std::string& o);
763 
765  const char* get() const { return value; }
766 
768  void clear();
769 
770  int compare(const Ident& o) const;
771  int compare(const char* o) const;
772  int compare(const std::string& o) const;
773  template<typename T> bool operator==(const T& o) const { return compare(o) == 0; }
774  template<typename T> bool operator!=(const T& o) const { return compare(o) != 0; }
775  template<typename T> bool operator<(const T& o) const { return compare(o) < 0; }
776  template<typename T> bool operator<=(const T& o) const { return compare(o) <= 0; }
777  template<typename T> bool operator>(const T& o) const { return compare(o) > 0; }
778  template<typename T> bool operator>=(const T& o) const { return compare(o) >= 0; }
779 
781  bool is_missing() const;
782 
783  operator const char*() const { return value; }
784  operator std::string() const;
785 };
786 
787 std::ostream& operator<<(std::ostream&, const Ident&);
788 
789 
793 struct Station
794 {
796  std::string report;
797 
800 
803 
804 
805  Station() = default;
806 
808  bool is_missing() const;
809 
810  bool operator==(const Station& o) const
811  {
812  return std::tie(report, coords, ident) == std::tie(o.report, o.coords, o.ident);
813  }
814  bool operator!=(const Station& o) const
815  {
816  return std::tie(report, coords, ident) != std::tie(o.report, o.coords, o.ident);
817  }
818  bool operator<(const Station& o) const
819  {
820  return std::tie(report, coords, ident) < std::tie(o.report, o.coords, o.ident);
821  }
822  bool operator<=(const Station& o) const
823  {
824  return std::tie(report, coords, ident) <= std::tie(o.report, o.coords, o.ident);
825  }
826  bool operator>(const Station& o) const
827  {
828  return std::tie(report, coords, ident) > std::tie(o.report, o.coords, o.ident);
829  }
830  bool operator>=(const Station& o) const
831  {
832  return std::tie(report, coords, ident) >= std::tie(o.report, o.coords, o.ident);
833  }
834 
841  int print(FILE* out, const char* end="\n") const;
842 
844  std::string to_string(const char* undef="-") const;
845 };
846 
847 std::ostream& operator<<(std::ostream&, const Station&);
848 
849 
850 struct DBStation : public Station
851 {
857  int id = MISSING_INT;
858 
859 
860  DBStation() = default;
861 
863  bool is_missing() const;
864 
865  bool operator==(const DBStation& o) const
866  {
867  return std::tie(id, report, coords, ident) == std::tie(o.id, o.report, o.coords, o.ident);
868  }
869  bool operator!=(const DBStation& o) const
870  {
871  return std::tie(id, report, coords, ident) != std::tie(o.id, o.report, o.coords, o.ident);
872  }
873  bool operator<(const DBStation& o) const
874  {
875  return std::tie(id, report, coords, ident) < std::tie(o.id, o.report, o.coords, o.ident);
876  }
877  bool operator<=(const DBStation& o) const
878  {
879  return std::tie(id, report, coords, ident) <= std::tie(o.id, o.report, o.coords, o.ident);
880  }
881  bool operator>(const DBStation& o) const
882  {
883  return std::tie(id, report, coords, ident) > std::tie(o.id, o.report, o.coords, o.ident);
884  }
885  bool operator>=(const DBStation& o) const
886  {
887  return std::tie(id, report, coords, ident) >= std::tie(o.id, o.report, o.coords, o.ident);
888  }
889 
896  int print(FILE* out, const char* end="\n") const;
897 
899  std::string to_string(const char* undef="-") const;
900 };
901 
902 std::ostream& operator<<(std::ostream&, const DBStation&);
903 
904 }
905 
906 namespace std {
907 
908 template<> struct hash<dballe::Level>
909 {
911  typedef size_t result_type;
912  result_type operator()(argument_type const& o) const noexcept;
913 };
914 
915 template<> struct hash<dballe::Trange>
916 {
918  typedef size_t result_type;
919  result_type operator()(argument_type const& o) const noexcept;
920 };
921 
922 template<> struct hash<dballe::Coords>
923 {
925  typedef size_t result_type;
926  result_type operator()(argument_type const& o) const noexcept;
927 };
928 
929 template<> struct hash<dballe::Ident>
930 {
932  typedef size_t result_type;
933  result_type operator()(argument_type const& o) const noexcept;
934 };
935 
936 template<> struct hash<dballe::Station>
937 {
939  typedef size_t result_type;
940  result_type operator()(argument_type const& o) const noexcept;
941 };
942 
943 template<> struct hash<dballe::DBStation>
944 {
946  typedef size_t result_type;
947  result_type operator()(argument_type const& o) const noexcept;
948 };
949 
950 }
951 
952 #endif
double dmax() const
Get the upper extreme as double.
Definition: csv.h:140
Time time() const
Return a Time with this time.
int ltype1
Type of the level or the first layer.
Definition: types.h:627
static constexpr int IMIN
Minimum possible integer value.
Definition: types.h:470
void to_stream_iso8601(std::ostream &out) const
Write the time to an output stream in ISO8601 extended format (hh:mm:ss).
LonRange()=default
Construct a range that matches any longitude.
int ltype2
Type of the the second layer.
Definition: types.h:631
void to_csv_iso8601(CSVWriter &out) const
Write the time as a CSV field in ISO8601 date format.
Ident ident
Mobile station identifier.
Definition: types.h:802
Coords()=default
Construct a missing Coords.
std::string describe() const
Return a string description of this time range.
double dlat() const
Get the latitude in degrees.
Datetime()
Construct a missing datetime.
bool contains(int lat) const
Check if a point is inside this range (extremes included)
Station information.
Definition: types.h:793
bool is_missing() const
Check if the Ident is set to the missing value.
Date date() const
Return a Date with this date.
static void validate(int ye, int mo, int da)
Raise an exception if the three values do not represent a valid date.
Time()
Construct a missing time.
int compare(const Time &other) const
Generic comparison.
static Trange instant()
Time range for instant values.
bool is_missing() const
Return true if the LatRange matches any latitude.
int print(FILE *out, const char *undef="-", const char *end="\) const
Print to an output stream.
static void julian_to_calendar(int jday, unsigned short &year, unsigned char &month, unsigned char &day)
Convert a Julian day into a calendar date.
int compare(const Trange &t) const
Generic comparison.
Calendar date.
Definition: types.h:27
bool is_missing() const
Check if this range is open on both sides.
bool is_missing() const
Return true if all the station fields are empty.
Coords coords
Station coordinates.
Definition: types.h:799
static Datetime upper_bound(int ye, int mo, int da, int ho, int mi, int se)
Return a Datetime filling the parts set to MISSING_INT with their highest possible values...
Coordinates.
Definition: types.h:368
static constexpr int IMAX
Maximum possible integer value.
Definition: types.h:472
std::string to_string(const char *undef="-") const
Format to a string.
int p1
Time range P1 indicator.
Definition: types.h:691
void to_csv(CSVWriter &out) const
Write the datetime to a CSV writer as 3 fields.
int print_iso8601(FILE *out, char sep='T', const char *end="\) const
Print to an output stream in ISO8601 combined format.
std::string to_string(const char *undef="-") const
Format to a string.
static int calendar_to_julian(int year, int month, int day)
Convert a calendar date into a Julian day.
Definition: utils.h:31
int imin
Initial point of the longitude range.
Definition: types.h:554
std::string to_string(const char *undef="-") const
Format to a string.
void set_lat(double lat)
Set the latitude only.
Information on how a value has been sampled or computed with regards to time.
Definition: types.h:686
int print(FILE *out, const char *end="\) const
Print to an output stream.
static constexpr double DMAX
Maximum possible double value.
Definition: types.h:476
static void normalise_h24(int &ye, int &mo, int &da, int &ho, int &mi, int &se)
Convert a datetime with an hour of 24:00:00 to hour 00:00:00 of the following day.
void to_stream(std::ostream &out, const char *undef="-") const
Format to an output stream.
int pind
Time range type indicator.
Definition: types.h:689
static int lon_to_int(double lat)
Convert a longitude to the internal integer representation.
void set_lower_bound()
Fill possibly missing fields with their lowest valid value.
double dmax() const
Get the upper extreme as double, or 180.0 if missing.
void to_stream_iso8601(std::ostream &out) const
Write the date to an output stream in ISO8601 date format.
int print(FILE *out, const char *end="\) const
Print the Station to a FILE*.
static int lat_to_int(double lat)
Convert a latitude to the internal integer representation.
Definition: cmdline.h:18
static Datetime from_julian(int jday, int ho=0, int mi=0, int se=0)
Set the date from a Julian day.
int to_julian() const
Convert the date to Julian day.
int print(FILE *out, const char *end="\) const
Print to an output stream in ISO8601 combined format.
static Date from_julian(int jday)
Create a date from a Julian day.
static constexpr double DMIN
Minimum possible double value.
Definition: types.h:474
bool is_missing() const
Return true if all the station fields are empty.
bool contains(int lon) const
Check if a point is inside this range (extremes included)
void to_stream_iso8601(std::ostream &out, char sep='T', const char *tz="") const
Write the datetime to an output stream in ISO8601 combined format.
int print(FILE *out, const char *end="\) const
Print the Station to a FILE*.
Vertical level or layer.
Definition: types.h:624
int print(FILE *out, const char *end="\) const
Print the LonRange to a FILE*.
bool is_missing() const
Return true if the LonRange matches any longitude.
A station identifier, that can be any string (including the empty string) or a missing value...
Definition: types.h:747
static Datetime lower_bound(int ye, int mo, int da, int ho, int mi, int se)
Return a Datetime filling the parts set to MISSING_INT with their lowest possible values...
static double lon_from_int(int lon)
Convert a longitude from the internal integer representation.
std::string to_string(char sep='T', const char *tz="") const
Write to a string in ISO8601 combined format.
int l2
L2 value of the second layer.
Definition: types.h:633
int to_julian() const
Convert the date to Julian day.
bool is_missing() const
Check if this date is the missing value.
bool contains(const Datetime &dt) const
Check if a Datetime is inside this range.
void set_upper_bound()
Fill possibly missing fields with their highest valid value.
Range of datetimes.
Definition: types.h:294
std::string to_string(const char *undef="-") const
Format to a string.
int imax
Final point of the longitude range.
Definition: types.h:556
void to_csv_iso8601(CSVWriter &out) const
Write the date as a CSV field in ISO8601 date format.
Datetime max
Upper bound of the range.
Definition: types.h:299
bool is_missing() const
Check if this time is the missing value.
void clear()
Set to missing value.
void to_stream(std::ostream &out, const char *undef="-") const
Format to an output stream.
std::string report
Report name for this station.
Definition: types.h:796
int lat
Latitude in 1/100000 of a degree (5 significant digits preserved)
Definition: types.h:371
int imin
Minimum latitude.
Definition: types.h:479
int id
Database ID of the station.
Definition: types.h:857
Range of latitudes.
Definition: types.h:467
static void validate(int ye, int mo, int da, int ho, int mi, int se)
Raise an exception if the three values do not represent a valid date/time.
Time of the day.
Definition: types.h:99
LatRange()=default
Construct a LatRange matching any latitude.
Datetime min
Lower bound of the range.
Definition: types.h:297
int lon
Longitude in 1/100000 of a degree (5 significant digits preserved) and normalised between -180...
Definition: types.h:377
int compare(const Coords &o) const
Compare two Coords strutures, for use in sorting.
double dmin() const
Get the lower extreme as double.
int print(FILE *out, const char *end="\) const
Print to an output stream in ISO8601 combined format.
void to_csv_iso8601(CSVWriter &out, char sep='T', const char *tz="") const
Write the datetime as a CSV field in ISO8601 date format.
Date and time.
Definition: types.h:164
int imax
Maximum latitude.
Definition: types.h:481
int compare(const Level &l) const
Generic comparison.
bool is_disjoint(const DatetimeRange &dtr) const
Check if the two ranges are completely disjoint.
static Datetime from_iso8601(const char *str)
Parse an ISO8601 datetime string.
int compare(const Date &other) const
Generic comparison.
double dlon() const
Get the longitude in degrees.
bool is_missing() const
Check if this datetime is the missing value.
Date()
Construct a missing date.
bool is_missing() const
Check if these coordinates are undefined.
Definition: types.h:850
std::string describe() const
Return a string description of this level.
static double lat_from_int(int lat)
Convert a latitude from the internal integer representation.
void merge(const DatetimeRange &range)
Merge range into this one, resulting in the smallest range that contains both.
static int days_in_month(int year, int month)
Return the number of days in the given month.
Range of longitudes.
Definition: types.h:551
int print(FILE *out, const char *undef="-", const char *end="\) const
Print to an output stream.
int l1
L1 value of the level or the first layer.
Definition: types.h:629
int compare(const Datetime &other) const
Generic comparison.
static Level cloud(int ltype2=MISSING_INT, int l2=MISSING_INT)
Create a cloud special level.
int p2
Time range P2 indicator.
Definition: types.h:693
void set_lon(double lon)
Set the longitude only.
bool is_missing() const
Check if this level is fully set to the missing value.
std::string to_string(const char *undef="-") const
Format to a string.
int print(FILE *out, const char *end="\) const
Print the LatRange to a FILE*.
static void validate(int ho, int mi, int se)
Raise an exception if the three values do not represent a valid time.
double dmin() const
Get the lower extreme as double, or -180.0 if missing.
void to_csv(CSVWriter &out) const
Write the datetime to a CSV writer as 4 fields.
bool is_missing() const
Check if this level is fully set to the missing value.