@@ -101,7 +101,7 @@ impl Weekday {
101101 /// `w.number_from_monday()`: | 1 | 2 | 3 | 4 | 5 | 6 | 7
102102 #[ inline]
103103 pub const fn number_from_monday ( & self ) -> u32 {
104- self . num_days_from ( Weekday :: Mon ) + 1
104+ self . days_since ( Weekday :: Mon ) + 1
105105 }
106106
107107 /// Returns a day-of-week number starting from Sunday = 1.
@@ -111,7 +111,7 @@ impl Weekday {
111111 /// `w.number_from_sunday()`: | 2 | 3 | 4 | 5 | 6 | 7 | 1
112112 #[ inline]
113113 pub const fn number_from_sunday ( & self ) -> u32 {
114- self . num_days_from ( Weekday :: Sun ) + 1
114+ self . days_since ( Weekday :: Sun ) + 1
115115 }
116116
117117 /// Returns a day-of-week number starting from Monday = 0.
@@ -135,7 +135,7 @@ impl Weekday {
135135 /// ```
136136 #[ inline]
137137 pub const fn num_days_from_monday ( & self ) -> u32 {
138- self . num_days_from ( Weekday :: Mon )
138+ self . days_since ( Weekday :: Mon )
139139 }
140140
141141 /// Returns a day-of-week number starting from Sunday = 0.
@@ -145,17 +145,27 @@ impl Weekday {
145145 /// `w.num_days_from_sunday()`: | 1 | 2 | 3 | 4 | 5 | 6 | 0
146146 #[ inline]
147147 pub const fn num_days_from_sunday ( & self ) -> u32 {
148- self . num_days_from ( Weekday :: Sun )
148+ self . days_since ( Weekday :: Sun )
149149 }
150150
151- /// Returns a day-of-week number starting from the parameter ` day` (D) = 0 .
151+ /// The number of days since the given day.
152152 ///
153- /// `w`: | `D` | `D+1` | `D+2` | `D+3` | `D+4` | `D+5` | `D+6`
154- /// --------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | -----
155- /// `w.num_days_from(wd)`: | 0 | 1 | 2 | 3 | 4 | 5 | 6
156- #[ inline]
157- pub ( crate ) const fn num_days_from ( & self , day : Weekday ) -> u32 {
158- ( * self as u32 + 7 - day as u32 ) % 7
153+ /// # Examples
154+ ///
155+ /// ```
156+ /// use chrono::Weekday::*;
157+ /// assert_eq!(Mon.days_since(Mon), 0);
158+ /// assert_eq!(Sun.days_since(Tue), 5);
159+ /// assert_eq!(Wed.days_since(Sun), 3);
160+ /// ```
161+ pub const fn days_since ( & self , other : Weekday ) -> u32 {
162+ let lhs = * self as u32 ;
163+ let rhs = other as u32 ;
164+ if lhs < rhs {
165+ 7 + lhs - rhs
166+ } else {
167+ lhs - rhs
168+ }
159169 }
160170}
161171
@@ -296,34 +306,28 @@ mod tests {
296306 use super :: Weekday ;
297307
298308 #[ test]
299- fn test_num_days_from ( ) {
309+ fn test_days_since ( ) {
300310 for i in 0 ..7 {
301311 let base_day = Weekday :: try_from ( i) . unwrap ( ) ;
302312
303- assert_eq ! ( base_day. num_days_from_monday( ) , base_day. num_days_from( Weekday :: Mon ) ) ;
304- assert_eq ! ( base_day. num_days_from_sunday( ) , base_day. num_days_from( Weekday :: Sun ) ) ;
305-
306- assert_eq ! ( base_day. num_days_from( base_day) , 0 ) ;
307-
308- assert_eq ! ( base_day. num_days_from( base_day. pred( ) ) , 1 ) ;
309- assert_eq ! ( base_day. num_days_from( base_day. pred( ) . pred( ) ) , 2 ) ;
310- assert_eq ! ( base_day. num_days_from( base_day. pred( ) . pred( ) . pred( ) ) , 3 ) ;
311- assert_eq ! ( base_day. num_days_from( base_day. pred( ) . pred( ) . pred( ) . pred( ) ) , 4 ) ;
312- assert_eq ! ( base_day. num_days_from( base_day. pred( ) . pred( ) . pred( ) . pred( ) . pred( ) ) , 5 ) ;
313- assert_eq ! (
314- base_day. num_days_from( base_day. pred( ) . pred( ) . pred( ) . pred( ) . pred( ) . pred( ) ) ,
315- 6
316- ) ;
317-
318- assert_eq ! ( base_day. num_days_from( base_day. succ( ) ) , 6 ) ;
319- assert_eq ! ( base_day. num_days_from( base_day. succ( ) . succ( ) ) , 5 ) ;
320- assert_eq ! ( base_day. num_days_from( base_day. succ( ) . succ( ) . succ( ) ) , 4 ) ;
321- assert_eq ! ( base_day. num_days_from( base_day. succ( ) . succ( ) . succ( ) . succ( ) ) , 3 ) ;
322- assert_eq ! ( base_day. num_days_from( base_day. succ( ) . succ( ) . succ( ) . succ( ) . succ( ) ) , 2 ) ;
323- assert_eq ! (
324- base_day. num_days_from( base_day. succ( ) . succ( ) . succ( ) . succ( ) . succ( ) . succ( ) ) ,
325- 1
326- ) ;
313+ assert_eq ! ( base_day. num_days_from_monday( ) , base_day. days_since( Weekday :: Mon ) ) ;
314+ assert_eq ! ( base_day. num_days_from_sunday( ) , base_day. days_since( Weekday :: Sun ) ) ;
315+
316+ assert_eq ! ( base_day. days_since( base_day) , 0 ) ;
317+
318+ assert_eq ! ( base_day. days_since( base_day. pred( ) ) , 1 ) ;
319+ assert_eq ! ( base_day. days_since( base_day. pred( ) . pred( ) ) , 2 ) ;
320+ assert_eq ! ( base_day. days_since( base_day. pred( ) . pred( ) . pred( ) ) , 3 ) ;
321+ assert_eq ! ( base_day. days_since( base_day. pred( ) . pred( ) . pred( ) . pred( ) ) , 4 ) ;
322+ assert_eq ! ( base_day. days_since( base_day. pred( ) . pred( ) . pred( ) . pred( ) . pred( ) ) , 5 ) ;
323+ assert_eq ! ( base_day. days_since( base_day. pred( ) . pred( ) . pred( ) . pred( ) . pred( ) . pred( ) ) , 6 ) ;
324+
325+ assert_eq ! ( base_day. days_since( base_day. succ( ) ) , 6 ) ;
326+ assert_eq ! ( base_day. days_since( base_day. succ( ) . succ( ) ) , 5 ) ;
327+ assert_eq ! ( base_day. days_since( base_day. succ( ) . succ( ) . succ( ) ) , 4 ) ;
328+ assert_eq ! ( base_day. days_since( base_day. succ( ) . succ( ) . succ( ) . succ( ) ) , 3 ) ;
329+ assert_eq ! ( base_day. days_since( base_day. succ( ) . succ( ) . succ( ) . succ( ) . succ( ) ) , 2 ) ;
330+ assert_eq ! ( base_day. days_since( base_day. succ( ) . succ( ) . succ( ) . succ( ) . succ( ) . succ( ) ) , 1 ) ;
327331 }
328332 }
329333
0 commit comments