File Coverage

src/panda/time/util.h
Criterion Covered Total %
statement 17 17 100.0
branch 4 4 100.0
condition n/a
subroutine n/a
pod n/a
total 21 21 100.0


line stmt bran cond sub pod time code
1             #pragma once
2             #include
3             #include
4             #include
5             #include
6              
7             namespace panda { namespace time {
8              
9             using panda::unlikely;
10              
11             static const char GMT_FALLBACK[] = "GMT0";
12              
13             const size_t TZNAME_MAX = 255; // max length of timezone name or POSIX rule (Europe/Moscow, ...)
14              
15             const ptime_t EPOCH_NEGINF = std::numeric_limits::min();
16              
17             const int DAYS_PER_YEAR = 365; // non-leap year only
18             const int DAYS_PER_QYEAR = DAYS_PER_YEAR*4 + 1;
19             const int DAYS_PER_CENT = DAYS_PER_QYEAR*25 - 1;
20             const int DAYS_PER_QCENT = DAYS_PER_CENT*4 + 1;
21             const int EPOCH_CHRIST_DAYS = 719162; // christ_days(1970);
22             const int EPOCH_WDAY = 4;
23              
24             const ptime_t MAX_YEARS = (ptime_t) 1 << 32;
25             const ptime_t MAX_MONTHS = MAX_YEARS*12;
26             const ptime_t MAX_DAYS = MAX_MONTHS*31;
27             const ptime_t MAX_HOURS = MAX_DAYS*24;
28             const ptime_t MAX_MINUTES = MAX_HOURS*60;
29             const ptime_t MAX_EPOCH = MAX_MINUTES*60;
30              
31             const ptime_t OUTLIM_MONTH_BY_12 = ((MAX_MONTHS / 12) + 1)*12;
32             const ptime_t OUTLIM_EPOCH_BY_86400 = ((MAX_EPOCH / 86400) + 1)*86400;
33             const ptime_t OUTLIM_DAY_BY_7 = ((MAX_DAYS / 7) + 1)*7;
34             const ptime_t OUTLIM_DAY_BY_QCENT = ((MAX_DAYS / DAYS_PER_QCENT) + 1)*DAYS_PER_QCENT;
35              
36             const int YDAY2MON[][366] = {
37             {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,-1},
38             {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}
39             };
40              
41             const int YDAY2MDAY[][366] = {
42             {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,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,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,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,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,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,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,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,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,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,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,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,-1},
43             {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,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,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,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,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,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,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,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,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,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,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,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}
44             };
45              
46             const int MON2YDAY[][12] = {
47             {0,31,59,90,120,151,181,212,243,273,304,334},
48             {0,31,60,91,121,152,182,213,244,274,305,335}
49             };
50              
51             panda::string readfile (const std::string_view& path);
52              
53             inline int64_t char8_to_int64 (const char* source) {
54             return *((int64_t*) source);
55             }
56              
57             // GIVEN DAYS PASSED SINCE 1 Jan 0001 00:00:00 CALCULATES REAL YEAR AND DAYS REMAINDER - YDAY [0-365]
58 26894           inline void christ_year (ptime_t days, int32_t &year, int32_t &remainder) {
59             // 1-st step: separate FULL QUAD CENTURIES
60 26894           ptime_t tmp = (days + OUTLIM_DAY_BY_QCENT) % DAYS_PER_QCENT;
61 26894           year = (days - tmp)/DAYS_PER_QCENT * 400;
62 26894           days = tmp;
63            
64             // 2-nd step: separate FULL CENTURIES, condition fixes QCENT -> CENT border
65 26894 100         if (unlikely(days == DAYS_PER_CENT*4)) {
66 7           year += 300;
67 7           days = DAYS_PER_CENT;
68             } else {
69 26887           year += days/DAYS_PER_CENT * 100;
70 26887           days %= DAYS_PER_CENT;
71             }
72            
73             // 3-rd step: separate FULL QUAD YEARS, no border fix needed
74 26894           year += days/DAYS_PER_QYEAR * 4;
75 26894           days %= DAYS_PER_QYEAR;
76            
77             // 4-th step: separate FULL YEARS, condition fixes QYEAR -> YEAR border
78 26894 100         if (unlikely(days == DAYS_PER_YEAR*4)) {
79 40           year += 4; // actually 3, but we must add 1 to result year, as the start is 1-st year, not 0-th
80 40           remainder = 365;
81             } else {
82 26854           year += days/DAYS_PER_YEAR + 1; // we must add 1 to result year, as the start is 1-st year, not 0-th
83 26854           remainder = days % DAYS_PER_YEAR;
84             }
85 26894           }
86              
87             }}