core: add functions to core/time.c

To support the new filter code, add helper functions that turn timestamps
into year and day-of-week to core/time.c.

Internally, these functions simply call utc_mktime() to break down the
timestamp and then extract the wanted value. This may appear inefficient,
but testing shows that modern compilers are quite effective in throwing
away the unneeded calculations. FWIW in this respect clang10 outperformed
gcc10.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2020-05-23 11:59:53 +02:00 committed by Dirk Hohndel
parent efdc875aa3
commit 0f4154bacc
2 changed files with 32 additions and 0 deletions

View file

@ -11,6 +11,8 @@ extern "C" {
extern timestamp_t utc_mktime(struct tm *tm);
extern void utc_mkdate(timestamp_t, struct tm *tm);
extern int utc_year(timestamp_t timestamp);
extern int utc_weekday(timestamp_t timestamp);
#ifdef __cplusplus
}

View file

@ -133,3 +133,33 @@ timestamp_t utc_mktime(struct tm *tm)
return when - EPOCH_OFFSET;
}
/*
* Extract year from 64-bit timestamp.
*
* This looks inefficient, since it breaks down into a full
* struct tm. However, modern compilers are effective at throwing
* out unused calculations. If it turns out to be a bottle neck
* we will have to cache a struct tm per dive.
*/
int utc_year(timestamp_t timestamp)
{
struct tm tm;
utc_mkdate(timestamp, &tm);
return tm.tm_year;
}
/*
* Extract day of week from 64-bit timestamp.
* Returns 0-6, whereby 0 is Sunday and 6 is Saturday.
*
* Same comment as for utc_year(): Modern compilers are good
* at throwing out unused calculations, so this is more efficient
* than it looks.
*/
int utc_weekday(timestamp_t timestamp)
{
struct tm tm;
utc_mkdate(timestamp, &tm);
return tm.tm_wday;
}