summaryrefslogtreecommitdiff
path: root/include/tools/time.hxx
blob: 126a42199bfa0f7dd406f82ffd487a4521f0e1f8 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */
#ifndef _TOOLS_TIME_HXX
#define _TOOLS_TIME_HXX

#include "tools/toolsdllapi.h"
#include <tools/solar.h>
#include <com/sun/star/util/Time.hpp>

class ResId;

/**
 @WARNING: This class can serve both as wall clock time and time duration, and
           the mixing of these concepts leads to problems such as there being
           25 hours or 10 minus 20 seconds being (non-negative) 10 seconds.
*/

class TOOLS_DLLPUBLIC SAL_WARN_UNUSED Time
{
private:
    sal_Int64       nTime;
    void            init( sal_uInt32 nHour, sal_uInt32 nMin,
                          sal_uInt32 nSec, sal_uInt64 nNanoSec);

public:
    enum TimeInitSystem
    {
        SYSTEM
    };

    // temporary until all uses are inspected and resolved
    enum TimeInitEmpty
    {
        EMPTY
    };
    static const sal_Int64 hourPerDay = 24;
    static const sal_Int64 minutePerHour = 60;
    static const sal_Int64 secondPerMinute = 60;
    static const sal_Int64 nanoSecPerSec = 1000000000;
    static const sal_Int64 nanoSecPerMinute = nanoSecPerSec * secondPerMinute;
    static const sal_Int64 nanoSecPerHour = nanoSecPerSec * secondPerMinute * minutePerHour;
    static const sal_Int64 nanoSecPerDay = nanoSecPerSec * secondPerMinute * minutePerHour * hourPerDay;
    static const sal_Int64 secondPerHour = secondPerMinute * minutePerHour;
    static const sal_Int64 secondPerDay  = secondPerMinute * minutePerHour * hourPerDay;
    static const sal_Int64 minutePerDay  = minutePerHour * hourPerDay;
    static const sal_Int64 nanoPerMicro  = 1000;
    static const sal_Int64 nanoPerMilli  = 1000000;
    static const sal_Int64 nanoPerCenti  = 10000000;

                    Time( TimeInitEmpty )
                        { nTime = 0; }
                    Time( TimeInitSystem );
                    Time( const ResId & rResId );
                    Time( sal_Int64 _nTime ) { Time::nTime = _nTime; }
                    Time( const Time& rTime );
                    Time( const ::com::sun::star::util::Time& rTime );
                    Time( sal_uInt32 nHour, sal_uInt32 nMin,
                          sal_uInt32 nSec = 0, sal_uInt64 nNanoSec = 0 );

    void            SetTime( sal_Int64 nNewTime ) { nTime = nNewTime; }
    sal_Int64       GetTime() const { return nTime; }
    ::com::sun::star::util::Time GetUNOTime() const { return ::com::sun::star::util::Time(GetNanoSec(),GetSec(),GetMin(),GetHour(),false); }

    void            SetHour( sal_uInt16 nNewHour );
    void            SetMin( sal_uInt16 nNewMin );
    void            SetSec( sal_uInt16 nNewSec );
    void            SetNanoSec( sal_uInt32 nNewNanoSec );
    sal_uInt16      GetHour() const
                    { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime;
                      return static_cast<sal_uInt16>(nTempTime / SAL_CONST_UINT64(10000000000000)); }
    sal_uInt16      GetMin() const
                    { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime;
                      return static_cast<sal_uInt16>((nTempTime / SAL_CONST_UINT64(100000000000)) % 100); }
    sal_uInt16      GetSec() const
                    { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime;
                      return static_cast<sal_uInt16>((nTempTime / SAL_CONST_UINT64(1000000000)) % 100); }
    sal_uInt32      GetNanoSec() const
                    { sal_uInt64 nTempTime = (nTime >= 0) ? nTime : -nTime;
                      return static_cast<sal_uInt32>( nTempTime % SAL_CONST_UINT64(1000000000)); }

    // TODO: consider removing GetMSFromTime and MakeTimeFromMS?
    sal_Int32       GetMSFromTime() const;
    void            MakeTimeFromMS( sal_Int32 nMS );
    sal_Int64       GetNSFromTime() const;
    void            MakeTimeFromNS( sal_Int64 nNS );

                    /// 12 hours == 0.5 days
    double          GetTimeInDays() const;

    sal_Bool        IsBetween( const Time& rFrom, const Time& rTo ) const
                    { return ((nTime >= rFrom.nTime) && (nTime <= rTo.nTime)); }

    sal_Bool        IsEqualIgnoreNanoSec( const Time& rTime ) const;

    sal_Bool        operator ==( const Time& rTime ) const
                    { return (nTime == rTime.nTime); }
    sal_Bool        operator !=( const Time& rTime ) const
                    { return (nTime != rTime.nTime); }
    sal_Bool        operator  >( const Time& rTime ) const
                    { return (nTime > rTime.nTime); }
    sal_Bool        operator  <( const Time& rTime ) const
                    { return (nTime < rTime.nTime); }
    sal_Bool        operator >=( const Time& rTime ) const
                    { return (nTime >= rTime.nTime); }
    sal_Bool        operator <=( const Time& rTime ) const
                    { return (nTime <= rTime.nTime); }

    static Time     GetUTCOffset();
    static sal_uIntPtr  GetSystemTicks();       // Elapsed time

    void            ConvertToUTC()       { *this -= Time::GetUTCOffset(); }
    void            ConvertToLocalTime() { *this += Time::GetUTCOffset(); }

    Time&           operator =( const Time& rTime );
    Time            operator -() const
                        { return Time( -nTime ); }
    Time&           operator +=( const Time& rTime );
    Time&           operator -=( const Time& rTime );
    TOOLS_DLLPUBLIC friend Time     operator +( const Time& rTime1, const Time& rTime2 );
    TOOLS_DLLPUBLIC friend Time     operator -( const Time& rTime1, const Time& rTime2 );
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */