@@ -9,7 +9,7 @@ use std::{cmp, env, process};
99use  crate :: template:: ANSI_BOLD ; 
1010use  crate :: template:: { aoc_cli,  Day ,  ANSI_ITALIC ,  ANSI_RESET } ; 
1111
12- pub  fn  run_part < I :  Clone ,  T :  Display > ( func :  impl  Fn ( I )  -> Option < T > ,  input :  I ,  day :  Day ,  part :  u8 )  { 
12+ pub  fn  run_part < I :  Copy ,  T :  Display > ( func :  impl  Fn ( I )  -> Option < T > ,  input :  I ,  day :  Day ,  part :  u8 )  { 
1313    let  part_str = format ! ( "Part {part}" ) ; 
1414
1515    let  ( result,  duration,  samples)  =
@@ -25,15 +25,13 @@ pub fn run_part<I: Clone, T: Display>(func: impl Fn(I) -> Option<T>, input: I, d
2525/// Run a solution part. The behavior differs depending on whether we are running a release or debug build: 
2626///  1. in debug, the function is executed once. 
2727///  2. in release, the function is benched (approx. 1 second of execution time or 10 samples, whatever take longer.) 
28- fn  run_timed < I :  Clone ,  T > ( 
28+ fn  run_timed < I :  Copy ,  T > ( 
2929    func :  impl  Fn ( I )  -> T , 
3030    input :  I , 
3131    hook :  impl  Fn ( & T ) , 
3232)  -> ( T ,  Duration ,  u128 )  { 
3333    let  timer = Instant :: now ( ) ; 
3434    let  result = { 
35-         let  input = input. clone ( ) ; 
36- 
3735        #[ cfg( feature = "dhat-heap" ) ]  
3836        let  _profiler = dhat:: Profiler :: new_heap ( ) ; 
3937
@@ -52,7 +50,7 @@ fn run_timed<I: Clone, T>(
5250    ( result,  run. 0 ,  run. 1 ) 
5351} 
5452
55- fn  bench < I :  Clone ,  T > ( func :  impl  Fn ( I )  -> T ,  input :  I ,  base_time :  & Duration )  -> ( Duration ,  u128 )  { 
53+ fn  bench < I :  Copy ,  T > ( func :  impl  Fn ( I )  -> T ,  input :  I ,  base_time :  & Duration )  -> ( Duration ,  u128 )  { 
5654    let  mut  stdout = stdout ( ) ; 
5755
5856    print ! ( " > {ANSI_ITALIC}benching{ANSI_RESET}" ) ; 
@@ -64,10 +62,8 @@ fn bench<I: Clone, T>(func: impl Fn(I) -> T, input: I, base_time: &Duration) ->
6462    let  mut  timers:  Vec < Duration >  = vec ! [ ] ; 
6563
6664    for  _ in  0 ..bench_iterations { 
67-         // need a clone here to make the borrow checker happy. 
68-         let  cloned = input. clone ( ) ; 
6965        let  timer = Instant :: now ( ) ; 
70-         black_box ( func ( black_box ( cloned ) ) ) ; 
66+         black_box ( func ( black_box ( input ) ) ) ; 
7167        timers. push ( timer. elapsed ( ) ) ; 
7268    } 
7369
0 commit comments