YPC  0.2.0
version.h
1 #pragma once
2 #include <string>
3 #include <vector>
4 
5 namespace ypc {
6 
7 class version {
8 public:
9  inline version() : m_data() { m_data.m_data = 0; }
10  explicit version(uint64_t data) : m_data() { m_data.m_data = data; };
11  version(uint32_t major_version, uint16_t minor_version,
12  uint16_t patch_version)
13  : m_data() {
14  m_data.m_detail.m_major_version = major_version;
15  m_data.m_detail.m_minor_version = minor_version;
16  m_data.m_detail.m_patch_version = patch_version;
17  }
18 
19  version(const version &) = default;
20  version &operator=(const version &) = default;
21  version(version &&) = default;
22  version &operator=(version &&) = default;
23  virtual ~version() = default;
24 
25  inline uint32_t major_version() const {
26  return m_data.m_detail.m_major_version;
27  }
28  inline uint16_t minor_version() const {
29  return m_data.m_detail.m_minor_version;
30  }
31  inline uint16_t patch_version() const {
32  return m_data.m_detail.m_patch_version;
33  }
34  inline uint32_t &major_version() { return m_data.m_detail.m_major_version; }
35  inline uint16_t &minor_version() { return m_data.m_detail.m_minor_version; }
36  inline uint16_t &patch_version() { return m_data.m_detail.m_patch_version; }
37 
38  inline uint64_t data() const { return m_data.m_data; }
39 
40  friend inline bool operator<(const version &v1, const version &v2) {
41  if (v1.m_data.m_detail.m_major_version <
42  v2.m_data.m_detail.m_major_version) {
43  return true;
44  }
45  if (v1.m_data.m_detail.m_minor_version <
46  v2.m_data.m_detail.m_minor_version) {
47  return true;
48  }
49  if (v1.m_data.m_detail.m_patch_version <
50  v2.m_data.m_detail.m_patch_version) {
51  return true;
52  }
53  return false;
54  }
55 
56  friend inline bool operator>(const version &v1, const version &v2) {
57  return v2 < v1;
58  }
59 
60  friend inline bool operator>=(const version &v1, const version &v2) {
61  return !(v1 < v2);
62  }
63 
64  friend inline bool operator<=(const version &v1, const version &v2) {
65  return !(v1 > v2);
66  }
67 
68  friend inline bool operator==(const version &v1, const version &v2) {
69  return v1 >= v2 && v2 >= v1;
70  }
71 
72  friend inline bool operator!=(const version &v1, const version &v2) {
73  return !(v1 == v2);
74  }
75 
76 protected:
77  union _version_data {
78  uint64_t m_data;
79  struct _version_detail {
80  uint32_t m_major_version;
81  uint16_t m_minor_version;
82  uint16_t m_patch_version;
83  };
84  _version_detail m_detail;
85  };
86 
87  _version_data m_data;
88 }; // end class version
89 
90 } // namespace ypc
91 
92 #ifndef YPC_SGX
93 std::ostream &operator<<(std::ostream &stream, const ypc::version &v);
94 std::istream &operator>>(std::istream &stream, ypc::version &v);
95 
96 #endif
97 
98 namespace std {
99 std::string to_string(const ypc::version &v);
100 }
101 
ypc::version::_version_data::_version_detail
Definition: version.h:79
ypc::version::_version_data
Definition: version.h:77
ypc::version
Definition: version.h:7