summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/tools/time.hxx28
-rw-r--r--tools/source/datetime/ttime.cxx215
2 files changed, 53 insertions, 190 deletions
diff --git a/include/tools/time.hxx b/include/tools/time.hxx
index 24c130389d6a..c92bdd9aee05 100644
--- a/include/tools/time.hxx
+++ b/include/tools/time.hxx
@@ -19,6 +19,10 @@
#ifndef INCLUDED_TOOLS_TIME_HXX
#define INCLUDED_TOOLS_TIME_HXX
+#include <sal/config.h>
+
+#include <cmath>
+
#include <tools/toolsdllapi.h>
#include <com/sun/star/util/Time.hpp>
@@ -36,8 +40,8 @@ class SAL_WARN_UNUSED TOOLS_DLLPUBLIC Time
{
private:
sal_Int64 nTime;
- void init( sal_uInt32 nHour, sal_uInt32 nMin,
- sal_uInt32 nSec, sal_uInt64 nNanoSec);
+ static sal_Int64 assemble(sal_uInt32 h, sal_uInt32 m, sal_uInt32 s, sal_uInt64 ns);
+ short GetSign() const { return (nTime >= 0) ? +1 : -1; }
public:
enum TimeInitSystem
@@ -75,7 +79,7 @@ public:
{ nTime = 0; }
explicit Time( TimeInitSystem );
explicit Time( sal_Int64 _nTime ) { Time::nTime = _nTime; }
- Time( const tools::Time& rTime );
+ Time( const tools::Time& rTime ) = default;
explicit Time( const css::util::Time& rTime );
explicit Time( const css::util::DateTime& rDateTime );
Time( sal_uInt32 nHour, sal_uInt32 nMin,
@@ -89,18 +93,10 @@ public:
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)); }
+ sal_uInt16 GetHour() const { return std::abs(nTime) / SAL_CONST_UINT64(10000000000000); }
+ sal_uInt16 GetMin() const { return (std::abs(nTime) / SAL_CONST_UINT64(100000000000)) % 100; }
+ sal_uInt16 GetSec() const { return (std::abs(nTime) / SAL_CONST_UINT64(1000000000)) % 100; }
+ sal_uInt32 GetNanoSec() const { return std::abs(nTime) % SAL_CONST_UINT64(1000000000); }
// TODO: consider removing GetMSFromTime and MakeTimeFromMS?
sal_Int32 GetMSFromTime() const;
@@ -168,7 +164,7 @@ public:
*/
static sal_uInt64 GetMonotonicTicks();
- tools::Time& operator =( const tools::Time& rTime );
+ tools::Time& operator =( const tools::Time& rTime ) = default;
Time operator -() const
{ return Time( -nTime ); }
tools::Time& operator +=( const tools::Time& rTime );
diff --git a/tools/source/datetime/ttime.cxx b/tools/source/datetime/ttime.cxx
index fcfa2e080e99..7aeeeafd65f0 100644
--- a/tools/source/datetime/ttime.cxx
+++ b/tools/source/datetime/ttime.cxx
@@ -49,46 +49,6 @@
extern long altzone;
#endif
-namespace {
-
- const sal_Int64 nanoSecInSec = 1000000000;
- const sal_Int16 secInMin = 60;
- const sal_Int16 minInHour = 60;
-
- sal_Int64 TimeToNanoSec( const tools::Time& rTime )
- {
- short nSign = (rTime.GetTime() >= 0) ? +1 : -1;
- sal_Int32 nHour = rTime.GetHour();
- sal_Int32 nMin = rTime.GetMin();
- sal_Int32 nSec = rTime.GetSec();
- sal_Int32 nNanoSec = rTime.GetNanoSec();
-
- sal_Int64 nRet = nNanoSec;
- nRet += nSec * nanoSecInSec;
- nRet += nMin * secInMin * nanoSecInSec;
- nRet += nHour * minInHour * secInMin * nanoSecInSec;
-
- return (nRet * nSign);
- }
-
- tools::Time NanoSecToTime( sal_Int64 nNanoSec )
- {
- short nSign;
- if ( nNanoSec < 0 )
- {
- nNanoSec *= -1;
- nSign = -1;
- }
- else
- nSign = 1;
-
- tools::Time aTime( 0, 0, 0, nNanoSec );
- aTime.SetTime( aTime.GetTime() * nSign );
- return aTime;
- }
-
-} // anonymous namespace
-
namespace tools {
Time::Time( TimeInitSystem )
@@ -97,33 +57,15 @@ Time::Time( TimeInitSystem )
nTime = 0;
}
-Time::Time( const tools::Time& rTime )
-{
- nTime = rTime.nTime;
-}
-
Time::Time( sal_uInt32 nHour, sal_uInt32 nMin, sal_uInt32 nSec, sal_uInt64 nNanoSec )
{
- init(nHour, nMin, nSec, nNanoSec);
-}
-Time::Time( const css::util::Time &_rTime )
-{
- init(_rTime.Hours, _rTime.Minutes, _rTime.Seconds, _rTime.NanoSeconds);
-}
-Time::Time( const css::util::DateTime &_rDateTime )
-{
- init(_rDateTime.Hours, _rDateTime.Minutes, _rDateTime.Seconds, _rDateTime.NanoSeconds);
-}
-
-void tools::Time::init( sal_uInt32 nHour, sal_uInt32 nMin, sal_uInt32 nSec, sal_uInt64 nNanoSec )
-{
// normalize time
- nSec += nNanoSec / nanoSecInSec;
- nNanoSec %= nanoSecInSec;
- nMin += nSec / secInMin;
- nSec %= secInMin;
- nHour += nMin / minInHour;
- nMin %= minInHour;
+ nSec += nNanoSec / nanoSecPerSec;
+ nNanoSec %= nanoSecPerSec;
+ nMin += nSec / secondPerMinute;
+ nSec %= secondPerMinute;
+ nHour += nMin / minutePerHour;
+ nMin %= minutePerHour;
// 922337 * HOUR_MASK = 9223370000000000000 largest possible value, 922338
// would be -9223364073709551616.
@@ -138,90 +80,53 @@ void tools::Time::init( sal_uInt32 nHour, sal_uInt32 nMin, sal_uInt32 nSec, sal_
nHour = SAL_MAX_UINT16;
// construct time
- nTime = nNanoSec +
- nSec * SEC_MASK +
- nMin * MIN_MASK +
- nHour * HOUR_MASK;
+ nTime = assemble(nHour, nMin, nSec, nNanoSec);
+}
+Time::Time( const css::util::Time &_rTime )
+ : Time(_rTime.Hours, _rTime.Minutes, _rTime.Seconds, _rTime.NanoSeconds)
+{
+}
+Time::Time( const css::util::DateTime &_rDateTime )
+ : Time(_rDateTime.Hours, _rDateTime.Minutes, _rDateTime.Seconds, _rDateTime.NanoSeconds)
+{
+}
+
+// static
+sal_Int64 tools::Time::assemble(sal_uInt32 h, sal_uInt32 m, sal_uInt32 s, sal_uInt64 ns)
+{
+ return ns + s * SEC_MASK + m * MIN_MASK + h * HOUR_MASK;
}
void tools::Time::SetHour( sal_uInt16 nNewHour )
{
- short nSign = (nTime >= 0) ? +1 : -1;
- sal_Int32 nMin = GetMin();
- sal_Int32 nSec = GetSec();
- sal_Int32 nNanoSec = GetNanoSec();
-
- nTime = nSign *
- ( nNanoSec +
- nSec * SEC_MASK +
- nMin * MIN_MASK +
- nNewHour * HOUR_MASK );
+ nTime = GetSign() * assemble(nNewHour, GetMin(), GetSec(), GetNanoSec());
}
void tools::Time::SetMin( sal_uInt16 nNewMin )
{
- short nSign = (nTime >= 0) ? +1 : -1;
- sal_Int32 nHour = GetHour();
- sal_Int32 nSec = GetSec();
- sal_Int32 nNanoSec = GetNanoSec();
-
// no overflow
- nNewMin = nNewMin % minInHour;
-
- nTime = nSign *
- ( nNanoSec +
- nSec * SEC_MASK +
- nNewMin * MIN_MASK +
- nHour * HOUR_MASK );
+ nTime = GetSign() * assemble(GetHour(), nNewMin % minutePerHour, GetSec(), GetNanoSec());
}
void tools::Time::SetSec( sal_uInt16 nNewSec )
{
- short nSign = (nTime >= 0) ? +1 : -1;
- sal_Int32 nHour = GetHour();
- sal_Int32 nMin = GetMin();
- sal_Int32 nNanoSec = GetNanoSec();
-
// no overflow
- nNewSec = nNewSec % secInMin;
-
- nTime = nSign *
- ( nNanoSec +
- nNewSec * SEC_MASK +
- nMin * MIN_MASK +
- nHour * HOUR_MASK );
+ nTime = GetSign() * assemble(GetHour(), GetMin(), nNewSec % secondPerMinute, GetNanoSec());
}
void tools::Time::SetNanoSec( sal_uInt32 nNewNanoSec )
{
- short nSign = (nTime >= 0) ? +1 : -1;
- sal_Int32 nHour = GetHour();
- sal_Int32 nMin = GetMin();
- sal_Int32 nSec = GetSec();
-
// no overflow
- nNewNanoSec = nNewNanoSec % nanoSecInSec;
-
- nTime = nSign *
- ( nNewNanoSec +
- nSec * SEC_MASK +
- nMin * MIN_MASK +
- nHour * HOUR_MASK );
+ nTime = GetSign() * assemble(GetHour(), GetMin(), GetSec(), nNewNanoSec % nanoSecPerSec);
}
sal_Int64 tools::Time::GetNSFromTime() const
{
- short nSign = (nTime >= 0) ? +1 : -1;
- sal_Int32 nHour = GetHour();
- sal_Int32 nMin = GetMin();
- sal_Int32 nSec = GetSec();
- sal_Int32 nNanoSec = GetNanoSec();
-
- return nSign *
- ( nNanoSec +
- nSec * nanoSecInSec +
- nMin * (secInMin * nanoSecInSec) +
- nHour * (minInHour * secInMin * nanoSecInSec) );
+ return GetSign() *
+ ( GetNanoSec() +
+ GetSec() * nanoSecPerSec +
+ GetMin() * nanoSecPerMinute +
+ GetHour() * nanoSecPerHour );
}
void tools::Time::MakeTimeFromNS( sal_Int64 nNS )
@@ -235,51 +140,23 @@ void tools::Time::MakeTimeFromNS( sal_Int64 nNS )
else
nSign = 1;
- // avoid overflow when sal_uIntPtr is 32 bits
- tools::Time aTime( 0, 0, nNS/nanoSecInSec, nNS % nanoSecInSec );
+ tools::Time aTime(0, 0, 0, nNS);
SetTime( aTime.GetTime() * nSign );
}
sal_Int32 tools::Time::GetMSFromTime() const
{
- short nSign = (nTime >= 0) ? +1 : -1;
- sal_Int32 nHour = GetHour();
- sal_Int32 nMin = GetMin();
- sal_Int32 nSec = GetSec();
- sal_Int32 nNanoSec = GetNanoSec();
-
- return nSign *
- ( nNanoSec/1000000 +
- nSec * 1000 +
- nMin * 60000 +
- nHour * 3600000 );
+ return GetNSFromTime() / nanoPerMilli;
}
void tools::Time::MakeTimeFromMS( sal_Int32 nMS )
{
- short nSign;
- if ( nMS < 0 )
- {
- nMS *= -1;
- nSign = -1;
- }
- else
- nSign = 1;
-
- // avoid overflow when sal_uIntPtr is 32 bits
- tools::Time aTime( 0, 0, nMS/1000, (nMS % 1000) * 1000000 );
- SetTime( aTime.GetTime() * nSign );
+ MakeTimeFromNS(nMS * nanoPerMilli);
}
double tools::Time::GetTimeInDays() const
{
- short nSign = (nTime >= 0) ? +1 : -1;
- double nHour = GetHour();
- double nMin = GetMin();
- double nSec = GetSec();
- double nNanoSec = GetNanoSec();
-
- return (nHour + (nMin / 60) + (nSec / (minInHour * secInMin)) + (nNanoSec / (minInHour * secInMin * nanoSecInSec))) / 24 * nSign;
+ return GetNSFromTime() / double(nanoSecPerDay);
}
// static
@@ -354,43 +231,33 @@ void tools::Time::GetClock( double fTimeInDays,
fFractionOfSecond = fSeconds;
}
-Time& tools::Time::operator =( const tools::Time& rTime )
-{
- nTime = rTime.nTime;
- return *this;
-}
-
Time& tools::Time::operator +=( const tools::Time& rTime )
{
- nTime = NanoSecToTime( TimeToNanoSec( *this ) +
- TimeToNanoSec( rTime ) ).GetTime();
+ MakeTimeFromNS(GetNSFromTime() + rTime.GetNSFromTime());
return *this;
}
Time& tools::Time::operator -=( const tools::Time& rTime )
{
- nTime = NanoSecToTime( TimeToNanoSec( *this ) -
- TimeToNanoSec( rTime ) ).GetTime();
+ MakeTimeFromNS(GetNSFromTime() - rTime.GetNSFromTime());
return *this;
}
Time operator +( const tools::Time& rTime1, const tools::Time& rTime2 )
{
- return NanoSecToTime( TimeToNanoSec( rTime1 ) +
- TimeToNanoSec( rTime2 ) );
+ tools::Time result(rTime1);
+ return result += rTime2;
}
Time operator -( const tools::Time& rTime1, const tools::Time& rTime2 )
{
- return NanoSecToTime( TimeToNanoSec( rTime1 ) -
- TimeToNanoSec( rTime2 ) );
+ tools::Time result(rTime1);
+ return result -= rTime2;
}
bool tools::Time::IsEqualIgnoreNanoSec( const tools::Time& rTime ) const
{
- sal_Int32 n1 = (nTime < 0 ? -static_cast<sal_Int32>(GetNanoSec()) : GetNanoSec() );
- sal_Int32 n2 = (rTime.nTime < 0 ? -static_cast<sal_Int32>(rTime.GetNanoSec()) : rTime.GetNanoSec() );
- return (nTime - n1) == (rTime.nTime - n2);
+ return nTime / SEC_MASK == rTime.nTime / SEC_MASK;
}
Time tools::Time::GetUTCOffset()