+#include "vector_io.h"
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+using namespace std;
+
+template<class T>
+void compare_num_data(const string&vector1_file, const string&vector2_file){
+ vector<T>vector1 = load_vector<T>(vector1_file);
+ vector<T>vector2 = load_vector<T>(vector2_file);
+
+ if(vector1.size() < vector2.size()){
+ cout << "\""<< vector1_file<< "\" has only " << vector1.size() << " elements while \""<< vector2_file<< "\" has "<<vector2.size() << ". Can only compare vectors of equal size." << endl;
+ }else if(vector2.size() < vector1.size()){
+ cout << "\""<< vector2_file<< "\" has only " << vector2.size() << " elements while \""<< vector1_file<< "\" has "<<vector1.size() << ". Can only compare vectors of equal size." << endl;
+ }else{
+ unsigned vector1_smaller_count = 0;
+ unsigned vector2_smaller_count = 0;
+
+ unsigned first_difference = (unsigned)-1;
+
+ for(unsigned i=0; i<vector1.size(); ++i){
+ if(vector1[i] < vector2[i])
+ ++vector1_smaller_count;
+ if(vector2[i] < vector1[i])
+ ++vector2_smaller_count;
+ if(vector1[i] != vector2[i] && first_difference == (unsigned)-1)
+ first_difference = i;
+ }
+
+ if(vector1_smaller_count == 0 && vector2_smaller_count == 0){
+ cout << "The vectors are the same and have "<<vector1.size()<<" elements." << endl;
+ }else{
+ cout
+ << "The vectors differ. "
+ << vector1_smaller_count <<" elements are smaller in \""<<vector1_file<<"\". "
+ << vector2_smaller_count <<" elements are smaller in \""<<vector2_file<<"\". "
+ << (vector1.size()-vector1_smaller_count-vector2_smaller_count) <<" elements are the same. "
+ << (vector1_smaller_count+vector2_smaller_count) <<" elements are different. "
+ << "The vectors have "<<vector1.size() <<" elements."
+ << "The first element that differ is at index "<< first_difference << "."
+ << endl
+ ;
+ }
+ }
+
+}
+
+void compare_string_data(const std::string&vector1_file, const std::string&vector2_file){
+ vector<string>vector1 = load_vector<string>(vector1_file);
+ vector<string>vector2 = load_vector<string>(vector2_file);
+
+ if(vector1.size() < vector2.size()){
+ cout << "\""<< vector1_file<< "\" has only " << vector1.size() << " elements while \""<< vector2_file<< "\" has "<<vector2.size() << ". Can only compare vectors of equal size." << endl;
+ }else if(vector2.size() < vector1.size()){
+ cout << "\""<< vector2_file<< "\" has only " << vector2.size() << " elements while \""<< vector1_file<< "\" has "<<vector1.size() << ". Can only compare vectors of equal size." << endl;
+ }else{
+ unsigned equal_count = 0;
+
+ for(unsigned i=0; i<vector1.size(); ++i){
+ if(vector1[i] == vector2[i])
+ ++equal_count;
+ }
+
+ if(equal_count == vector1.size()){
+ cout << "The vectors are the same and have "<<vector1.size()<<" elements." << endl;
+ }else{
+ cout
+ << "The vectors differ. "
+ << equal_count <<" elements are the same. "
+ << vector1.size()-equal_count <<" elements are different. "
+ << "The vectors have "<<vector1.size() <<" elements."
+ << endl
+ ;
+ }
+ }
+
+}
+
+int main(int argc, char*argv[]){
+ try{
+ string vector1_file;
+ string vector2_file;
+ string data_type;
+ if(argc != 4){
+ cerr << "Usage: "<< argv[0] << " type vector1 vector2\n"
+ << "\n"
+ << "Compares two vectors of elements in binary format. data_type can be one of\n"
+ << " * int8\n"
+ << " * uint8\n"
+ << " * int16\n"
+ << " * uint16\n"
+ << " * int32\n"
+ << " * uint32\n"
+ << " * int64\n"
+ << " * uint64\n"
+ << " * float32\n"
+ << " * float64\n"
+ << " * string" << endl;
+ return 1;
+ }else{
+ data_type = argv[1];
+ vector1_file = argv[2];
+ vector2_file = argv[3];
+ }
+
+ if(data_type == "int8")
+ compare_num_data<signed char>(vector1_file, vector2_file);
+ else if(data_type == "uint8")
+ compare_num_data<unsigned char>(vector1_file, vector2_file);
+ else if(data_type == "int16")
+ compare_num_data<signed short>(vector1_file, vector2_file);
+ else if(data_type == "uint16")
+ compare_num_data<unsigned short>(vector1_file, vector2_file);
+ else if(data_type == "int32")
+ compare_num_data<signed int>(vector1_file, vector2_file);
+ else if(data_type == "uint32")
+ compare_num_data<unsigned int>(vector1_file, vector2_file);
+ else if(data_type == "int64")
+ compare_num_data<signed long long>(vector1_file, vector2_file);
+ else if(data_type == "uint64")
+ compare_num_data<unsigned long long>(vector1_file, vector2_file);
+ else if(data_type == "float32")
+ compare_num_data<float>(vector1_file, vector2_file);
+ else if(data_type == "float64")
+ compare_num_data<double>(vector1_file, vector2_file);
+ else if(data_type == "string")
+ compare_string_data(vector1_file, vector2_file);
+ else
+ throw runtime_error("Unknown data type \""+data_type+"\"");
+ }catch(exception&err){
+ cerr << "Stopped on exception : " << err.what() << endl;
+ }
+}