Skip to content

Commit d50ae55

Browse files
Remove prev_year info (#6382)
This became dead code in #6319
1 parent 29996df commit d50ae55

File tree

2 files changed

+56
-155
lines changed

2 files changed

+56
-155
lines changed

components/calendar/src/cal/hijri.rs

+41-74
Original file line numberDiff line numberDiff line change
@@ -220,44 +220,9 @@ impl HijriTabular {
220220
}
221221
}
222222

223-
/// Compact representation of the length of a Hijri year.
224-
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
225-
enum HijriYearLength {
226-
/// Long (355-day) Hijri year
227-
L355,
228-
/// Short (354-day) Hijri year
229-
L354,
230-
/// Unexpectedly Short (353-day) Hijri year
231-
///
232-
/// It is probably a bug when this year length is returned. See:
233-
/// <https://github.com/unicode-org/icu4x/issues/4930>
234-
L353,
235-
}
236-
237-
impl Default for HijriYearLength {
238-
fn default() -> Self {
239-
Self::L354
240-
}
241-
}
242-
243-
impl HijriYearLength {
244-
const LONG: u16 = 355;
245-
const SHORT: u16 = 354;
246-
247-
fn try_from_int(value: i64) -> Option<Self> {
248-
match value {
249-
355 => Some(Self::L355),
250-
354 => Some(Self::L354),
251-
353 => Some(Self::L353),
252-
_ => None,
253-
}
254-
}
255-
}
256-
257223
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
258224
pub(crate) struct HijriYearInfo<IB: IslamicBased> {
259-
packed_data: PackedHijriYearInfo,
260-
prev_year_length: HijriYearLength,
225+
pub(crate) packed_data: PackedHijriYearInfo,
261226
model: IB,
262227
value: i32,
263228
}
@@ -268,56 +233,58 @@ impl<IB: IslamicBased> From<HijriYearInfo<IB>> for i32 {
268233
}
269234
}
270235

236+
const LONG_YEAR_LEN: u16 = 355;
237+
const SHORT_YEAR_LEN: u16 = 354;
238+
271239
impl<IB: IslamicBased> HijriYearInfo<IB> {
272-
pub(crate) fn new(
273-
prev_packed: PackedHijriYearInfo,
274-
this_packed: PackedHijriYearInfo,
240+
pub(crate) fn from_packed(
241+
packed_data: PackedHijriYearInfo,
275242
extended_year: i32,
276243
model: IB,
277244
) -> Self {
278-
let days_in_year = prev_packed.days_in_year();
279-
let days_in_year = match HijriYearLength::try_from_int(days_in_year as i64) {
280-
Some(x) => x,
281-
None => {
282-
debug_assert!(false, "Found wrong year length for Hijri year {extended_year}: Expected 355, 354, or 353, got {days_in_year}");
283-
Default::default()
284-
}
285-
};
286245
Self {
287-
prev_year_length: days_in_year,
288-
packed_data: this_packed,
246+
packed_data,
289247
model,
290248
value: extended_year,
291249
}
292250
}
293251

294-
fn compute_for_year(extended_year: i32, model: IB) -> Self {
252+
pub(crate) fn compute_for_year(extended_year: i32, model: IB) -> Self {
295253
let ny = model.fixed_from_islamic(extended_year, 1, 1);
296-
let packed_data = PackedHijriYearInfo::compute_with_ny(extended_year, ny, model);
297-
let prev_ny = model.fixed_from_islamic(extended_year - 1, 1, 1);
298-
let rd_diff = ny - prev_ny;
299-
let rd_diff = match HijriYearLength::try_from_int(rd_diff) {
300-
Some(x) => x,
301-
None => {
302-
debug_assert!(false, "({}) Found wrong year length for Hijri year {extended_year}: Expected 355, 354, or 353, got {rd_diff}", IB::DEBUG_NAME);
303-
Default::default()
304-
}
305-
};
306-
Self {
307-
prev_year_length: rd_diff,
308-
packed_data,
254+
let month_lengths = model.month_lengths_for_year(extended_year, ny);
255+
let ny_offset = ny - IB::mean_synodic_ny(extended_year);
256+
let r = Self {
257+
packed_data: PackedHijriYearInfo::new(month_lengths, ny_offset),
309258
model,
310259
value: extended_year,
260+
};
261+
if !matches!(r.days_in_year(), SHORT_YEAR_LEN | LONG_YEAR_LEN | 353) {
262+
// See https://github.com/unicode-org/icu4x/issues/4930
263+
debug_assert!(false, "({}) Found wrong year length for Hijri year {extended_year}: Expected 355, 354, or 353, got {}", IB::DEBUG_NAME, r.days_in_year());
311264
}
265+
r
312266
}
313267

314268
fn compute_for_fixed(fixed: RataDie, model: IB) -> Self {
315269
let (y, _m, _d) = model.islamic_from_fixed(fixed);
316270
Self::compute_for_year(y, model)
317271
}
318272

273+
/// The number of days in a given 1-indexed month
274+
pub(crate) fn days_in_month(self, month: u8) -> u8 {
275+
if self.packed_data.month_has_30_days(month) {
276+
30
277+
} else {
278+
29
279+
}
280+
}
281+
282+
pub(crate) fn days_in_year(self) -> u16 {
283+
self.packed_data.last_day_of_month(12)
284+
}
285+
319286
/// Get the new year R.D. given the extended year that this yearinfo is for
320-
fn new_year(self) -> RataDie {
287+
pub(crate) fn new_year(self) -> RataDie {
321288
IB::mean_synodic_ny(self.value) + self.packed_data.ny_offset()
322289
}
323290

@@ -401,20 +368,20 @@ impl CalendarArithmetic for HijriObservational {
401368
type YearInfo = HijriYearInfo<ObservationalIslamic>;
402369

403370
fn days_in_provided_month(year: Self::YearInfo, month: u8) -> u8 {
404-
year.packed_data.days_in_month(month)
371+
year.days_in_month(month)
405372
}
406373

407374
fn months_in_provided_year(_year: Self::YearInfo) -> u8 {
408375
12
409376
}
410377

411378
fn days_in_provided_year(year: Self::YearInfo) -> u16 {
412-
year.packed_data.days_in_year()
379+
year.days_in_year()
413380
}
414381

415382
// As an true lunar calendar, it does not have leap years.
416383
fn provided_year_is_leap(year: Self::YearInfo) -> bool {
417-
year.packed_data.days_in_year() != HijriYearLength::SHORT
384+
year.days_in_year() != SHORT_YEAR_LEN
418385
}
419386

420387
fn last_month_day_in_provided_year(year: Self::YearInfo) -> (u8, u8) {
@@ -574,20 +541,20 @@ impl CalendarArithmetic for HijriUmmAlQura {
574541
type YearInfo = HijriYearInfo<SaudiIslamic>;
575542

576543
fn days_in_provided_month(year: Self::YearInfo, month: u8) -> u8 {
577-
year.packed_data.days_in_month(month)
544+
year.days_in_month(month)
578545
}
579546

580547
fn months_in_provided_year(_year: HijriYearInfo<SaudiIslamic>) -> u8 {
581548
12
582549
}
583550

584551
fn days_in_provided_year(year: Self::YearInfo) -> u16 {
585-
year.packed_data.days_in_year()
552+
year.days_in_year()
586553
}
587554

588555
// As an true lunar calendar, it does not have leap years.
589556
fn provided_year_is_leap(year: Self::YearInfo) -> bool {
590-
year.packed_data.days_in_year() != HijriYearLength::SHORT
557+
year.days_in_year() != SHORT_YEAR_LEN
591558
}
592559

593560
fn last_month_day_in_provided_year(year: HijriYearInfo<SaudiIslamic>) -> (u8, u8) {
@@ -759,9 +726,9 @@ impl CalendarArithmetic for HijriCivil {
759726

760727
fn days_in_provided_year(year: i32) -> u16 {
761728
if Self::provided_year_is_leap(year) {
762-
HijriYearLength::LONG
729+
LONG_YEAR_LEN
763730
} else {
764-
HijriYearLength::SHORT
731+
SHORT_YEAR_LEN
765732
}
766733
}
767734

@@ -937,9 +904,9 @@ impl CalendarArithmetic for HijriTabular {
937904

938905
fn days_in_provided_year(year: i32) -> u16 {
939906
if Self::provided_year_is_leap(year) {
940-
HijriYearLength::LONG
907+
LONG_YEAR_LEN
941908
} else {
942-
HijriYearLength::SHORT
909+
SHORT_YEAR_LEN
943910
}
944911
}
945912

components/calendar/src/provider/hijri.rs

+15-81
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl HijriCache<'_> {
6262
pub fn compute_for<IB: IslamicBased>(extended_years: core::ops::Range<i32>, model: IB) -> Self {
6363
let data = extended_years
6464
.clone()
65-
.map(|year| PackedHijriYearInfo::compute(year, model))
65+
.map(|year| HijriYearInfo::compute_for_year(year, model).packed_data)
6666
.collect();
6767
HijriCache {
6868
first_extended_year: extended_years.start,
@@ -76,22 +76,12 @@ impl HijriCache<'_> {
7676
extended_year: i32,
7777
model: IB,
7878
) -> Option<HijriYearInfo<IB>> {
79-
let delta = extended_year - self.first_extended_year;
80-
let delta = usize::try_from(delta).ok()?;
79+
let packed_data = self
80+
.data
81+
.get(usize::try_from(extended_year - self.first_extended_year).ok()?)?;
8182

82-
if delta == 0 {
83-
return None;
84-
}
85-
86-
let (Some(this_packed), Some(prev_packed)) =
87-
(self.data.get(delta), self.data.get(delta - 1))
88-
else {
89-
return None;
90-
};
91-
92-
Some(HijriYearInfo::new(
93-
prev_packed,
94-
this_packed,
83+
Some(HijriYearInfo::from_packed(
84+
packed_data,
9585
extended_year,
9686
model,
9787
))
@@ -106,44 +96,17 @@ impl HijriCache<'_> {
10696
) -> Option<HijriYearInfo<IB>> {
10797
let extended_year = IB::approximate_islamic_from_fixed(fixed);
10898

109-
let delta = extended_year - self.first_extended_year;
110-
let delta = usize::try_from(delta).ok()?;
111-
112-
if delta <= 1 {
113-
return None;
114-
}
115-
116-
let this_packed = self.data.get(delta)?;
117-
let prev_packed = self.data.get(delta + 1)?;
99+
let year = self.get_for_extended_year(extended_year, model)?;
118100

119-
let this_ny = IB::mean_synodic_ny(extended_year) + this_packed.ny_offset();
120-
121-
if fixed < this_ny {
122-
let prev2_packed = self.data.get(delta - 2)?;
123-
return Some(HijriYearInfo::new(
124-
prev2_packed,
125-
prev_packed,
126-
extended_year - 1,
127-
model,
128-
));
129-
}
130-
let next_packed = self.data.get(delta + 1)?;
131-
let next_ny = IB::mean_synodic_ny(extended_year + 1) + next_packed.ny_offset();
132-
133-
if fixed >= next_ny {
134-
Some(HijriYearInfo::new(
135-
this_packed,
136-
next_packed,
137-
extended_year + 1,
138-
model,
139-
))
101+
if fixed < year.new_year() {
102+
self.get_for_extended_year(extended_year - 1, model)
140103
} else {
141-
Some(HijriYearInfo::new(
142-
prev_packed,
143-
this_packed,
144-
extended_year,
145-
model,
146-
))
104+
let next_year = self.get_for_extended_year(extended_year + 1, model)?;
105+
Some(if fixed < next_year.new_year() {
106+
year
107+
} else {
108+
next_year
109+
})
147110
}
148111
}
149112
}
@@ -195,7 +158,6 @@ impl PackedHijriYearInfo {
195158
let mut all = 0u16; // last byte unused
196159

197160
for (month, length_30) in month_lengths.iter().enumerate() {
198-
#[allow(clippy::indexing_slicing)]
199161
if *length_30 {
200162
all |= 1 << month as u16;
201163
}
@@ -230,15 +192,6 @@ impl PackedHijriYearInfo {
230192
months & (1 << (month - 1) as u16) != 0
231193
}
232194

233-
/// The number of days in a given 1-indexed month
234-
pub(crate) fn days_in_month(self, month: u8) -> u8 {
235-
if self.month_has_30_days(month) {
236-
30
237-
} else {
238-
29
239-
}
240-
}
241-
242195
// Which day of year is the last day of a month (month is 1-indexed)
243196
pub(crate) fn last_day_of_month(self, month: u8) -> u16 {
244197
let months = u16::from_le_bytes([self.0, self.1]);
@@ -251,25 +204,6 @@ impl PackedHijriYearInfo {
251204
prev_month_lengths += long_month_bits.count_ones().try_into().unwrap_or(0);
252205
prev_month_lengths
253206
}
254-
255-
pub(crate) fn days_in_year(self) -> u16 {
256-
self.last_day_of_month(12)
257-
}
258-
259-
pub(crate) fn compute_with_ny<IB: IslamicBased>(
260-
extended_year: i32,
261-
ny: RataDie,
262-
model: IB,
263-
) -> Self {
264-
let month_lengths = model.month_lengths_for_year(extended_year, ny);
265-
let ny_offset = ny - IB::mean_synodic_ny(extended_year);
266-
Self::new(month_lengths, ny_offset)
267-
}
268-
#[cfg(feature = "datagen")]
269-
pub(crate) fn compute<IB: IslamicBased>(extended_year: i32, model: IB) -> Self {
270-
let ny = model.fixed_from_islamic(extended_year, 1, 1);
271-
Self::compute_with_ny(extended_year, ny, model)
272-
}
273207
}
274208

275209
impl AsULE for PackedHijriYearInfo {

0 commit comments

Comments
 (0)