main.cpp
  1  /* ************************************************************************** */
  2  /*                                                                            */
  3  /*                                                        :::      ::::::::   */
  4  /*   main.cpp                                           :+:      :+:    :+:   */
  5  /*                                                    +:+ +:+         +:+     */
  6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
  7  /*                                                +#+#+#+#+#+   +#+           */
  8  /*   Created: 2023/12/31 16:52:54 by gychoi            #+#    #+#             */
  9  /*   Updated: 2024/01/12 17:12:38 by gychoi           ###   ########.fr       */
 10  /*                                                                            */
 11  /* ************************************************************************** */
 12  
 13  #include <ctime>
 14  #include <iostream>
 15  #include <iomanip>
 16  #include "PmergeMe.hpp"
 17  
 18  void	displaySequence(std::vector<int> const& vec, std::string const& str)
 19  {
 20  	std::cout << std::left << std::setw(8) << str + ": ";
 21  	for (std::vector<int>::const_iterator it = vec.begin();
 22  		 it != vec.end(); it++)
 23  	{
 24  		std::cout << " " << *it;
 25  	}
 26  	std::cout << std::right << std::endl;
 27  }
 28  
 29  void	measureSortTime
 30  (struct timespec const& start, struct timespec const& end,
 31   std::string const& container, int len)
 32  {
 33  	double	elapsed;
 34  
 35  	elapsed = (end.tv_sec - start.tv_sec);
 36  	elapsed += (end.tv_nsec - start.tv_nsec) / 1000000000.0;
 37  
 38  	std::cout << "Time to process a range of " << std::setw(3) << len;
 39  	std::cout << " elements with "
 40  			  << std::left << std::setw(16) << std::setfill(' ')
 41  			  << container << " : ";
 42  	std::cout << std::fixed << std::setprecision(5)
 43  			  << std::right << std::setw(8)
 44  			  << elapsed << " us";
 45  	std::cout << std::endl;
 46  }
 47  
 48  void	execute(std::vector<int> const& sequence)
 49  {
 50  	std::deque<int>		dq;
 51  	std::vector<int>	vec;
 52  	struct timespec		vStartTime;
 53  	struct timespec		vEndTime;
 54  	struct timespec		dStartTime;
 55  	struct timespec		dEndTime;
 56  
 57  	clock_gettime(CLOCK_MONOTONIC, &vStartTime);
 58  	vec.assign(sequence.begin(), sequence.end());
 59  	PmergeMe::fordJohnsonSort(vec, vec.size());
 60  	clock_gettime(CLOCK_MONOTONIC, &vEndTime);
 61  
 62  	clock_gettime(CLOCK_MONOTONIC, &dStartTime);
 63  	dq.assign(sequence.begin(), sequence.end());
 64  	PmergeMe::fordJohnsonSort(dq, dq.size());
 65  	clock_gettime(CLOCK_MONOTONIC, &dEndTime);
 66  
 67  	if (!isAllSorted(vec))
 68  	{
 69  		throw std::runtime_error("KO: Vector is not sorted");
 70  	}
 71  	else if (!isAllSorted(dq))
 72  	{
 73  		throw std::runtime_error("KO: Deque is not sorted");
 74  	}
 75  	else
 76  	{
 77  		// OK: great job, gychoi!
 78  	}
 79  
 80  	displaySequence(sequence, "Before");
 81  	displaySequence(vec, "After");
 82  	measureSortTime(vStartTime, vEndTime, "std::vector<int>", vec.size());
 83  	measureSortTime(dStartTime, dEndTime, "std::deque<int>", dq.size());
 84  }
 85  
 86  int	main(int argc, char* argv[])
 87  {
 88  	if (argc < 2)
 89  	{
 90  		std::cout
 91  		<< "Usage: " << argv[0]
 92  		<< " <positive integer sequence>"
 93  		<< std::endl;
 94  		return 1;
 95  	}
 96  	else
 97  	{
 98  		// ready to execute
 99  	}
100  
101  	try
102  	{
103  		PmergeMe::setSequence(argv, argc);
104  		execute(PmergeMe::getSequence());
105  	}
106  	catch (std::exception& e)
107  	{
108  		std::cout << e.what() << std::endl;
109  		return 1;
110  	}
111  	return 0;
112  }
113