csnip  0.1
time.h
Go to the documentation of this file.
1 #ifndef CSNIP_TIME_H
2 #define CSNIP_TIME_H
3 
51 #include <time.h>
52 
53 #include <csnip/err.h>
54 
55 #ifdef __cplusplus
56 extern "C" {
57 #endif
58 
59 struct timeval;
60 
64 struct timespec csnip_time_time_t_as_timespec(time_t t);
66 struct timespec csnip_time_float_as_timespec(float f);
68 struct timespec csnip_time_double_as_timespec(double d);
70 struct timespec csnip_time_ldouble_as_timespec(long double d);
72 struct timespec csnip_time_timeval_as_timespec(struct timeval tv);
79 time_t csnip_time_timespec_as_time_t(struct timespec ts);
81 float csnip_time_timespec_as_float(struct timespec ts);
83 double csnip_time_timespec_as_double(struct timespec ts);
85 long double csnip_time_timespec_as_ldouble(struct timespec ts);
87 struct timeval csnip_time_timespec_as_timeval(struct timespec ts);
91 int csnip_time_sleep(struct timespec ts);
93 int csnip_time_is_less(struct timespec a, struct timespec b);
95 int csnip_time_is_less_equal(struct timespec a, struct timespec b);
97 struct timespec csnip_time_add(struct timespec a, struct timespec b);
99 struct timespec csnip_time_sub(struct timespec a, struct timespec b);
100 
101 #ifdef __cplusplus
102 }
103 #endif
104 
112 #define csnip_time_AsTimespec(src) \
113  csnip_time__AsTimespec((src))
115 #define csnip_time__AsTimespec(src) \
116  _Generic(src, \
117  time_t: \
118  csnip_time_time_t_as_timespec( \
119  _Generic(src, time_t: src, default: 0)), \
120  float: \
121  csnip_time_float_as_timespec( \
122  _Generic(src, float: src, default: 0)), \
123  double: \
124  csnip_time_double_as_timespec( \
125  _Generic(src, double: src, default: 0)), \
126  long double: \
127  csnip_time_ldouble_as_timespec( \
128  _Generic(src, long double: src, default: 0)), \
129  struct timeval: \
130  csnip_time_timeval_as_timespec( \
131  _Generic(src, struct timeval: src, \
132  default: (struct timeval){ 0 })), \
133  struct timespec: src)
143 #define csnip_time_Convert(src, target) \
144  csnip_time__Convert((src), (target), csnip__tmp_ts)
146 #define csnip_time__Convert(src, target, tmp) \
147  do { \
148  struct timespec tmp = \
149  csnip_time_AsTimespec(src); \
150  target = _Generic(target, \
151  time_t: \
152  csnip_time_timespec_as_time_t(tmp), \
153  float: \
154  csnip_time_timespec_as_float(tmp), \
155  double: \
156  csnip_time_timespec_as_double(tmp), \
157  long double: \
158  csnip_time_timespec_as_ldouble(tmp), \
159  struct timeval: \
160  csnip_time_timespec_as_timeval(tmp), \
161  struct timespec: \
162  tmp); \
163  } while (0)
171 #define csnip_time_Sleep(amount, err) \
172  csnip_time__Sleep((amount), (err), csnip__cerr)
174 #define csnip_time__Sleep(amount, err, cerr) \
175  do { \
176  const int cerr = csnip_time_sleep( \
177  csnip_time_AsTimespec(amount)); \
178  if (cerr != 0) { \
179  csnip_err_Raise(cerr, err); \
180  } \
181  } while (0)
190 #define csnip_time_IsLess(time_a, time_b) \
191  csnip_time_is_less( \
192  csnip_time_AsTimespec(time_a), \
193  csnip_time_AsTimespec(time_b))
194 
201 #define csnip_time_IsLessEqual(time_a, time_b) \
202  csnip_time__IsLessEqual((time_a), (time_b))
204 #define csnip_time__IsLessEqual(time_a, time_b) \
205  csnip_time_is_less_equal( \
206  csnip_time_AsTimespec(time_a), \
207  csnip_time_AsTimespec(time_b))
216 #define csnip_time_Add(time_a, time_b) \
217  csnip_time_add( \
218  csnip_time_AsTimespec(time_a), \
219  csnip_time_AsTimespec(time_b))
220 
227 #define csnip_time_Sub(time_a, time_b) \
228  csnip_time_sub( \
229  csnip_time_AsTimespec(time_a), \
230  csnip_time_AsTimespec(time_b))
231 
234 #endif /* CSNIP_TIME_H */
235 
236 #if defined(CSNIP_SHORT_NAMES) && !defined(CSNIP_TIME_HAVE_SHORT_NAMES)
237 #define time_time_t_as_timespec csnip_time_time_t_as_timespec
238 #define time_float_as_timespec csnip_time_float_as_timespec
239 #define time_double_as_timespec csnip_time_double_as_timespec
240 #define time_ldouble_as_timespec csnip_time_ldouble_as_timespec
241 #define time_timeval_as_timespec csnip_time_timeval_as_timespec
242 #define time_timespec_as_time_t csnip_time_timespec_as_time_t
243 #define time_timespec_as_float csnip_time_timespec_as_float
244 #define time_timespec_as_double csnip_time_timespec_as_double
245 #define time_timespec_as_ldouble csnip_time_timespec_as_ldouble
246 #define time_timespec_as_timeval csnip_time_timespec_as_timeval
247 #define time_sleep csnip_time_sleep
248 #define time_is_less csnip_time_is_less
249 #define time_is_less_equal csnip_time_is_less_equal
250 #define time_add csnip_time_add
251 #define time_sub csnip_time_sub
252 #define time_AsTimespec csnip_time_AsTimespec
253 #define time_Convert csnip_time_Convert
254 #define time_Sleep csnip_time_Sleep
255 #define time_IsLess csnip_time_IsLess
256 #define time_IsLessEqual csnip_time_IsLessEqual
257 #define time_Add csnip_time_Add
258 #define time_Sub csnip_time_Sub
259 #define CSNIP_TIME_HAVE_SHORT_NAMES
260 #endif /* CSNIP_SHORT_NAMES && !CSNIP_TIME_HAVE_SHORT_NAMES */
Error handling.
struct timespec csnip_time_double_as_timespec(double d)
double -> timespec
struct timespec csnip_time_add(struct timespec a, struct timespec b)
Compute the sum of two durations.
Definition: time.c:81
struct timeval csnip_time_timespec_as_timeval(struct timespec ts)
timespec -> timeval
Definition: time.c:46
int csnip_time_sleep(struct timespec ts)
Sleep with subsecond precision.
Definition: time.c:54
int csnip_time_is_less_equal(struct timespec a, struct timespec b)
Less-than-or-equal comparison.
Definition: time.c:72
struct timespec csnip_time_sub(struct timespec a, struct timespec b)
Compute the difference of two durations.
Definition: time.c:95
float csnip_time_timespec_as_float(struct timespec ts)
timespec -> float
time_t csnip_time_timespec_as_time_t(struct timespec ts)
timespec -> time_t
struct timespec csnip_time_time_t_as_timespec(time_t t)
time_t -> timespec
int csnip_time_is_less(struct timespec a, struct timespec b)
Less-than comparison.
Definition: time.c:63
long double csnip_time_timespec_as_ldouble(struct timespec ts)
timespec -> long double
struct timespec csnip_time_timeval_as_timespec(struct timeval tv)
timeval -> timespec
Definition: time.c:24
double csnip_time_timespec_as_double(struct timespec ts)
timespec -> double
struct timespec csnip_time_ldouble_as_timespec(long double d)
long double -> timespec
struct timespec csnip_time_float_as_timespec(float f)
float -> timespec
Time utilities.