From ae40df13830b25503d6159fca548fbcc6d26a288 Mon Sep 17 00:00:00 2001 From: Malte Thiesen Date: Mon, 16 Apr 2018 18:43:32 +0200 Subject: [PATCH] Implement Clone trait for enum iterators. (#18) --- strum_macros/src/enum_iter.rs | 9 +++++++++ strum_tests/tests/enum_iter.rs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/strum_macros/src/enum_iter.rs b/strum_macros/src/enum_iter.rs index 3fc6db59..1e4fd7ca 100644 --- a/strum_macros/src/enum_iter.rs +++ b/strum_macros/src/enum_iter.rs @@ -108,5 +108,14 @@ pub fn enum_iter_inner(ast: &syn::DeriveInput) -> quote::Tokens { self.size_hint().0 } } + + impl #impl_generics Clone for #iter_name #ty_generics #where_clause { + fn clone(&self) -> #iter_name #ty_generics { + #iter_name { + idx: self.idx, + marker: self.marker.clone(), + } + } + } } } diff --git a/strum_tests/tests/enum_iter.rs b/strum_tests/tests/enum_iter.rs index 63df5788..bd66b3bd 100644 --- a/strum_tests/tests/enum_iter.rs +++ b/strum_tests/tests/enum_iter.rs @@ -60,3 +60,37 @@ fn len_test() { assert_eq!(0, i.len()); } + +#[test] +fn clone_test() { + let mut i = Week::iter(); + i.next(); + i.next(); + + let mut i_cloned = i.clone(); + + assert_eq!(Some(Week::Tuesday), i.next()); + assert_eq!(Some(Week::Tuesday), i_cloned.next()); + + i.next(); + i.next(); + + assert_eq!(Some(Week::Friday), i.next()); + assert_eq!(Some(Week::Wednesday), i_cloned.next()); +} + +#[test] +fn cycle_test() { + let results = Week::iter().cycle().take(10).collect::>(); + let expected = vec![Week::Sunday, + Week::Monday, + Week::Tuesday, + Week::Wednesday, + Week::Thursday, + Week::Friday, + Week::Saturday, + Week::Sunday, + Week::Monday, + Week::Tuesday]; + assert_eq!(expected, results); +}