add readme
[Praktika/Routenplanung/cpp-base.git] / compare_vector.cpp
1 #include "vector_io.h"
2 #include <vector>
3 #include <iostream>
4 #include <stdexcept>
5 using namespace std;
6
7 template<class T>
8 void compare_num_data(const string&vector1_file, const string&vector2_file){
9         vector<T>vector1 = load_vector<T>(vector1_file);
10         vector<T>vector2 = load_vector<T>(vector2_file);
11
12         if(vector1.size() < vector2.size()){
13                 cout << "\""<< vector1_file<< "\" has only " << vector1.size() << " elements while \""<< vector2_file<< "\" has "<<vector2.size() << ". Can only compare vectors of equal size." << endl;
14         }else if(vector2.size() < vector1.size()){
15                 cout << "\""<< vector2_file<< "\" has only " << vector2.size() << " elements while \""<< vector1_file<< "\" has "<<vector1.size() << ". Can only compare vectors of equal size." << endl;
16         }else{
17                 unsigned vector1_smaller_count = 0;
18                 unsigned vector2_smaller_count = 0;
19
20                 unsigned first_difference = (unsigned)-1;
21
22                 for(unsigned i=0; i<vector1.size(); ++i){
23                         if(vector1[i] < vector2[i])
24                                 ++vector1_smaller_count;
25                         if(vector2[i] < vector1[i])
26                                 ++vector2_smaller_count;
27                         if(vector1[i] != vector2[i] && first_difference == (unsigned)-1)
28                                 first_difference = i;
29                 }
30
31                 if(vector1_smaller_count == 0 && vector2_smaller_count == 0){
32                         cout << "The vectors are the same and have "<<vector1.size()<<" elements." << endl;
33                 }else{
34                         cout 
35                                 << "The vectors differ. "
36                                 << vector1_smaller_count <<" elements are smaller in \""<<vector1_file<<"\". " 
37                                 << vector2_smaller_count <<" elements are smaller in \""<<vector2_file<<"\". "
38                                 << (vector1.size()-vector1_smaller_count-vector2_smaller_count) <<" elements are the same. "
39                                 << (vector1_smaller_count+vector2_smaller_count) <<" elements are different. "
40                                 << "The vectors have "<<vector1.size() <<" elements."
41                                 << "The first element that differ is at index "<< first_difference << "."
42                                 << endl
43                         ;
44                 }
45         }
46
47 }
48
49 void compare_string_data(const std::string&vector1_file, const std::string&vector2_file){
50         vector<string>vector1 = load_vector<string>(vector1_file);
51         vector<string>vector2 = load_vector<string>(vector2_file);
52
53         if(vector1.size() < vector2.size()){
54                 cout << "\""<< vector1_file<< "\" has only " << vector1.size() << " elements while \""<< vector2_file<< "\" has "<<vector2.size() << ". Can only compare vectors of equal size." << endl;
55         }else if(vector2.size() < vector1.size()){
56                 cout << "\""<< vector2_file<< "\" has only " << vector2.size() << " elements while \""<< vector1_file<< "\" has "<<vector1.size() << ". Can only compare vectors of equal size." << endl;
57         }else{
58                 unsigned equal_count = 0;
59
60                 for(unsigned i=0; i<vector1.size(); ++i){
61                         if(vector1[i] == vector2[i])
62                                 ++equal_count;
63                 }
64
65                 if(equal_count == vector1.size()){
66                         cout << "The vectors are the same and have "<<vector1.size()<<" elements." << endl;
67                 }else{
68                         cout 
69                                 << "The vectors differ. "
70                                 << equal_count <<" elements are the same. "
71                                 << vector1.size()-equal_count <<" elements are different. "
72                                 << "The vectors have "<<vector1.size() <<" elements."
73                                 << endl
74                         ;
75                 }
76         }
77
78 }
79
80 int main(int argc, char*argv[]){
81         try{
82                 string vector1_file;
83                 string vector2_file;
84                 string data_type;
85                 if(argc != 4){
86                         cerr << "Usage: "<< argv[0] << " type vector1 vector2\n"
87                                 << "\n"
88                                 << "Compares two vectors of elements in binary format. data_type can be one of\n"
89                                 << " * int8\n"
90                                 << " * uint8\n"
91                                 << " * int16\n"
92                                 << " * uint16\n"
93                                 << " * int32\n"
94                                 << " * uint32\n"
95                                 << " * int64\n"
96                                 << " * uint64\n"
97                                 << " * float32\n"
98                                 << " * float64\n"
99                                 << " * string" << endl;
100                         return 1;
101                 }else{
102                         data_type = argv[1];
103                         vector1_file = argv[2];
104                         vector2_file = argv[3];
105                 }
106
107                 if(data_type == "int8")
108                         compare_num_data<signed char>(vector1_file, vector2_file);
109                 else if(data_type == "uint8")
110                         compare_num_data<unsigned char>(vector1_file, vector2_file);
111                 else if(data_type == "int16")
112                         compare_num_data<signed short>(vector1_file, vector2_file);
113                 else if(data_type == "uint16")
114                         compare_num_data<unsigned short>(vector1_file, vector2_file);
115                 else if(data_type == "int32")
116                         compare_num_data<signed int>(vector1_file, vector2_file);
117                 else if(data_type == "uint32")
118                         compare_num_data<unsigned int>(vector1_file, vector2_file);
119                 else if(data_type == "int64")
120                         compare_num_data<signed long long>(vector1_file, vector2_file);
121                 else if(data_type == "uint64")
122                         compare_num_data<unsigned long long>(vector1_file, vector2_file);
123                 else if(data_type == "float32")
124                         compare_num_data<float>(vector1_file, vector2_file);
125                 else if(data_type == "float64")
126                         compare_num_data<double>(vector1_file, vector2_file);
127                 else if(data_type == "string")
128                         compare_string_data(vector1_file, vector2_file);
129                 else
130                         throw runtime_error("Unknown data type \""+data_type+"\"");
131         }catch(exception&err){
132                 cerr << "Stopped on exception : " << err.what() << endl;
133         }
134 }