@@ -29,6 +29,7 @@ namespace xcpp
2929        {
3030            std::string out = Cpp::EndStdStreamCapture ();
3131            err = Cpp::EndStdStreamCapture ();
32+             std::cout << out;
3233        }
3334    };
3435
@@ -163,34 +164,43 @@ namespace xcpp
163164
164165        try 
165166        {
166-             if  (number == 0 )
167-             {
168-                 for  (std::size_t  n = 0 ; n < 10 ; ++n)
169-                 {
170-                     number = std::pow (10 , n);
171-                     std::string timeit_code = inner (number, code, exec_counter);
172-                     std::ostringstream buffer_out, buffer_err;
173-                     std::streambuf* old_cout = std::cout.rdbuf (buffer_out.rdbuf ());
174-                     std::streambuf* old_cerr = std::cerr.rdbuf (buffer_err.rdbuf ());
175-                     StreamRedirectRAII R (err);
176-                     auto  res_ptr = Cpp::Evaluate (timeit_code.c_str (), &hadError);
177-                     std::cout.rdbuf (old_cout);
178-                     std::cerr.rdbuf (old_cerr);
179-                     output = std::to_string (res_ptr);
180-                     err += buffer_err.str ();
181-                     double  elapsed_time = std::stod (output) * 1e-6 ;
182-                     if  (elapsed_time >= 0.2 )
183-                     {
184-                         break ;
185-                     }
186-                 }
187-             }
167+             StreamRedirectRAII R (err);
168+             std::ostringstream buffer_out, buffer_err;
169+             std::streambuf* old_cout = std::cout.rdbuf (buffer_out.rdbuf ());
170+             std::streambuf* old_cerr = std::cerr.rdbuf (buffer_err.rdbuf ());
171+             compilation_result = Cpp::Declare (code.c_str ());
172+             std::cout.rdbuf (old_cout);
173+             std::cerr.rdbuf (old_cerr);
174+         }
175+         catch  (std::exception& e)
176+         {
177+             errorlevel = 1 ;
178+             ename = " Standard Exception: " 
179+             evalue = e.what ();
180+             return ;
181+         }
182+         catch  (...)
183+         {
184+             errorlevel = 1 ;
185+             ename = " Error: " 
186+             return ;
187+         }
188+ 
189+         if  (compilation_result)
190+         {
191+             errorlevel = 1 ;
192+             ename = " Error: " 
193+             evalue = " Compilation error! " 
194+             std::cerr << err;
195+             return ;
196+         }
188197
189-             std::vector< double > all_runs; 
190-              double  mean =  0 ; 
191-              double  stdev =  0 ; 
192-             for  (std::size_t  r  = 0 ; r  < static_cast <std:: size_t >(repeat) ; ++r )
198+ 
199+         if  (number ==  0 ) 
200+         { 
201+             for  (std::size_t  n  = 0 ; n  < 10 ; ++n )
193202            {
203+                 number = std::pow (10 , n);
194204                std::string timeit_code = inner (number, code, exec_counter);
195205                std::ostringstream buffer_out, buffer_err;
196206                std::streambuf* old_cout = std::cout.rdbuf (buffer_out.rdbuf ());
@@ -202,41 +212,41 @@ namespace xcpp
202212                output = std::to_string (res_ptr);
203213                err += buffer_err.str ();
204214                double  elapsed_time = std::stod (output) * 1e-6 ;
205-                 all_runs.push_back (elapsed_time / number);
206-                 mean += all_runs.back ();
207-             }
208-             mean /= repeat;
209-             for  (std::size_t  r = 0 ; r < static_cast <std::size_t >(repeat); ++r)
210-             {
211-                 stdev += (all_runs[r] - mean) * (all_runs[r] - mean);
215+                 if  (elapsed_time >= 0.2 )
216+                 {
217+                     break ;
218+                 }
212219            }
213-             stdev = std::sqrt (stdev / repeat);
214- 
215-             std::cout << _format_time (mean, precision) << "  +- " _format_time (stdev, precision);
216-             std::cout << "  per loop (mean +- std. dev. of " "  run" 
217-                       << ((repeat == 1 ) ? " , " " s " 
218-             std::cout << number << "  loop" 1 ) ? " " " s" "  each)" 
219220        }
220-         catch  (std::exception& e)
221+ 
222+         std::vector<double > all_runs;
223+         double  mean = 0 ;
224+         double  stdev = 0 ;
225+         for  (std::size_t  r = 0 ; r < static_cast <std::size_t >(repeat); ++r)
221226        {
222-             errorlevel = 1 ;
223-             ename = " Standard Exception: " 
224-             evalue = e.what ();
227+             std::string timeit_code = inner (number, code, exec_counter);
228+             std::ostringstream buffer_out, buffer_err;
229+             std::streambuf* old_cout = std::cout.rdbuf (buffer_out.rdbuf ());
230+             std::streambuf* old_cerr = std::cerr.rdbuf (buffer_err.rdbuf ());
231+             StreamRedirectRAII R (err);
232+             auto  res_ptr = Cpp::Evaluate (timeit_code.c_str (), &hadError);
233+             std::cout.rdbuf (old_cout);
234+             std::cerr.rdbuf (old_cerr);
235+             output = std::to_string (res_ptr);
236+             err += buffer_err.str ();
237+             double  elapsed_time = std::stod (output) * 1e-6 ;
238+             all_runs.push_back (elapsed_time / number);
239+             mean += all_runs.back ();
225240        }
226-         catch  (...)
241+         mean /= repeat;
242+         for  (std::size_t  r = 0 ; r < static_cast <std::size_t >(repeat); ++r)
227243        {
228-             errorlevel = 1 ;
229-             ename = " Error: " 
244+             stdev += (all_runs[r] - mean) * (all_runs[r] - mean);
230245        }
246+         stdev = std::sqrt (stdev / repeat);
231247
232-         if  (hadError)
233-         {
234-             errorlevel = 1 ;
235-             ename = " Error: " 
236-             evalue = " Compilation error! " 
237-             std::cerr << err;
238-             std::cerr << " Error: " 
239-             std::cerr << " Error: " 
240-         }
248+         std::cout << _format_time (mean, precision) << "  +- " _format_time (stdev, precision);
249+         std::cout << "  per loop (mean +- std. dev. of " "  run" 1 ) ? " , " " s " 
250+         std::cout << number << "  loop" 1 ) ? " " " s" "  each)" 
241251    }
242252}
0 commit comments