11 #ifndef MSGPACK_V1_TYPE_CPP11_CHRONO_HPP
12 #define MSGPACK_V1_TYPE_CPP11_CHRONO_HPP
29 struct as<std::chrono::system_clock::time_point> {
33 std::chrono::system_clock::time_point tp;
37 _msgpack_load32(uint32_t, o.
via.
ext.
data(), &sec);
38 tp += std::chrono::seconds(sec);
42 _msgpack_load64(uint64_t, o.
via.
ext.
data(), &value);
43 uint32_t nanosec =
static_cast<uint32_t
>(value >> 34);
44 uint64_t sec = value & 0x00000003ffffffffLL;
45 tp += std::chrono::duration_cast<std::chrono::system_clock::duration>(
46 std::chrono::nanoseconds(nanosec));
47 tp += std::chrono::seconds(sec);
51 _msgpack_load32(uint32_t, o.
via.
ext.
data(), &nanosec);
53 _msgpack_load64(int64_t, o.
via.
ext.
data() + 4, &sec);
54 tp += std::chrono::duration_cast<std::chrono::system_clock::duration>(
55 std::chrono::nanoseconds(nanosec));
56 tp += std::chrono::seconds(sec);
66 struct convert<std::chrono::system_clock::time_point> {
70 std::chrono::system_clock::time_point tp;
74 _msgpack_load32(uint32_t, o.
via.
ext.
data(), &sec);
75 tp += std::chrono::seconds(sec);
80 _msgpack_load64(uint64_t, o.
via.
ext.
data(), &value);
81 uint32_t nanosec =
static_cast<uint32_t
>(value >> 34);
82 uint64_t sec = value & 0x00000003ffffffffLL;
83 tp += std::chrono::duration_cast<std::chrono::system_clock::duration>(
84 std::chrono::nanoseconds(nanosec));
85 tp += std::chrono::seconds(sec);
90 _msgpack_load32(uint32_t, o.
via.
ext.
data(), &nanosec);
92 _msgpack_load64(int64_t, o.
via.
ext.
data() + 4, &sec);
93 tp += std::chrono::duration_cast<std::chrono::system_clock::duration>(
94 std::chrono::nanoseconds(nanosec));
95 tp += std::chrono::seconds(sec);
106 struct pack<std::chrono::system_clock::time_point> {
107 template <
typename Stream>
109 int64_t count =
static_cast<int64_t
>(v.time_since_epoch().count());
112 std::chrono::system_clock::duration::period::ratio::num *
113 (1000000000 / std::chrono::system_clock::duration::period::ratio::den);
115 int64_t nanosec = count % (1000000000 / nano_num) * nano_num;
118 nanosec = 1000000000 + nanosec;
122 * std::chrono::system_clock::duration::period::ratio::num
123 / std::chrono::system_clock::duration::period::ratio::den;
124 if ((sec >> 34) == 0) {
125 uint64_t data64 = (
static_cast<uint64_t
>(nanosec) << 34) |
static_cast<uint64_t
>(sec);
126 if ((data64 & 0xffffffff00000000L) == 0) {
129 uint32_t data32 =
static_cast<uint32_t
>(data64);
131 _msgpack_store32(buf, data32);
138 _msgpack_store64(buf, data64);
146 _msgpack_store32(&buf[0],
static_cast<uint32_t
>(nanosec));
147 _msgpack_store64(&buf[4], sec);
157 int64_t count =
static_cast<int64_t
>(v.time_since_epoch().count());
160 std::chrono::system_clock::duration::period::ratio::num *
161 (1000000000 / std::chrono::system_clock::duration::period::ratio::den);
163 int64_t nanosec = count % (1000000000 / nano_num) * nano_num;
166 nanosec = 1000000000 + nanosec;
170 * std::chrono::system_clock::duration::period::ratio::num
171 / std::chrono::system_clock::duration::period::ratio::den;
172 if ((sec >> 34) == 0) {
173 uint64_t data64 = (
static_cast<uint64_t
>(nanosec) << 34) |
static_cast<uint64_t
>(sec);
174 if ((data64 & 0xffffffff00000000L) == 0) {
179 p[0] =
static_cast<char>(-1);
180 uint32_t data32 =
static_cast<uint32_t
>(data64);
181 _msgpack_store32(&p[1], data32);
189 p[0] =
static_cast<char>(-1);
190 _msgpack_store64(&p[1], data64);
199 p[0] =
static_cast<char>(-1);
200 _msgpack_store32(&p[1],
static_cast<uint32_t
>(nanosec));
201 _msgpack_store64(&p[1 + 4], sec);
215 #endif // MSGPACK_V1_TYPE_CPP11_CHRONO_HPP