summaryrefslogtreecommitdiffstats
path: root/third_party/msgpack/include/msgpack/timestamp.h
blob: 4d7df83d09a89b944b91216237e6a15ccf3da805 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
 * MessagePack for C TimeStamp
 *
 * Copyright (C) 2018 KONDO Takatoshi
 *
 *    Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE_1_0.txt or copy at
 *    http://www.boost.org/LICENSE_1_0.txt)
 */
#ifndef MSGPACK_TIMESTAMP_H
#define MSGPACK_TIMESTAMP_H

#include <msgpack/object.h>

#ifdef __cplusplus
extern "C" {
#endif


typedef struct msgpack_timestamp {
    int64_t tv_sec;
    uint32_t tv_nsec;
} msgpack_timestamp;

static inline bool msgpack_object_to_timestamp(const msgpack_object* obj, msgpack_timestamp* ts) {
    if (obj->type != MSGPACK_OBJECT_EXT) return false;
    if (obj->via.ext.type != -1) return false;
    switch (obj->via.ext.size) {
    case 4:
        ts->tv_nsec = 0;
        _msgpack_load32(uint32_t, obj->via.ext.ptr, &ts->tv_sec);
        return true;
    case 8: {
        uint64_t value;
        _msgpack_load64(uint64_t, obj->via.ext.ptr, &value);
        ts->tv_nsec = (uint32_t)(value >> 34);
        ts->tv_sec = value & 0x00000003ffffffffL;
        return true;
    }
    case 12:
        _msgpack_load32(uint32_t, obj->via.ext.ptr, &ts->tv_nsec);
        _msgpack_load64(int64_t, obj->via.ext.ptr + 4, &ts->tv_sec);
        return true;
    default:
        return false;
    }
}


#ifdef __cplusplus
}
#endif

#endif /* msgpack/timestamp.h */