IODA Bundle
Header.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 1996-2012 ECMWF.
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  * In applying this licence, ECMWF does not waive the privileges and immunities
7  * granted to it by virtue of its status as an intergovernmental organisation nor
8  * does it submit to any jurisdiction.
9  */
10 
11 /// @author Piotr Kuchta
12 /// @date April 2009
13 /// @author Simon Smart
14 /// @date January 2019
15 
16 #ifndef odc_core_Header_H
17 #define odc_core_Header_H
18 
19 #include <cstddef>
20 #include <cstdint>
21 #include <map>
22 #include <string>
23 #include <vector>
24 
25 #include "eckit/memory/NonCopyable.h"
26 #include "eckit/io/Buffer.h"
27 
28 namespace eckit { class DataHandle; }
29 
30 
31 namespace odc {
32 namespace core {
33 
34 class MetaData;
35 using Properties = std::map<std::string, std::string>;
36 using Flags = std::vector<double>;
37 
38 //----------------------------------------------------------------------------------------------------------------------
39 
40 const int32_t BYTE_ORDER_INDICATOR = 1;
41 const uint16_t ODA_MAGIC_NUMBER = 0xffff;
42 
43 const int32_t FORMAT_VERSION_NUMBER_MAJOR = 0;
44 const int32_t FORMAT_VERSION_NUMBER_MINOR = 5;
45 
46 //----------------------------------------------------------------------------------------------------------------------
47 
48 class Header : private eckit::NonCopyable {
49 
50 public: // methods
51 
52  Header (MetaData& md, Properties& props);
53  ~Header ();
54 
55  size_t dataSize() const { return dataSize_; }
56 
57  size_t rowsNumber() const { return rowsNumber_; }
58 
59  int32_t byteOrder() { return byteOrder_; }
60 
61  /// read Magic loads the MAGIC from the data handle. Returns 0 for end of stream,
62  /// and throws an exception if the magic is incorrect.
63  static bool readMagic(eckit::DataHandle& dh);
64 
65  void loadAfterMagic(eckit::DataHandle& dh);
66 
67  static std::pair<eckit::Buffer, size_t>
68  serializeHeader(size_t dataSize, size_t rowsNumber, const Properties& properties, const MetaData& columns);
69 
70  static std::pair<eckit::Buffer, size_t>
71  serializeHeaderOtherByteOrder(size_t dataSize, size_t rowsNumber, const Properties& properties, const MetaData& columns);
72 
73 private: // members
74 
75  template <typename ByteOrder> void load(eckit::DataHandle& dh);
76 
79  size_t dataSize_;
80  size_t rowsNumber_;
81 
82  int32_t byteOrder_;
83 };
84 
85 //----------------------------------------------------------------------------------------------------------------------
86 
87 } // namespace core
88 } // namespace odc
89 
90 
91 #endif // odc_core_Header_H
void load(eckit::DataHandle &dh)
Definition: Header.cc:51
Header(MetaData &md, Properties &props)
Definition: Header.cc:30
static bool readMagic(eckit::DataHandle &dh)
Definition: Header.cc:39
Properties & props_
Definition: Header.h:78
size_t dataSize_
Definition: Header.h:79
size_t rowsNumber() const
Definition: Header.h:57
size_t rowsNumber_
Definition: Header.h:80
MetaData & md_
Definition: Header.h:77
static std::pair< eckit::Buffer, size_t > serializeHeader(size_t dataSize, size_t rowsNumber, const Properties &properties, const MetaData &columns)
Definition: Header.cc:204
void loadAfterMagic(eckit::DataHandle &dh)
Definition: Header.cc:119
int32_t byteOrder_
Definition: Header.h:82
size_t dataSize() const
Definition: Header.h:55
int32_t byteOrder()
Definition: Header.h:59
static std::pair< eckit::Buffer, size_t > serializeHeaderOtherByteOrder(size_t dataSize, size_t rowsNumber, const Properties &properties, const MetaData &columns)
Definition: Header.cc:208
std::map< std::string, std::string > Properties
Definition: Header.h:35
const int32_t FORMAT_VERSION_NUMBER_MAJOR
Definition: Header.h:43
const uint16_t ODA_MAGIC_NUMBER
Definition: Header.h:41
const int32_t BYTE_ORDER_INDICATOR
Definition: Header.h:40
std::vector< double > Flags
Definition: Header.h:36
const int32_t FORMAT_VERSION_NUMBER_MINOR
Definition: Header.h:44
Definition: ColumnInfo.h:23