@@ -371,30 +371,13 @@ pub(super) struct Mdf(pub(super) u32);
371371
372372impl Mdf {
373373 #[ inline]
374- fn clamp_month ( month : u32 ) -> u32 {
375- if month > 12 {
376- 0
377- } else {
378- month
379- }
380- }
381-
382- #[ inline]
383- fn clamp_day ( day : u32 ) -> u32 {
384- if day > 31 {
385- 0
386- } else {
387- day
374+ pub ( super ) fn new ( month : u32 , day : u32 , YearFlags ( flags) : YearFlags ) -> Option < Mdf > {
375+ match month <= 12 && day <= 31 {
376+ true => Some ( Mdf ( ( month << 9 ) | ( day << 4 ) | u32:: from ( flags) ) ) ,
377+ false => None ,
388378 }
389379 }
390380
391- #[ inline]
392- pub ( super ) fn new ( month : u32 , day : u32 , YearFlags ( flags) : YearFlags ) -> Mdf {
393- let month = Mdf :: clamp_month ( month) ;
394- let day = Mdf :: clamp_day ( day) ;
395- Mdf ( ( month << 9 ) | ( day << 4 ) | u32:: from ( flags) )
396- }
397-
398381 #[ inline]
399382 pub ( super ) fn from_of ( Of ( of) : Of ) -> Mdf {
400383 let ol = of >> 3 ;
@@ -421,10 +404,13 @@ impl Mdf {
421404 }
422405
423406 #[ inline]
424- pub ( super ) fn with_month ( & self , month : u32 ) -> Mdf {
425- let month = Mdf :: clamp_month ( month) ;
407+ pub ( super ) fn with_month ( & self , month : u32 ) -> Option < Mdf > {
408+ if month > 12 {
409+ return None ;
410+ }
411+
426412 let Mdf ( mdf) = * self ;
427- Mdf ( ( mdf & 0b1_1111_1111 ) | ( month << 9 ) )
413+ Some ( Mdf ( ( mdf & 0b1_1111_1111 ) | ( month << 9 ) ) )
428414 }
429415
430416 #[ inline]
@@ -434,10 +420,13 @@ impl Mdf {
434420 }
435421
436422 #[ inline]
437- pub ( super ) fn with_day ( & self , day : u32 ) -> Mdf {
438- let day = Mdf :: clamp_day ( day) ;
423+ pub ( super ) fn with_day ( & self , day : u32 ) -> Option < Mdf > {
424+ if day > 31 {
425+ return None ;
426+ }
427+
439428 let Mdf ( mdf) = * self ;
440- Mdf ( ( mdf & !0b1_1111_0000 ) | ( day << 4 ) )
429+ Some ( Mdf ( ( mdf & !0b1_1111_0000 ) | ( day << 4 ) ) )
441430 }
442431
443432 #[ inline]
@@ -556,7 +545,12 @@ mod tests {
556545 fn check ( expected : bool , flags : YearFlags , month1 : u32 , day1 : u32 , month2 : u32 , day2 : u32 ) {
557546 for month in range_inclusive ( month1, month2) {
558547 for day in range_inclusive ( day1, day2) {
559- let mdf = Mdf :: new ( month, day, flags) ;
548+ let mdf = match Mdf :: new ( month, day, flags) {
549+ Some ( mdf) => mdf,
550+ None if !expected => continue ,
551+ None => panic ! ( "Mdf::new({}, {}, {:?}) returned None" , month, day, flags) ,
552+ } ;
553+
560554 assert ! (
561555 mdf. valid( ) == expected,
562556 "month {} day {} = {:?} should be {} for dominical year {:?}" ,
@@ -711,7 +705,11 @@ mod tests {
711705 for & flags in FLAGS . iter ( ) {
712706 for month in range_inclusive ( 1u32 , 12 ) {
713707 for day in range_inclusive ( 1u32 , 31 ) {
714- let mdf = Mdf :: new ( month, day, flags) ;
708+ let mdf = match Mdf :: new ( month, day, flags) {
709+ Some ( mdf) => mdf,
710+ None => continue ,
711+ } ;
712+
715713 if mdf. valid ( ) {
716714 assert_eq ! ( mdf. month( ) , month) ;
717715 assert_eq ! ( mdf. day( ) , day) ;
@@ -724,20 +722,28 @@ mod tests {
724722 #[ test]
725723 fn test_mdf_with_fields ( ) {
726724 fn check ( flags : YearFlags , month : u32 , day : u32 ) {
727- let mdf = Mdf :: new ( month, day, flags) ;
725+ let mdf = Mdf :: new ( month, day, flags) . unwrap ( ) ;
728726
729727 for month in range_inclusive ( 0u32 , 16 ) {
730- let mdf = mdf. with_month ( month) ;
731- assert_eq ! ( mdf. valid( ) , Mdf :: new( month, day, flags) . valid( ) ) ;
728+ let mdf = match mdf. with_month ( month) {
729+ Some ( mdf) => mdf,
730+ None if month > 12 => continue ,
731+ None => panic ! ( "failed to create Mdf with month {}" , month) ,
732+ } ;
733+
732734 if mdf. valid ( ) {
733735 assert_eq ! ( mdf. month( ) , month) ;
734736 assert_eq ! ( mdf. day( ) , day) ;
735737 }
736738 }
737739
738740 for day in range_inclusive ( 0u32 , 1024 ) {
739- let mdf = mdf. with_day ( day) ;
740- assert_eq ! ( mdf. valid( ) , Mdf :: new( month, day, flags) . valid( ) ) ;
741+ let mdf = match mdf. with_day ( day) {
742+ Some ( mdf) => mdf,
743+ None if day > 31 => continue ,
744+ None => panic ! ( "failed to create Mdf with month {}" , month) ,
745+ } ;
746+
741747 if mdf. valid ( ) {
742748 assert_eq ! ( mdf. month( ) , month) ;
743749 assert_eq ! ( mdf. day( ) , day) ;
0 commit comments