• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // spreadsort string functor reverse sorting example.
2 //
3 //  Copyright Steven Ross 2009-2014.
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 //    (See accompanying file LICENSE_1_0.txt or copy at
7 //          http://www.boost.org/LICENSE_1_0.txt)
8 
9 //  See http://www.boost.org/libs/sort for library home page.
10 
11 #include <boost/sort/spreadsort/string_sort.hpp>
12 #include <time.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <algorithm>
16 #include <vector>
17 #include <iostream>
18 #include <fstream>
19 #include <string>
20 using std::string;
21 using namespace boost::sort::spreadsort;
22 
23 struct DATA_TYPE {
24     string a;
25     };
26 
27 struct greaterthan {
operator ()greaterthan28   inline bool operator()(const DATA_TYPE &x, const DATA_TYPE &y) const {
29     return x.a > y.a;
30   }
31 };
32 
33 struct bracket {
operator ()bracket34   inline unsigned char operator()(const DATA_TYPE &x, size_t offset) const {
35     return x.a[offset];
36   }
37 };
38 
39 struct getsize {
operator ()getsize40   inline size_t operator()(const DATA_TYPE &x) const{ return x.a.size(); }
41 };
42 
43 //Pass in an argument to test std::sort
main(int argc,const char ** argv)44 int main(int argc, const char ** argv) {
45   std::ifstream indata;
46   std::ofstream outfile;
47   bool stdSort = false;
48   unsigned loopCount = 1;
49   for (int u = 1; u < argc; ++u) {
50     if (std::string(argv[u]) == "-std")
51       stdSort = true;
52     else
53       loopCount = atoi(argv[u]);
54   }
55   double total = 0.0;
56   //Run multiple loops, if requested
57   std::vector<DATA_TYPE> array;
58   for (unsigned u = 0; u < loopCount; ++u) {
59     indata.open("input.txt", std::ios_base::in | std::ios_base::binary);
60     if (!indata) {
61       printf("input.txt could not be opened\n");
62       return 1;
63     }
64     DATA_TYPE inval;
65     indata >> inval.a;
66     while (!indata.eof() ) {
67       array.push_back(inval);
68       //Inserting embedded nulls and empty strings
69       if (!(array.size() % 100)) {
70         if (inval.a.empty() || !(array.size() % 1000)) {
71           inval.a = "";
72           array.push_back(inval);
73         }
74         else {
75           inval.a[0] = '\0';
76           array.push_back(inval);
77         }
78       }
79       indata >> inval.a;
80     }
81 
82     indata.close();
83     clock_t start, end;
84     double elapsed;
85     start = clock();
86     if (stdSort)
87       std::sort(array.begin(), array.end(), greaterthan());
88     else
89       reverse_string_sort(array.begin(), array.end(), bracket(), getsize(),
90                           greaterthan());
91     end = clock();
92     elapsed = static_cast<double>(end - start);
93     if (stdSort)
94       outfile.open("standard_sort_out.txt", std::ios_base::out |
95                    std::ios_base::binary | std::ios_base::trunc);
96     else
97       outfile.open("boost_sort_out.txt", std::ios_base::out |
98                    std::ios_base::binary | std::ios_base::trunc);
99     if (outfile.good()) {
100       for (unsigned u = 0; u < array.size(); ++u)
101         outfile << array[u].a << "\n";
102       outfile.close();
103     }
104     total += elapsed;
105     array.clear();
106   }
107   if (stdSort)
108     printf("std::sort elapsed time %f\n", total / CLOCKS_PER_SEC);
109   else
110     printf("spreadsort elapsed time %f\n", total / CLOCKS_PER_SEC);
111   return 0;
112 }
113