summaryrefslogtreecommitdiffstats
path: root/src/VBox/NetworkServices/Dhcpd/Timestamp.h
blob: 083cbc6b219e610156b0a83d1f12c58ae176b6f0 (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* $Id: Timestamp.h $ */
/** @file
 * DHCP server - timestamps
 */

/*
 * Copyright (C) 2017-2023 Oracle and/or its affiliates.
 *
 * This file is part of VirtualBox base platform packages, as
 * available from https://www.virtualbox.org.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation, in version 3 of the
 * License.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <https://www.gnu.org/licenses>.
 *
 * SPDX-License-Identifier: GPL-3.0-only
 */

#ifndef VBOX_INCLUDED_SRC_Dhcpd_Timestamp_h
#define VBOX_INCLUDED_SRC_Dhcpd_Timestamp_h
#ifndef RT_WITHOUT_PRAGMA_ONCE
# pragma once
#endif

#include <iprt/time.h>


/**
 * Wrapper around RTTIMESPEC.
 *
 * @note Originally wanting to use RTTimeNanoTS rather than RTTimeNow.  The term
 *       "absolute" was used for when the RTTimeNanoTS() value was converted to
 *       something approximating unix epoch relative time with help of
 *       RTTimeNow().  Code was later changed to just wrap RTTIMESPEC and drop
 *       all usage of RTTimeNanoTS, ASSUMING that system time is stable.
 */
class Timestamp
{
    RTTIMESPEC m_TimeSpec;

public:
    Timestamp() RT_NOEXCEPT
    {
        RTTimeSpecSetNano(&m_TimeSpec, 0);
    }

    Timestamp(PCRTTIMESPEC a_pTimeSpec) RT_NOEXCEPT
    {
        m_TimeSpec = *a_pTimeSpec;
    }

    /** Get a timestamp initialized to current time. */
    static Timestamp now() RT_NOEXCEPT
    {
        RTTIMESPEC Tmp;
        return Timestamp(RTTimeNow(&Tmp));
    }

    /** Get a timestamp with the given value in seconds since unix epoch. */
    static Timestamp absSeconds(int64_t secTimestamp) RT_NOEXCEPT
    {
        RTTIMESPEC Tmp;
        return Timestamp(RTTimeSpecSetSeconds(&Tmp, secTimestamp));
    }

    Timestamp &addSeconds(int64_t cSecs) RT_NOEXCEPT
    {
        RTTimeSpecAddSeconds(&m_TimeSpec, cSecs);
        return *this;
    }

    Timestamp &subSeconds(int64_t cSecs) RT_NOEXCEPT
    {
        RTTimeSpecSubSeconds(&m_TimeSpec, cSecs);
        return *this;
    }

    RTTIMESPEC *getAbsTimeSpec(RTTIMESPEC *pTime) const RT_NOEXCEPT
    {
        *pTime = m_TimeSpec;
        return pTime;
    }

    int64_t getAbsSeconds() const RT_NOEXCEPT
    {
        return RTTimeSpecGetSeconds(&m_TimeSpec);
    }

    /** Only for log formatting. */
    size_t strFormatHelper(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput) const RT_NOEXCEPT;

    int compare(const Timestamp &a_rRight) const RT_NOEXCEPT
    {
        return RTTimeSpecCompare(&m_TimeSpec, &a_rRight.m_TimeSpec);
    }

    friend bool operator<( const Timestamp &, const Timestamp &) RT_NOEXCEPT;
    friend bool operator>( const Timestamp &, const Timestamp &) RT_NOEXCEPT;
    friend bool operator==(const Timestamp &, const Timestamp &) RT_NOEXCEPT;
    friend bool operator!=(const Timestamp &, const Timestamp &) RT_NOEXCEPT;
    friend bool operator<=(const Timestamp &, const Timestamp &) RT_NOEXCEPT;
    friend bool operator>=(const Timestamp &, const Timestamp &) RT_NOEXCEPT;
};


inline bool operator<( const Timestamp &l, const Timestamp &r) RT_NOEXCEPT { return l.compare(r) < 0; }
inline bool operator>( const Timestamp &l, const Timestamp &r) RT_NOEXCEPT { return l.compare(r) > 0; }
inline bool operator==(const Timestamp &l, const Timestamp &r) RT_NOEXCEPT { return l.compare(r) == 0; }
inline bool operator!=(const Timestamp &l, const Timestamp &r) RT_NOEXCEPT { return l.compare(r) != 0; }
inline bool operator<=(const Timestamp &l, const Timestamp &r) RT_NOEXCEPT { return l.compare(r) <= 0; }
inline bool operator>=(const Timestamp &l, const Timestamp &r) RT_NOEXCEPT { return l.compare(r) >= 0; }

#endif /* !VBOX_INCLUDED_SRC_Dhcpd_Timestamp_h */