From ed5fd15f6e567c41e1b9cb2c272461f685b9efd2 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 20 Mar 2024 18:13:29 +0100 Subject: [PATCH] Ensmallen Date struct. --- core/time/datetime/constants.odin | 4 ++-- core/time/datetime/datetime.odin | 14 +++++++------- tests/core/time/test_core_time.odin | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/time/datetime/constants.odin b/core/time/datetime/constants.odin index 039f93cfb..a2a02838c 100644 --- a/core/time/datetime/constants.odin +++ b/core/time/datetime/constants.odin @@ -26,8 +26,8 @@ Error :: enum { Date :: struct { year: i64, - month: i64, - day: i64, + month: i8, + day: i8, } Time :: struct { diff --git a/core/time/datetime/datetime.odin b/core/time/datetime/datetime.odin index 1bc92da80..156573315 100644 --- a/core/time/datetime/datetime.odin +++ b/core/time/datetime/datetime.odin @@ -15,7 +15,7 @@ date_to_ordinal :: proc "contextless" (date: Date) -> (ordinal: Ordinal, err: Er } components_to_ordinal :: proc "contextless" (#any_int year, #any_int month, #any_int day: i64) -> (ordinal: Ordinal, err: Error) { - return date_to_ordinal(Date{year, month, day}) + return date_to_ordinal(Date{year, i8(month), i8(day)}) } // Procedures that return a Date @@ -26,7 +26,7 @@ ordinal_to_date :: proc "contextless" (ordinal: Ordinal) -> (date: Date, err: Er } components_to_date :: proc "contextless" (#any_int year, #any_int month, #any_int day: i64) -> (date: Date, err: Error) { - date = Date{i64(year), i64(month), i64(day)} + date = Date{i64(year), i8(month), i8(day)} validate(date) or_return return date, .None } @@ -128,7 +128,7 @@ days_remaining :: proc "contextless" (date: Date) -> (days_remaining: i64, err: return delta.days, .None } -last_day_of_month :: proc "contextless" (year, month: i64) -> (day: i64, err: Error) { +last_day_of_month :: proc "contextless" (#any_int year: i64, #any_int month: i8) -> (day: i64, err: Error) { // Not using formula 2.27 from the book. This is far simpler and gives the same answer. validate(Date{year, month, 1}) or_return @@ -210,7 +210,7 @@ unsafe_date_to_ordinal :: proc "contextless" (date: Date) -> (ordinal: Ordinal) ordinal += floor_div(year_minus_one, 4) // Julian-rule leap days ordinal -= floor_div(year_minus_one, 100) // Prior century years ordinal += floor_div(year_minus_one, 400) // Prior 400-multiple years - ordinal += floor_div(367 * date.month - 362, 12) // Prior days this year + ordinal += floor_div(367 * i64(date.month) - 362, 12) // Prior days this year // Apply correction if date.month <= 2 { @@ -222,7 +222,7 @@ unsafe_date_to_ordinal :: proc "contextless" (date: Date) -> (ordinal: Ordinal) } // Add days - ordinal += date.day + ordinal += i64(date.day) return } @@ -268,8 +268,8 @@ unsafe_ordinal_to_date :: proc "contextless" (ordinal: Ordinal) -> (date: Date) correction = 1 } - month := floor_div((12 * (prior_days + correction) + 373), 367) - day := ordinal - unsafe_date_to_ordinal(Date{year, month, 1}) + 1 + month := i8(floor_div((12 * (prior_days + correction) + 373), 367)) + day := i8(ordinal - unsafe_date_to_ordinal(Date{year, month, 1}) + 1) return {year, month, day} } \ No newline at end of file diff --git a/tests/core/time/test_core_time.odin b/tests/core/time/test_core_time.odin index bfbe22412..2cea47680 100644 --- a/tests/core/time/test_core_time.odin +++ b/tests/core/time/test_core_time.odin @@ -172,7 +172,7 @@ date_component_roundtrip_test :: proc(t: ^testing.T, moment: dt.DateTime) { expected := fmt.tprintf("Expected %4d-%2d-%2d %2d:%2d:%2d, got %4d-%2d-%2d %2d:%2d:%2d", moment.year, moment.month, moment.day, moment.hour, moment.minute, moment.second, YYYY, MM, DD, hh, mm, ss) - ok = moment.year == i64(YYYY) && moment.month == i64(MM) && moment.day == i64(DD) - ok &= moment.hour == i8(hh) && moment.minute == i8(mm) && moment.second == i8(ss) + ok = moment.year == i64(YYYY) && moment.month == i8(MM) && moment.day == i8(DD) + ok &= moment.hour == i8(hh) && moment.minute == i8(mm) && moment.second == i8(ss) expect(t, ok, expected) } \ No newline at end of file