Ejemplo n.º 1
0
int main(int argc, char* argv[])
{
	//auto t1 = chrono::high_resolution_clock::now();

	if (argc < 5)
	{
		std::cout << "Not enough parameter !!";
		return 0;
	}

	string pred;
	string dist;
	string pt_file_name;
	string poly_file_name;
	string out_file_name;
	string nthd;
	string out_op;

	int n_thread;
	const string log_file_name = "geofence.log";

	if (argc == 5)
	{
		pred.assign(argv[1]);
		dist = "";
		pt_file_name.assign(argv[2]);
		poly_file_name.assign(argv[3]);
		out_file_name.assign(argv[4]);
		
		//get the number of cores of the CPU
		n_thread = std::thread::hardware_concurrency();
	}

	if (argc == 6)
	{
		pred.assign(argv[1]);
		dist.assign(argv[2]);
		pt_file_name.assign(argv[3]);
		poly_file_name.assign(argv[4]);
		out_file_name.assign(argv[5]);

		n_thread = std::thread::hardware_concurrency();
	}

	Predicate* p = new Predicate(pred,dist);
	//validate predicate
	if (! p->Validate_Argv()) 
	{
		std::cout << "Illigal predicate string, please double Check !!";
		delete p;
		p = NULL;
		return 0;
	}

	try
	{
		//create utilities
		Output_unord out_set(out_file_name);
		Polygon_File PF(p);
		Polygon_Reader poly_gr(poly_file_name);
		Point_Factory pt_f;
		Text_File_Reader txt_reader(pt_file_name);

		//build up index
		poly_gr.Build_Polygon_Index(PF);

		txt_reader.Open_file();

		//multi-thread part
		vector<std::thread> threads;

		Point_Processor pt_proc(out_set,txt_reader,pt_f,PF);

		for(int i = 0; i < n_thread; ++i){
			threads.push_back(thread(pt_proc));
		}

		//wait until finish
		for(int i = 0; i < n_thread; ++i){
			threads[i].join();
		}

		auto t3 = chrono::high_resolution_clock::now();

		txt_reader.Close_file();
		out_set.Write_to_File();

	/*
		//write log
		ostringstream contents;
		contents << pt_file_name << " "<<poly_file_name<< " "<< pred << " "<<dist<<endl; //<< " Result: " <<out_set.Get_Rec_Num() << " records. \n";		 
		contents<< "Time elapsed: " << chrono::duration_cast<chrono::milliseconds>(t3-t1).count() << " milliseconds\n";

		Logger log(log_file_name);
		log.Write_Out(contents.str());

		//write to console
		std::cout<<contents.str(); 

	*/
		std::cout << "Done !";

		return 0;
	}
	catch (runtime_error &re)
	{
		std::cout<< re.what();
		return 0;
	}
}