Skip to content

Commit a5c16da

Browse files
committed
Extend YearFlags documentation/constants
1 parent e19ff08 commit a5c16da

File tree

1 file changed

+34
-19
lines changed

1 file changed

+34
-19
lines changed

src/naive/internals.rs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,47 @@
44

55
use core::fmt;
66

7-
/// The year flags (aka the dominical letter).
7+
/// Year flags (aka the dominical letter).
8+
///
9+
/// `YearFlags` are used as the last four bits of `NaiveDate`, `Mdf` and `IsoWeek`.
810
///
911
/// There are 14 possible classes of year in the Gregorian calendar:
1012
/// common and leap years starting with Monday through Sunday.
11-
/// The `YearFlags` stores this information into 4 bits `abbb`,
12-
/// where `a` is `1` for the common year (simplifies the `Of` validation)
13-
/// and `bbb` is a non-zero `Weekday` (mapping `Mon` to 7) of the last day in the past year
14-
/// (simplifies the day of week calculation from the 1-based ordinal).
13+
///
14+
/// The `YearFlags` stores this information into 4 bits `LWWW`. `L` is the leap year flag, with `1`
15+
/// for the common year (this simplifies validating an ordinal in `NaiveDate`). `WWW` is a non-zero
16+
/// `Weekday` of the last day in the preceding year.
1517
#[allow(unreachable_pub)] // public as an alias for benchmarks only
1618
#[derive(PartialEq, Eq, Copy, Clone, Hash)]
1719
pub struct YearFlags(pub(super) u8);
1820

19-
pub(super) const A: YearFlags = YearFlags(0o15);
20-
pub(super) const AG: YearFlags = YearFlags(0o05);
21-
pub(super) const B: YearFlags = YearFlags(0o14);
22-
pub(super) const BA: YearFlags = YearFlags(0o04);
23-
pub(super) const C: YearFlags = YearFlags(0o13);
24-
pub(super) const CB: YearFlags = YearFlags(0o03);
25-
pub(super) const D: YearFlags = YearFlags(0o12);
26-
pub(super) const DC: YearFlags = YearFlags(0o02);
27-
pub(super) const E: YearFlags = YearFlags(0o11);
28-
pub(super) const ED: YearFlags = YearFlags(0o01);
29-
pub(super) const F: YearFlags = YearFlags(0o17);
30-
pub(super) const FE: YearFlags = YearFlags(0o07);
31-
pub(super) const G: YearFlags = YearFlags(0o16);
32-
pub(super) const GF: YearFlags = YearFlags(0o06);
21+
// Weekday of the last day in the preceding year.
22+
// Allows for quick day of week calculation from the 1-based ordinal.
23+
const YEAR_STARTS_AFTER_MONDAY: u8 = 7; // non-zero to allow use with `NonZero*`.
24+
const YEAR_STARTS_AFTER_THUESDAY: u8 = 1;
25+
const YEAR_STARTS_AFTER_WEDNESDAY: u8 = 2;
26+
const YEAR_STARTS_AFTER_THURSDAY: u8 = 3;
27+
const YEAR_STARTS_AFTER_FRIDAY: u8 = 4;
28+
const YEAR_STARTS_AFTER_SATURDAY: u8 = 5;
29+
const YEAR_STARTS_AFTER_SUNDAY: u8 = 6;
30+
31+
const COMMON_YEAR: u8 = 1 << 3;
32+
const LEAP_YEAR: u8 = 0 << 3;
33+
34+
pub(super) const A: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_SATURDAY);
35+
pub(super) const AG: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_SATURDAY);
36+
pub(super) const B: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_FRIDAY);
37+
pub(super) const BA: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_FRIDAY);
38+
pub(super) const C: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_THURSDAY);
39+
pub(super) const CB: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_THURSDAY);
40+
pub(super) const D: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_WEDNESDAY);
41+
pub(super) const DC: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_WEDNESDAY);
42+
pub(super) const E: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_THUESDAY);
43+
pub(super) const ED: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_THUESDAY);
44+
pub(super) const F: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_MONDAY);
45+
pub(super) const FE: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_MONDAY);
46+
pub(super) const G: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_SUNDAY);
47+
pub(super) const GF: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_SUNDAY);
3348

3449
const YEAR_TO_FLAGS: &[YearFlags; 400] = &[
3550
BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C, BA,

0 commit comments

Comments
 (0)