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