diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 41a33c33a..6928963c3 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -5,6 +5,7 @@ object Versions { const val androidxTest = "1.2.0" const val googleTruth = "1.0.1" const val androidDesugarJdkLibs = "1.0.10" + const val javamath2kmp = "0.1.0" } object Libs { @@ -25,4 +26,5 @@ object Libs { const val googleTruth = "com.google.truth:truth:${Versions.googleTruth}" const val androidDesugarJdkLibs = "com.android.tools:desugar_jdk_libs:${Versions.androidDesugarJdkLibs}" + const val javamath2kmp = "dev.erikchristensen.javamath2kmp:javamath2kmp:${Versions.javamath2kmp}" } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 89c6327b6..12d5993b5 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -14,6 +14,10 @@ kotlin { sourceSets { val commonMain by getting { kotlin.srcDirs("src/commonMain/generated") + + dependencies { + implementation(Libs.javamath2kmp) + } } val commonTest by getting { diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Centuries.kt b/core/src/commonMain/generated/io/islandtime/measures/_Centuries.kt index 43af9fc73..05c5228d8 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Centuries.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Centuries.kt @@ -6,14 +6,14 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.DECADES_PER_CENTURY import io.islandtime.internal.MONTHS_PER_CENTURY import io.islandtime.internal.YEARS_PER_CENTURY -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Days.kt b/core/src/commonMain/generated/io/islandtime/measures/_Days.kt index 05a400a61..9d999acc8 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Days.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Days.kt @@ -6,6 +6,11 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.DAYS_PER_WEEK import io.islandtime.internal.HOURS_PER_DAY import io.islandtime.internal.MICROSECONDS_PER_DAY @@ -13,11 +18,6 @@ import io.islandtime.internal.MILLISECONDS_PER_DAY import io.islandtime.internal.MINUTES_PER_DAY import io.islandtime.internal.NANOSECONDS_PER_DAY import io.islandtime.internal.SECONDS_PER_DAY -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Decades.kt b/core/src/commonMain/generated/io/islandtime/measures/_Decades.kt index 69944672d..23350dbcd 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Decades.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Decades.kt @@ -6,14 +6,14 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.DECADES_PER_CENTURY import io.islandtime.internal.MONTHS_PER_DECADE import io.islandtime.internal.YEARS_PER_DECADE -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Hours.kt b/core/src/commonMain/generated/io/islandtime/measures/_Hours.kt index 95f42f4ca..768b78544 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Hours.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Hours.kt @@ -6,17 +6,17 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.HOURS_PER_DAY import io.islandtime.internal.MICROSECONDS_PER_HOUR import io.islandtime.internal.MILLISECONDS_PER_HOUR import io.islandtime.internal.MINUTES_PER_HOUR import io.islandtime.internal.NANOSECONDS_PER_HOUR import io.islandtime.internal.SECONDS_PER_HOUR -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Microseconds.kt b/core/src/commonMain/generated/io/islandtime/measures/_Microseconds.kt index 1bae36edd..0b5b98ca6 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Microseconds.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Microseconds.kt @@ -6,17 +6,17 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.MICROSECONDS_PER_DAY import io.islandtime.internal.MICROSECONDS_PER_HOUR import io.islandtime.internal.MICROSECONDS_PER_MILLISECOND import io.islandtime.internal.MICROSECONDS_PER_MINUTE import io.islandtime.internal.MICROSECONDS_PER_SECOND import io.islandtime.internal.NANOSECONDS_PER_MICROSECOND -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import io.islandtime.internal.toZeroPaddedString import kotlin.Boolean import kotlin.Comparable diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Milliseconds.kt b/core/src/commonMain/generated/io/islandtime/measures/_Milliseconds.kt index e9ce2504c..a760ea3ab 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Milliseconds.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Milliseconds.kt @@ -6,17 +6,17 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.MICROSECONDS_PER_MILLISECOND import io.islandtime.internal.MILLISECONDS_PER_DAY import io.islandtime.internal.MILLISECONDS_PER_HOUR import io.islandtime.internal.MILLISECONDS_PER_MINUTE import io.islandtime.internal.MILLISECONDS_PER_SECOND import io.islandtime.internal.NANOSECONDS_PER_MILLISECOND -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import io.islandtime.internal.toZeroPaddedString import kotlin.Boolean import kotlin.Comparable diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Minutes.kt b/core/src/commonMain/generated/io/islandtime/measures/_Minutes.kt index eac3db9d8..8b0228563 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Minutes.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Minutes.kt @@ -6,17 +6,17 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.MICROSECONDS_PER_MINUTE import io.islandtime.internal.MILLISECONDS_PER_MINUTE import io.islandtime.internal.MINUTES_PER_DAY import io.islandtime.internal.MINUTES_PER_HOUR import io.islandtime.internal.NANOSECONDS_PER_MINUTE import io.islandtime.internal.SECONDS_PER_MINUTE -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Months.kt b/core/src/commonMain/generated/io/islandtime/measures/_Months.kt index 1c2ca25f1..be0d629b2 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Months.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Months.kt @@ -6,14 +6,14 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.MONTHS_PER_CENTURY import io.islandtime.internal.MONTHS_PER_DECADE import io.islandtime.internal.MONTHS_PER_YEAR -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Nanoseconds.kt b/core/src/commonMain/generated/io/islandtime/measures/_Nanoseconds.kt index 3bf233198..96e874483 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Nanoseconds.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Nanoseconds.kt @@ -6,17 +6,17 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.NANOSECONDS_PER_DAY import io.islandtime.internal.NANOSECONDS_PER_HOUR import io.islandtime.internal.NANOSECONDS_PER_MICROSECOND import io.islandtime.internal.NANOSECONDS_PER_MILLISECOND import io.islandtime.internal.NANOSECONDS_PER_MINUTE import io.islandtime.internal.NANOSECONDS_PER_SECOND -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import io.islandtime.internal.toZeroPaddedString import kotlin.Boolean import kotlin.Comparable diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Seconds.kt b/core/src/commonMain/generated/io/islandtime/measures/_Seconds.kt index 6a60c0e0a..339f1c520 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Seconds.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Seconds.kt @@ -6,17 +6,17 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.MICROSECONDS_PER_SECOND import io.islandtime.internal.MILLISECONDS_PER_SECOND import io.islandtime.internal.NANOSECONDS_PER_SECOND import io.islandtime.internal.SECONDS_PER_DAY import io.islandtime.internal.SECONDS_PER_HOUR import io.islandtime.internal.SECONDS_PER_MINUTE -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Weeks.kt b/core/src/commonMain/generated/io/islandtime/measures/_Weeks.kt index 831e0ab67..9accc2925 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Weeks.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Weeks.kt @@ -6,12 +6,12 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.DAYS_PER_WEEK -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/generated/io/islandtime/measures/_Years.kt b/core/src/commonMain/generated/io/islandtime/measures/_Years.kt index 48eaea6ba..5f8d609ed 100644 --- a/core/src/commonMain/generated/io/islandtime/measures/_Years.kt +++ b/core/src/commonMain/generated/io/islandtime/measures/_Years.kt @@ -6,14 +6,14 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.minusExact +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.internal.MONTHS_PER_YEAR import io.islandtime.internal.YEARS_PER_CENTURY import io.islandtime.internal.YEARS_PER_DECADE -import io.islandtime.internal.minusExact -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import kotlin.Boolean import kotlin.Comparable import kotlin.Int diff --git a/core/src/commonMain/kotlin/io/islandtime/Conversions.kt b/core/src/commonMain/kotlin/io/islandtime/Conversions.kt index 430353a2c..472cc1928 100644 --- a/core/src/commonMain/kotlin/io/islandtime/Conversions.kt +++ b/core/src/commonMain/kotlin/io/islandtime/Conversions.kt @@ -3,9 +3,9 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorDiv import io.islandtime.base.TimePoint import io.islandtime.internal.SECONDS_PER_DAY -import io.islandtime.internal.floorDiv import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmName diff --git a/core/src/commonMain/kotlin/io/islandtime/Date.kt b/core/src/commonMain/kotlin/io/islandtime/Date.kt index 7fc6cec94..3bb5f8951 100644 --- a/core/src/commonMain/kotlin/io/islandtime/Date.kt +++ b/core/src/commonMain/kotlin/io/islandtime/Date.kt @@ -2,6 +2,9 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorDiv +import dev.erikchristensen.javamath2kmp.floorMod +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.base.DateTimeField import io.islandtime.internal.* import io.islandtime.measures.* diff --git a/core/src/commonMain/kotlin/io/islandtime/DateTime.kt b/core/src/commonMain/kotlin/io/islandtime/DateTime.kt index 654c530e9..325599a6d 100644 --- a/core/src/commonMain/kotlin/io/islandtime/DateTime.kt +++ b/core/src/commonMain/kotlin/io/islandtime/DateTime.kt @@ -1,5 +1,7 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorDiv +import dev.erikchristensen.javamath2kmp.floorMod import io.islandtime.internal.* import io.islandtime.measures.* import io.islandtime.parser.* @@ -115,7 +117,8 @@ class DateTime( ReplaceWith("this.toYearMonth()"), DeprecationLevel.ERROR ) - inline val yearMonth: YearMonth get() = toYearMonth() + inline val yearMonth: YearMonth + get() = toYearMonth() /** * Returns this date-time with [period] added to it. @@ -590,7 +593,7 @@ class DateTime( val localMilliseconds = millisecondsSinceUnixEpoch + offset.totalSeconds val localEpochDay = localMilliseconds.value floorDiv MILLISECONDS_PER_DAY val nanosecondOfDay = - (localMilliseconds.value floorMod MILLISECONDS_PER_DAY).milliseconds.inNanosecondsUnchecked.value + (localMilliseconds.value floorMod MILLISECONDS_PER_DAY).milliseconds.inNanoseconds.value val date = Date.fromDayOfUnixEpoch(localEpochDay) val time = Time.fromNanosecondOfDay(nanosecondOfDay) return DateTime(date, time) diff --git a/core/src/commonMain/kotlin/io/islandtime/Instant.kt b/core/src/commonMain/kotlin/io/islandtime/Instant.kt index a79b94802..f2b8c5a08 100644 --- a/core/src/commonMain/kotlin/io/islandtime/Instant.kt +++ b/core/src/commonMain/kotlin/io/islandtime/Instant.kt @@ -2,6 +2,10 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorDiv +import dev.erikchristensen.javamath2kmp.floorMod +import dev.erikchristensen.javamath2kmp.plusExact +import dev.erikchristensen.javamath2kmp.timesExact import io.islandtime.base.DateTimeField import io.islandtime.base.TimePoint import io.islandtime.internal.* diff --git a/core/src/commonMain/kotlin/io/islandtime/Time.kt b/core/src/commonMain/kotlin/io/islandtime/Time.kt index 1009d424b..68fd8639d 100644 --- a/core/src/commonMain/kotlin/io/islandtime/Time.kt +++ b/core/src/commonMain/kotlin/io/islandtime/Time.kt @@ -1,5 +1,6 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.base.DateTimeField import io.islandtime.internal.* import io.islandtime.measures.* diff --git a/core/src/commonMain/kotlin/io/islandtime/UtcOffset.kt b/core/src/commonMain/kotlin/io/islandtime/UtcOffset.kt index d886d2263..79271f11f 100644 --- a/core/src/commonMain/kotlin/io/islandtime/UtcOffset.kt +++ b/core/src/commonMain/kotlin/io/islandtime/UtcOffset.kt @@ -2,9 +2,9 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.base.DateTimeField import io.islandtime.internal.appendZeroPadded -import io.islandtime.internal.toIntExact import io.islandtime.measures.* import io.islandtime.parser.* import kotlin.math.absoluteValue diff --git a/core/src/commonMain/kotlin/io/islandtime/YearMonth.kt b/core/src/commonMain/kotlin/io/islandtime/YearMonth.kt index f13157c74..223332df2 100644 --- a/core/src/commonMain/kotlin/io/islandtime/YearMonth.kt +++ b/core/src/commonMain/kotlin/io/islandtime/YearMonth.kt @@ -1,7 +1,11 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorDiv +import dev.erikchristensen.javamath2kmp.floorMod +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.base.DateTimeField -import io.islandtime.internal.* +import io.islandtime.internal.MONTHS_PER_YEAR +import io.islandtime.internal.appendZeroPadded import io.islandtime.measures.* import io.islandtime.parser.* import io.islandtime.ranges.DateRange diff --git a/core/src/commonMain/kotlin/io/islandtime/internal/Extensions.kt b/core/src/commonMain/kotlin/io/islandtime/internal/Extensions.kt index 3b2766df4..280f9fdd9 100644 --- a/core/src/commonMain/kotlin/io/islandtime/internal/Extensions.kt +++ b/core/src/commonMain/kotlin/io/islandtime/internal/Extensions.kt @@ -1,8 +1,5 @@ package io.islandtime.internal -internal infix fun Long.plusExact(other: Int): Long = this plusExact other.toLong() -internal infix fun Long.minusExact(other: Int): Long = this minusExact other.toLong() - /** * Append a number to a string, padding it with zeros as necessary to reach a desired length * @param number The number to pad -- must be positive or zero diff --git a/core/src/commonMain/kotlin/io/islandtime/internal/Instants.kt b/core/src/commonMain/kotlin/io/islandtime/internal/Instants.kt index 849c2c1f5..85569253b 100644 --- a/core/src/commonMain/kotlin/io/islandtime/internal/Instants.kt +++ b/core/src/commonMain/kotlin/io/islandtime/internal/Instants.kt @@ -1,5 +1,6 @@ package io.islandtime.internal +import dev.erikchristensen.javamath2kmp.floorDiv import io.islandtime.* internal fun toTimeAt(offset: UtcOffset, secondOfUnixEpoch: Long, nanosecond: Int): Time { diff --git a/core/src/commonMain/kotlin/io/islandtime/internal/Math.kt b/core/src/commonMain/kotlin/io/islandtime/internal/Math.kt deleted file mode 100644 index f08a7694a..000000000 --- a/core/src/commonMain/kotlin/io/islandtime/internal/Math.kt +++ /dev/null @@ -1,24 +0,0 @@ -package io.islandtime.internal - -internal expect infix fun Long.floorMod(other: Long): Long -internal expect infix fun Int.floorMod(other: Int): Int -internal expect infix fun Long.floorMod(other: Int): Long - -internal expect infix fun Long.floorDiv(other: Long): Long -internal expect infix fun Int.floorDiv(other: Int): Int -internal expect infix fun Long.floorDiv(other: Int): Long - -internal expect infix fun Long.plusExact(other: Long): Long -internal expect infix fun Int.plusExact(other: Int): Int - -internal expect infix fun Long.minusExact(other: Long): Long -internal expect infix fun Int.minusExact(other: Int): Int - -internal expect infix fun Long.timesExact(other: Long): Long -internal expect infix fun Int.timesExact(other: Int): Int -internal expect infix fun Long.timesExact(other: Int): Long - -internal expect fun Int.negateExact(): Int -internal expect fun Long.negateExact(): Long - -internal expect fun Long.toIntExact(): Int diff --git a/core/src/commonMain/kotlin/io/islandtime/internal/WeekNumbers.kt b/core/src/commonMain/kotlin/io/islandtime/internal/WeekNumbers.kt index 1e4f35117..54c91ce78 100644 --- a/core/src/commonMain/kotlin/io/islandtime/internal/WeekNumbers.kt +++ b/core/src/commonMain/kotlin/io/islandtime/internal/WeekNumbers.kt @@ -2,6 +2,7 @@ package io.islandtime.internal +import dev.erikchristensen.javamath2kmp.floorMod import io.islandtime.* import io.islandtime.calendar.WeekSettings import io.islandtime.measures.IntWeeks diff --git a/core/src/commonMain/kotlin/io/islandtime/measures/Period.kt b/core/src/commonMain/kotlin/io/islandtime/measures/Period.kt index 27ad9084c..3f1454145 100644 --- a/core/src/commonMain/kotlin/io/islandtime/measures/Period.kt +++ b/core/src/commonMain/kotlin/io/islandtime/measures/Period.kt @@ -1,11 +1,10 @@ package io.islandtime.measures +import dev.erikchristensen.javamath2kmp.timesExact +import dev.erikchristensen.javamath2kmp.toIntExact import io.islandtime.base.DateTimeField import io.islandtime.internal.MONTHS_PER_YEAR -import io.islandtime.internal.timesExact -import io.islandtime.internal.toIntExact import io.islandtime.parser.* -import io.islandtime.parser.throwParserFieldResolutionException /** * A date-based period of time, such as "2 years, 5 months, 16 days". Unlike [Duration], which uses exact increments, diff --git a/core/src/commonMain/kotlin/io/islandtime/operators/Round.kt b/core/src/commonMain/kotlin/io/islandtime/operators/Round.kt index 633bf530e..a19150c05 100644 --- a/core/src/commonMain/kotlin/io/islandtime/operators/Round.kt +++ b/core/src/commonMain/kotlin/io/islandtime/operators/Round.kt @@ -4,6 +4,7 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorMod import io.islandtime.Time.Companion.MIDNIGHT import io.islandtime.Time.Companion.NOON import io.islandtime.internal.* diff --git a/core/src/commonMain/kotlin/io/islandtime/operators/RoundDown.kt b/core/src/commonMain/kotlin/io/islandtime/operators/RoundDown.kt index 82e3e04b1..a6237fb70 100644 --- a/core/src/commonMain/kotlin/io/islandtime/operators/RoundDown.kt +++ b/core/src/commonMain/kotlin/io/islandtime/operators/RoundDown.kt @@ -4,6 +4,7 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorMod import io.islandtime.Time.Companion.MIDNIGHT import io.islandtime.internal.* import io.islandtime.measures.* diff --git a/core/src/commonMain/kotlin/io/islandtime/operators/RoundUp.kt b/core/src/commonMain/kotlin/io/islandtime/operators/RoundUp.kt index 7109b359b..a15f4f685 100644 --- a/core/src/commonMain/kotlin/io/islandtime/operators/RoundUp.kt +++ b/core/src/commonMain/kotlin/io/islandtime/operators/RoundUp.kt @@ -4,6 +4,7 @@ package io.islandtime +import dev.erikchristensen.javamath2kmp.floorMod import io.islandtime.Time.Companion.MIDNIGHT import io.islandtime.internal.* import io.islandtime.measures.* diff --git a/core/src/commonMain/kotlin/io/islandtime/parser/internal/Parsers.kt b/core/src/commonMain/kotlin/io/islandtime/parser/internal/Parsers.kt index 304a9d15f..73739b23a 100644 --- a/core/src/commonMain/kotlin/io/islandtime/parser/internal/Parsers.kt +++ b/core/src/commonMain/kotlin/io/islandtime/parser/internal/Parsers.kt @@ -1,11 +1,11 @@ package io.islandtime.parser.internal +import dev.erikchristensen.javamath2kmp.negateExact +import dev.erikchristensen.javamath2kmp.plusExact import io.islandtime.base.DateTimeField import io.islandtime.format.DateTimeTextProvider import io.islandtime.format.NumberStyle import io.islandtime.format.TextStyle -import io.islandtime.internal.negateExact -import io.islandtime.internal.plusExact import io.islandtime.parser.* internal object EmptyDateTimeParser : DateTimeParser() { diff --git a/core/src/commonTest/kotlin/io/islandtime/internal/MathTest.kt b/core/src/commonTest/kotlin/io/islandtime/internal/MathTest.kt deleted file mode 100644 index f1587874a..000000000 --- a/core/src/commonTest/kotlin/io/islandtime/internal/MathTest.kt +++ /dev/null @@ -1,109 +0,0 @@ -package io.islandtime.internal - -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFailsWith - -class MathTest { - @Test - fun `plusExact infix throws an exception when adding Longs results in overflow`() { - assertFailsWith { Long.MAX_VALUE plusExact 1 } - assertFailsWith { Long.MAX_VALUE plusExact Long.MAX_VALUE } - assertFailsWith { Long.MIN_VALUE plusExact (-1) } - assertFailsWith { Long.MIN_VALUE plusExact Long.MIN_VALUE } - } - - @Test - fun `plusExact infix adds Longs when the result fits in a Long`() { - assertEquals(Long.MAX_VALUE, Long.MAX_VALUE - 1 plusExact 1) - assertEquals(Long.MIN_VALUE, Long.MIN_VALUE + 1 plusExact (-1)) - } - - @Test - fun `plusExact infix throws an exception when adding Ints results in overflow`() { - assertFailsWith { Int.MAX_VALUE plusExact 1 } - assertFailsWith { Int.MAX_VALUE plusExact Int.MAX_VALUE } - assertFailsWith { Int.MIN_VALUE plusExact (-1) } - assertFailsWith { Int.MIN_VALUE plusExact Int.MIN_VALUE } - } - - @Test - fun `plusExact infix adds Ints when the result fits in an Int`() { - assertEquals(Int.MAX_VALUE, Int.MAX_VALUE - 1 plusExact 1) - assertEquals(Int.MIN_VALUE, Int.MIN_VALUE + 1 plusExact (-1)) - } - - @Test - fun `minusExact infix throws an exception when subtracting Longs results in overflow`() { - assertFailsWith { Long.MIN_VALUE minusExact 1 } - assertFailsWith { Long.MIN_VALUE minusExact Long.MAX_VALUE } - assertFailsWith { Long.MAX_VALUE minusExact (-1) } - assertFailsWith { Long.MAX_VALUE minusExact Long.MIN_VALUE } - } - - @Test - fun `minusExact infix subtracts Longs when the result fits in a Long`() { - assertEquals(Long.MIN_VALUE, Long.MIN_VALUE + 1 minusExact 1) - assertEquals(Long.MAX_VALUE, Long.MAX_VALUE - 1 minusExact (-1)) - } - - @Test - fun `minusExact infix throws an exception when subtracting Ints results in overflow`() { - assertFailsWith { Int.MIN_VALUE minusExact 1 } - assertFailsWith { Int.MIN_VALUE minusExact Int.MAX_VALUE } - assertFailsWith { Int.MAX_VALUE minusExact (-1) } - assertFailsWith { Int.MAX_VALUE minusExact Int.MIN_VALUE } - } - - @Test - fun `minusExact infix subtracts Ints when the result fits in a Int`() { - assertEquals(Int.MIN_VALUE, Int.MIN_VALUE + 1 minusExact 1) - assertEquals(Int.MAX_VALUE, Int.MAX_VALUE - 1 minusExact (-1)) - } - - @Test - fun `timesExact infix throws an exception when multiplying Longs results in overflow`() { - assertFailsWith { (Long.MAX_VALUE / 2 + 1) timesExact 2 } - assertFailsWith { Long.MAX_VALUE timesExact Long.MAX_VALUE } - assertFailsWith { Long.MIN_VALUE timesExact Long.MIN_VALUE } - assertFailsWith { Long.MIN_VALUE timesExact Long.MAX_VALUE } - assertFailsWith { Long.MIN_VALUE timesExact (-1) } - } - - @Test - fun `timesExact infix multiplies Longs when the result fits in a Long`() { - assertEquals(Long.MAX_VALUE, Long.MAX_VALUE timesExact 1) - assertEquals(Long.MAX_VALUE - 1, Long.MAX_VALUE / 2 timesExact 2) - assertEquals(Long.MIN_VALUE, Long.MIN_VALUE timesExact 1) - assertEquals(Long.MIN_VALUE, Long.MIN_VALUE / 2 timesExact 2) - } - - @Test - fun `timesExact infix throws an exception when multiplying Ints results in overflow`() { - assertFailsWith { (Int.MAX_VALUE / 2 + 1) timesExact 2 } - assertFailsWith { Int.MAX_VALUE timesExact Int.MAX_VALUE } - assertFailsWith { Int.MIN_VALUE timesExact Int.MIN_VALUE } - assertFailsWith { Int.MIN_VALUE timesExact Int.MAX_VALUE } - assertFailsWith { Int.MIN_VALUE timesExact (-1) } - } - - @Test - fun `timesExact infix multiplies Ints when the result fits in a Int`() { - assertEquals(Int.MAX_VALUE, Int.MAX_VALUE timesExact 1) - assertEquals(Int.MAX_VALUE - 1, Int.MAX_VALUE / 2 timesExact 2) - assertEquals(Int.MIN_VALUE, Int.MIN_VALUE timesExact 1) - assertEquals(Int.MIN_VALUE, Int.MIN_VALUE / 2 timesExact 2) - } - - @Test - fun `Long_toIntExact() throws an exception when the conversion overflows`() { - assertFailsWith { (Int.MAX_VALUE + 1L).toIntExact() } - assertFailsWith { (Int.MIN_VALUE - 1L).toIntExact() } - } - - @Test - fun `Long_toIntExact() converts a Long to an Int when it fits without overflow`() { - assertEquals(Int.MAX_VALUE, (Int.MAX_VALUE.toLong()).toIntExact()) - assertEquals(Int.MIN_VALUE, (Int.MIN_VALUE.toLong()).toIntExact()) - } -} diff --git a/core/src/darwinMain/kotlin/io/islandtime/internal/Math.kt b/core/src/darwinMain/kotlin/io/islandtime/internal/Math.kt deleted file mode 100644 index 62aee6770..000000000 --- a/core/src/darwinMain/kotlin/io/islandtime/internal/Math.kt +++ /dev/null @@ -1,131 +0,0 @@ -package io.islandtime.internal - -// -// Adapted from https://github.com/ThreeTen/threetenbp/blob/master/src/main/java/org/threeten/bp/jdk8/Jdk8Methods.java -// - -internal actual infix fun Long.floorMod(other: Long): Long { - return ((this % other) + other) % other -} - -internal actual infix fun Int.floorMod(other: Int): Int { - return ((this % other) + other) % other -} - -internal actual infix fun Long.floorMod(other: Int): Long = this floorMod other.toLong() - -internal actual infix fun Long.floorDiv(other: Long): Long { - val result = this / other - // if the signs are different and modulo not zero, round down - return if (this xor other < 0 && result * other != this) { - result - 1 - } else { - result - } -} - -internal actual infix fun Int.floorDiv(other: Int): Int { - val result = this / other - // if the signs are different and modulo not zero, round down - return if (this xor other < 0 && result * other != this) { - result - 1 - } else { - result - } -} - -internal actual infix fun Long.floorDiv(other: Int): Long = this floorDiv other.toLong() - -internal actual infix fun Long.plusExact(other: Long): Long { - val result = this + other - - if (this xor result < 0L && this xor other >= 0L) { - throw ArithmeticException("'$this + $other' overflows a Long") - } - - return result -} - -internal actual infix fun Int.plusExact(other: Int): Int { - val result = this + other - - if (this xor result < 0 && this xor other >= 0) { - throw ArithmeticException("'$this + $other' overflows an Int") - } - - return result -} - -internal actual infix fun Long.minusExact(other: Long): Long { - val result = this - other - - if (this xor result < 0L && this xor other < 0L) { - throw ArithmeticException("'$this - $other' overflows a Long") - } - - return result -} - -internal actual infix fun Int.minusExact(other: Int): Int { - val result = this - other - - if (this xor result < 0 && this xor other < 0) { - throw ArithmeticException("'$this - $other' overflows an Int") - } - - return result -} - -internal actual infix fun Long.timesExact(other: Long): Long { - return when { - other == 1L -> this - this == 1L -> other - this == 0L || other == 0L -> 0L - else -> { - val total = this * other - - if ((this == Long.MIN_VALUE && other == -1L) || - (other == Long.MIN_VALUE && this == -1L) || - total / other != this - ) { - throw ArithmeticException("'$this * $other' overflows a Long") - } - - total - } - } -} - -internal actual infix fun Int.timesExact(other: Int): Int { - val total = this.toLong() * other.toLong() - - if (total !in Int.MIN_VALUE..Int.MAX_VALUE) { - throw ArithmeticException("'$this * $other' overflows an Int") - } - - return total.toInt() -} - -internal actual infix fun Long.timesExact(other: Int): Long = this timesExact other.toLong() - -internal actual fun Int.negateExact(): Int { - if (this == Int.MIN_VALUE) { - throw ArithmeticException("'$this' can't be negated without overflow") - } - return -this -} - -internal actual fun Long.negateExact(): Long { - if (this == Long.MIN_VALUE) { - throw ArithmeticException("'$this' can't be negated without overflow") - } - return -this -} - -internal actual fun Long.toIntExact(): Int { - if (this !in Int.MIN_VALUE..Int.MAX_VALUE) { - throw ArithmeticException("'$this' can't be converted to Int without overflow") - } - - return toInt() -} diff --git a/core/src/jvmMain/kotlin/io/islandtime/internal/Math.kt b/core/src/jvmMain/kotlin/io/islandtime/internal/Math.kt deleted file mode 100644 index fc37041a7..000000000 --- a/core/src/jvmMain/kotlin/io/islandtime/internal/Math.kt +++ /dev/null @@ -1,26 +0,0 @@ -@file:Suppress("NewApi") - -package io.islandtime.internal - -internal actual infix fun Long.floorMod(other: Long): Long = Math.floorMod(this, other) -internal actual infix fun Int.floorMod(other: Int): Int = Math.floorMod(this, other) -internal actual infix fun Long.floorMod(other: Int): Long = this floorMod other.toLong() - -internal actual infix fun Long.floorDiv(other: Long): Long = Math.floorDiv(this, other) -internal actual infix fun Int.floorDiv(other: Int): Int = Math.floorDiv(this, other) -internal actual infix fun Long.floorDiv(other: Int): Long = this floorDiv other.toLong() - -internal actual infix fun Long.plusExact(other: Long): Long = Math.addExact(this, other) -internal actual infix fun Int.plusExact(other: Int): Int = Math.addExact(this, other) - -internal actual infix fun Long.minusExact(other: Long): Long = Math.subtractExact(this, other) -internal actual infix fun Int.minusExact(other: Int): Int = Math.subtractExact(this, other) - -internal actual infix fun Long.timesExact(other: Long): Long = Math.multiplyExact(this, other) -internal actual infix fun Int.timesExact(other: Int): Int = Math.multiplyExact(this, other) -internal actual infix fun Long.timesExact(other: Int): Long = this timesExact other.toLong() - -internal actual fun Int.negateExact(): Int = Math.negateExact(this) -internal actual fun Long.negateExact(): Long = Math.negateExact(this) - -internal actual fun Long.toIntExact(): Int = Math.toIntExact(this) diff --git a/tools/code-generator/settings.gradle.kts b/tools/code-generator/settings.gradle.kts new file mode 100644 index 000000000..e69de29bb diff --git a/tools/code-generator/src/main/kotlin/io/islandtime/codegen/Main.kt b/tools/code-generator/src/main/kotlin/io/islandtime/codegen/Main.kt index bd82b7b19..f61a634c9 100644 --- a/tools/code-generator/src/main/kotlin/io/islandtime/codegen/Main.kt +++ b/tools/code-generator/src/main/kotlin/io/islandtime/codegen/Main.kt @@ -22,6 +22,8 @@ fun measures(name: String) = ClassName(MEASURES_PACKAGE_NAME, name) fun ranges(name: String) = ClassName(RANGES_PACKAGE_NAME, name) fun rangesInternal(name: String) = ClassName(RANGES_INTERNAL_PACKAGE_NAME, name) +fun javamath2kmp(name: String) = ClassName("dev.erikchristensen.javamath2kmp", name) + private val generators = arrayOf( TemporalUnitGenerator, ConstantsGenerator, diff --git a/tools/code-generator/src/main/kotlin/io/islandtime/codegen/generators/TemporalUnitGenerator.kt b/tools/code-generator/src/main/kotlin/io/islandtime/codegen/generators/TemporalUnitGenerator.kt index 7b12bf84f..2d038f12a 100644 --- a/tools/code-generator/src/main/kotlin/io/islandtime/codegen/generators/TemporalUnitGenerator.kt +++ b/tools/code-generator/src/main/kotlin/io/islandtime/codegen/generators/TemporalUnitGenerator.kt @@ -9,6 +9,7 @@ import io.islandtime.codegen.descriptions.TemporalUnitDescription import io.islandtime.codegen.descriptions.per import io.islandtime.codegen.dsl.* import io.islandtime.codegen.internal +import io.islandtime.codegen.javamath2kmp import io.islandtime.codegen.measures import io.islandtime.codegen.util.zero import java.util.* @@ -339,7 +340,7 @@ fun TemporalUnitClassGenerator.buildWholeToStringCodeBlock() = io.islandtime.cod val arguments = mapOf( "value" to valuePropertySpec, "absoluteValue" to ClassName("kotlin.math", "absoluteValue"), - "timesExact" to internal("timesExact"), + "timesExact" to javamath2kmp("timesExact"), "minValue" to "${primitiveTypeName.simpleName}.MIN_VALUE" ) @@ -404,7 +405,7 @@ fun LongTemporalUnitClassGenerator.buildToIntFunSpec() = buildFunSpec("toInt") { @throws ArithmeticException if overflow occurs """.trimIndent() ) - addStatement("return %N.%T()", valuePropertySpec, internal("toIntExact")) + addStatement("return %N.%T()", valuePropertySpec, javamath2kmp("toIntExact")) } fun LongTemporalUnitClassGenerator.buildToIntUncheckedFunSpec() = buildFunSpec( @@ -428,7 +429,7 @@ fun LongTemporalUnitClassGenerator.buildToIntUnitFunSpec() = buildFunSpec( "return %T(%N.%T())", description.intClassName, valuePropertySpec, - internal("toIntExact") + javamath2kmp("toIntExact") ) } @@ -454,7 +455,7 @@ fun TemporalUnitClassGenerator.buildUnaryMinusFunSpec() = buildFunSpec("unaryMin "return %T(%N.%T())", className, valuePropertySpec, - internal("negateExact") + javamath2kmp("negateExact") ) } @@ -472,12 +473,12 @@ enum class PlusOrMinusOperator( ) { PLUS( functionName = "plus", - operator = internal("plusExact"), + operator = javamath2kmp("plusExact"), uncheckedOperator = "+" ), MINUS( functionName = "minus", - operator = internal("minusExact"), + operator = javamath2kmp("minusExact"), uncheckedOperator = "-" ) } @@ -653,7 +654,7 @@ fun TemporalUnitClassGenerator.buildTimesFunSpec( "return %T(%N %T %N)", className, valuePropertySpec, - internal("timesExact"), + javamath2kmp("timesExact"), scalar ) } @@ -801,7 +802,7 @@ fun TemporalUnitClassGenerator.buildInSmallerUnitConversionSpecs( "return (%N %T %T).${conversion.toUnit.lowerPluralName}" }, valuePropertySpec, - internal("timesExact"), + javamath2kmp("timesExact"), conversion.propertyClassName ) }