ADTF
builds/digitalwerk/solutions/adtf_content/adtf_base/adtf_core/src/libraries/base/include/adtfbase/chrono.h
Go to the documentation of this file.
1 
7 #pragma once
8 #include <adtf_utils.h>
9 #include <chrono>
10 #include <iostream>
11 
12 #include "adtf_base_type_traits.h"
13 
14 namespace adtf
15 {
16 namespace base
17 {
18 namespace flash
19 {
20 
23 {
24  int64_t nCount;
25 
26  tNanoSeconds():
27  nCount(0)
28  {
29  }
30 
31  tNanoSeconds(const tNanoSeconds&) = default;
32  tNanoSeconds(tNanoSeconds&&) = default;
33 
34  tNanoSeconds& operator=(const tNanoSeconds&) = default;
35  tNanoSeconds& operator=(tNanoSeconds&&) = default;
36 
37  explicit tNanoSeconds(int64_t nCount):
38  nCount(nCount)
39  {
40  }
41 
42  template<typename Representation, typename Period>
43  inline tNanoSeconds(const std::chrono::duration<Representation, Period>& oDuration):
44  nCount(std::chrono::duration_cast<std::chrono::nanoseconds>(oDuration).count())
45  {
46  }
47 
48  tNanoSeconds& operator+=(const tNanoSeconds& tmDuration)
49  {
50  nCount += tmDuration.nCount;
51  return *this;
52  }
53 
54  tNanoSeconds& operator-=(const tNanoSeconds& tmDuration)
55  {
56  nCount -= tmDuration.nCount;
57  return *this;
58  }
59 
60  tNanoSeconds& operator*=(const int64_t& nFactor)
61  {
62  nCount *= nFactor;
63  return *this;
64  }
65 
66  tNanoSeconds& operator/=(const int64_t& nDivisor)
67  {
68  nCount /= nDivisor;
69  return *this;
70  }
71 
72  tNanoSeconds& operator%=(const int64_t& nDivisor)
73  {
74  nCount %= nDivisor;
75  return *this;
76  }
77 
78  inline operator std::chrono::nanoseconds() const
79  {
80  return std::chrono::nanoseconds(nCount);
81  }
82 };
83 
84 inline bool operator<(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
85 {
86  return tmA.nCount < tmB.nCount;
87 }
88 
89 inline bool operator>(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
90 {
91  return tmA.nCount > tmB.nCount;
92 }
93 
94 inline bool operator<=(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
95 {
96  return tmA.nCount <= tmB.nCount;
97 }
98 
99 inline bool operator>=(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
100 {
101  return tmA.nCount >= tmB.nCount;
102 }
103 
104 inline bool operator==(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
105 {
106  return tmA.nCount == tmB.nCount;
107 }
108 
109 inline bool operator!=(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
110 {
111  return tmA.nCount != tmB.nCount;
112 }
113 
114 inline tNanoSeconds operator+(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
115 {
116  return tNanoSeconds{tmA.nCount + tmB.nCount};
117 }
118 
119 inline tNanoSeconds operator-(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
120 {
121  return tNanoSeconds{tmA.nCount - tmB.nCount};
122 }
123 
124 inline tNanoSeconds operator*(const tNanoSeconds& tmDuration, const int64_t& nFactor)
125 {
126  return tNanoSeconds{tmDuration.nCount * nFactor};
127 }
128 
129 inline tNanoSeconds operator*(const int64_t& nFactor, const tNanoSeconds& tmDuration)
130 {
131  return tNanoSeconds{nFactor * tmDuration.nCount};
132 }
133 
134 inline tNanoSeconds operator/(const tNanoSeconds& tmDuration, const int64_t& tmB)
135 {
136  return tNanoSeconds{tmDuration.nCount / tmB};
137 }
138 
139 inline int64_t operator/(const tNanoSeconds& tmA, const tNanoSeconds& tmB)
140 {
141  return tmA.nCount / tmB.nCount;
142 }
143 
144 inline std::ostream& operator<<(std::ostream& output, const tNanoSeconds& tm)
145 {
146  output << tm.nCount;
147  return output;
148 }
149 
156 template <typename DestinationTimeStamp, typename SourceTimeStamp>
157 DestinationTimeStamp duration_cast(const SourceTimeStamp& /*tmSource*/)
158 {
159  static_assert(penguin::detail::always_false<DestinationTimeStamp>, "unsupported duration cast");
160  return DestinationTimeStamp();
161 }
162 
163 template <>
164 inline tTimeStamp duration_cast(const tNanoSeconds& tmSource)
165 {
166  return tmSource.nCount / 1000;
167 }
168 
169 template <>
170 inline tNanoSeconds duration_cast(const tTimeStamp& tmSource)
171 {
172  return tNanoSeconds{tmSource * 1000};
173 }
174 
175 template <>
176 inline std::chrono::nanoseconds duration_cast(const tNanoSeconds& tmSource)
177 {
178  return tmSource;
179 }
180 
181 template <>
182 inline tNanoSeconds duration_cast(const std::chrono::nanoseconds& tmSource)
183 {
184  return tmSource;
185 }
186 
187 template <>
188 inline tTimeStamp duration_cast(const std::chrono::nanoseconds& tmSource)
189 {
190  return tmSource.count() / 1000;
191 }
192 
193 } // namespace flash
194 
195 using flash::tNanoSeconds;
197 
198 } // namespace base
199 } // namespace adtf
Copyright © Audi Electronics Venture GmbH.
tBool operator<(const tErrorCode &lhs, const tErrorCode &rhs)
Less-than operator for POD error type.
tBool operator<=(const tErrorCode &lhs, const tErrorCode &rhs)
Less-than-or-equal operator for POD error type.
tBool operator>(const tErrorCode &lhs, const tErrorCode &rhs)
Greater-than operator for POD error type.
tBool operator!=(const tErrorCode &lhs, const tErrorCode &rhs)
Compare two POD error code types for inequality.
tBool operator==(const tErrorCode &lhs, const tErrorCode &rhs)
Compare two POD error code types for equality.
tBool operator>=(const tErrorCode &lhs, const tErrorCode &rhs)
Greater-than-or-equal operator for POD error type.
simple_pointer_iterator< T >::difference_type operator-(const simple_pointer_iterator< T > &r1, const simple_pointer_iterator< T > &r2)
Define arithmetic - operation between iterators.
simple_pointer_iterator< T >::difference_type operator+(const simple_pointer_iterator< T > &r1, const simple_pointer_iterator< T > &r2)
Define arithmetic + operation between iterators.
DestinationTimeStamp duration_cast(const SourceTimeStamp &)
Duration cast base template to converted between different time resolution.
Namespace for entire ADTF SDK.