summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2023-06-23 12:42:29 +0200
committerEike Rathke <erack@redhat.com>2023-06-23 18:32:17 +0200
commitc968d8989004301b49d67a093a6eb8a629533837 (patch)
tree8db7e3cac3323908697f1ef445911f3056443b2e /tools
parent759d414748bda99f29b04806f72d479e320c2f9f (diff)
Introduce tools::Duration individual time values ctor
Change-Id: I516d3727cbcf6667b32dc963febbf4b753ef6a91 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153497 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins
Diffstat (limited to 'tools')
-rw-r--r--tools/qa/cppunit/test_duration.cxx65
-rw-r--r--tools/source/datetime/duration.cxx70
2 files changed, 103 insertions, 32 deletions
diff --git a/tools/qa/cppunit/test_duration.cxx b/tools/qa/cppunit/test_duration.cxx
index c328db7cec38..c4032be83a03 100644
--- a/tools/qa/cppunit/test_duration.cxx
+++ b/tools/qa/cppunit/test_duration.cxx
@@ -114,12 +114,73 @@ void DurationTest::testDuration()
}
{
// 235929599 seconds == SAL_MAX_UINT16 hours + 59 minutes + 59 seconds
- const Duration aD(0, Time(0, 0, 235929599));
+ const Duration aD(0, Time(0, 0, 235929599, Time::nanoSecPerSec - 1));
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2730), aD.GetDays());
CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(15), aD.GetTime().GetHour());
CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(59), aD.GetTime().GetMin());
CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(59), aD.GetTime().GetSec());
- CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(0), aD.GetTime().GetNanoSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(999999999), aD.GetTime().GetNanoSec());
+ }
+ {
+ // 235929599 seconds == SAL_MAX_UINT16 hours + 59 minutes + 59 seconds
+ const Duration aD(0, 0, 0, 235929599, Time::nanoSecPerSec - 1);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2730), aD.GetDays());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(15), aD.GetTime().GetHour());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(59), aD.GetTime().GetMin());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(59), aD.GetTime().GetSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(999999999), aD.GetTime().GetNanoSec());
+ }
+ {
+ const Duration aD(1, 2, 3, 4, 5);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aD.GetDays());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(2), aD.GetTime().GetHour());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(3), aD.GetTime().GetMin());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(4), aD.GetTime().GetSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(5), aD.GetTime().GetNanoSec());
+ }
+ {
+ const Duration aD(-1, 2, 3, 4, 5);
+ CPPUNIT_ASSERT(aD.IsNegative());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-1), aD.GetDays());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(2), aD.GetTime().GetHour());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(3), aD.GetTime().GetMin());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(4), aD.GetTime().GetSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(5), aD.GetTime().GetNanoSec());
+ }
+ {
+ const Duration aD(1, SAL_MAX_UINT32, SAL_MAX_UINT32, SAL_MAX_UINT32, SAL_MAX_UINT64);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(182202802), aD.GetDays());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), aD.GetTime().GetHour());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(17), aD.GetTime().GetMin());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(48), aD.GetTime().GetSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(709551615), aD.GetTime().GetNanoSec());
+ }
+ {
+ const Duration aD(-1, SAL_MAX_UINT32, SAL_MAX_UINT32, SAL_MAX_UINT32, SAL_MAX_UINT64);
+ CPPUNIT_ASSERT(aD.IsNegative());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-182202802), aD.GetDays());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), aD.GetTime().GetHour());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(17), aD.GetTime().GetMin());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(48), aD.GetTime().GetSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(709551615), aD.GetTime().GetNanoSec());
+ }
+ { // Maximum days with all max possible.
+ const Duration aD(1965280846, SAL_MAX_UINT32, SAL_MAX_UINT32, SAL_MAX_UINT32,
+ SAL_MAX_UINT64);
+ CPPUNIT_ASSERT_EQUAL(SAL_MAX_INT32, aD.GetDays());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), aD.GetTime().GetHour());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(17), aD.GetTime().GetMin());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(48), aD.GetTime().GetSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(709551615), aD.GetTime().GetNanoSec());
+ }
+ { // Maximum negative days with all max possible.
+ const Duration aD(-1965280847, SAL_MAX_UINT32, SAL_MAX_UINT32, SAL_MAX_UINT32,
+ SAL_MAX_UINT64);
+ CPPUNIT_ASSERT_EQUAL(SAL_MIN_INT32, aD.GetDays());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), aD.GetTime().GetHour());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(17), aD.GetTime().GetMin());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(48), aD.GetTime().GetSec());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(709551615), aD.GetTime().GetNanoSec());
}
{ // Add()
const DateTime aS(Date(23, 11, 1999), Time(0, 0, 0));
diff --git a/tools/source/datetime/duration.cxx b/tools/source/datetime/duration.cxx
index 255706f0486a..42ce2a8a6cc4 100644
--- a/tools/source/datetime/duration.cxx
+++ b/tools/source/datetime/duration.cxx
@@ -90,31 +90,47 @@ Duration::Duration(sal_Int32 nDays, const Time& rTime)
: mnDays(nDays)
{
assert(nDays == 0 || rTime.GetTime() == 0 || (nDays < 0) == (rTime.GetTime() < 0));
- sal_uInt64 nN = rTime.GetNanoSec();
- sal_uInt64 nS = rTime.GetSec();
- if (nN >= Time::nanoSecPerSec)
+ Normalize(rTime.GetHour(), rTime.GetMin(), rTime.GetSec(), rTime.GetNanoSec(),
+ ((nDays < 0) || (rTime.GetTime() < 0)));
+}
+
+Duration::Duration(sal_Int32 nDays, sal_uInt32 nHours, sal_uInt32 nMinutes, sal_uInt32 nSeconds,
+ sal_uInt64 nNanoseconds)
+ : mnDays(nDays)
+{
+ Normalize(nHours, nMinutes, nSeconds, nNanoseconds, nDays < 0);
+}
+
+Duration::Duration(sal_Int32 nDays, sal_Int64 nTime)
+ : maTime(nTime)
+ , mnDays(nDays)
+{
+}
+
+void Duration::Normalize(sal_uInt64 nHours, sal_uInt64 nMinutes, sal_uInt64 nSeconds,
+ sal_uInt64 nNanoseconds, bool bNegative)
+{
+ if (nNanoseconds >= Time::nanoSecPerSec)
{
- nS += nN / Time::nanoSecPerSec;
- nN %= Time::nanoSecPerSec;
+ nSeconds += nNanoseconds / Time::nanoSecPerSec;
+ nNanoseconds %= Time::nanoSecPerSec;
}
- sal_uInt64 nM = rTime.GetMin();
- if (nS >= Time::secondPerMinute)
+ if (nSeconds >= Time::secondPerMinute)
{
- nM += nS / Time::secondPerMinute;
- nS %= Time::secondPerMinute;
+ nMinutes += nSeconds / Time::secondPerMinute;
+ nSeconds %= Time::secondPerMinute;
}
- sal_uInt64 nH = rTime.GetHour();
- if (nM >= Time::minutePerHour)
+ if (nMinutes >= Time::minutePerHour)
{
- nH += nM / Time::minutePerHour;
- nM %= Time::minutePerHour;
+ nHours += nMinutes / Time::minutePerHour;
+ nMinutes %= Time::minutePerHour;
}
- if (nH >= Time::hourPerDay)
+ if (nHours >= Time::hourPerDay)
{
- sal_Int64 nDiff = nH / Time::hourPerDay;
- nH %= Time::hourPerDay;
+ sal_Int64 nDiff = nHours / Time::hourPerDay;
+ nHours %= Time::hourPerDay;
bool bOverflow = false;
- if (rTime.GetTime() < 0)
+ if (bNegative)
{
nDiff = -nDiff;
bOverflow = (nDiff < SAL_MIN_INT32);
@@ -132,24 +148,18 @@ Duration::Duration(sal_Int32 nDays, const Time& rTime)
assert(!bOverflow);
if (bOverflow)
{
- nH = Time::hourPerDay - 1;
- nM = Time::minutePerHour - 1;
- nS = Time::secondPerMinute - 1;
- nN = Time::nanoSecPerSec - 1;
+ nHours = Time::hourPerDay - 1;
+ nMinutes = Time::minutePerHour - 1;
+ nSeconds = Time::secondPerMinute - 1;
+ nNanoseconds = Time::nanoSecPerSec - 1;
}
}
- maTime = Time(nH, nM, nS, nN);
- if (rTime.GetTime() < 0)
+ maTime = Time(nHours, nMinutes, nSeconds, nNanoseconds);
+ if (bNegative)
maTime = -maTime;
assert(mnDays == 0 || maTime.GetTime() == 0 || (mnDays < 0) == (maTime.GetTime() < 0));
}
-Duration::Duration(sal_Int32 nDays, sal_Int64 nTime)
- : maTime(nTime)
- , mnDays(nDays)
-{
-}
-
void Duration::ApplyTime(sal_Int64 nNS)
{
if (mnDays > 0 && nNS < 0)
@@ -163,7 +173,7 @@ void Duration::ApplyTime(sal_Int64 nNS)
nNS = -Time::nanoSecPerDay + nNS;
}
maTime.MakeTimeFromNS(nNS);
- assert(mnDays == 0 || maTime.GetTime() == 0 || (mnDays < 0) == (nNS < 0));
+ assert(mnDays == 0 || maTime.GetTime() == 0 || (mnDays < 0) == (maTime.GetTime() < 0));
}
void Duration::SetTimeDiff(const Time& rStart, const Time& rEnd)