/*
 *	Autor: Michal Krotewicz    		              
 *	M.Krotewicz@stud.elka.pw.edu.pl      	       		
 *	Temat: Biblioteka STL 
 *		   opis algorytmu mismatch	   
 *
 *	Mismatch nalezy do algorytmow niemodyfikujacych.
 *
 *	template <class IteratorWejsciowy1, class IteratorWejsciowy2>
 *	pair<IteratorWejsciwoy1, IteratorWejsciowy2>
 *  mismatch(IteratorWejsciowy1 pierwszy1, IteratorWejsciowy2 ostatni1, IteratorWejsciowy2 pierwszy2);
 *
 *		Algorytm mismatch porównuje wzamjemnie dwa ciągi, szukając pierwszej pary niezgodnych elementow.
 *
 *	template <class IteratorWejsciowy1, class IteratorWejsciowy2, class PredykatDwuargumentowy>
 *	pair<IteratorWejsciwoy1, IteratorWejsciowy2>
 *  mismatch(IteratorWejsciowy1 pierwszy1, IteratorWejsciowy2 ostatni1, IteratorWejsciowy2 pierwszy2,
 *			 PredykatDwuargumentowy pred_dwuargumentowy);
 * 
 *		Algorytm mismatch z predyktem porownuje wzajemnie dwa ciagi, szukajac pary niezgodnej z predyktem.
 *
*/

#include <algorithm>
#include <vector>
#include <list>
#include <iostream>

using namespace std;

class rowne_parzyste{
public:
	bool operator ()(int ciag1, int ciag2){			//peiwrszy predytkt
		//czy obie wartości są rowne i parzyste
		return ( ciag1 == ciag2 || ciag1%2 ==0) ? true : false;
	}
};


bool nierowne_nieparzyste(int ciag1, int ciag2){	//drugi predykt
	return ( ciag1 != ciag2 || (ciag1%2==1 && ciag2%2==1)) ? true : false;
}

int main(){

	//Zastosowanie mismatch bez predytktu do spełnienia.
	vector <int> wektor1;
	list <int> lista1;

	for(int i=0; i<7 ; i++) wektor1.push_back(i);	//wektor1 [0,1,2,  3,4,5,6]
	for(int i=0; i<8; i++){							//lista1  [0,1,2,982,4,5,6,7]
		if(i==4) 
			lista1.push_back(982); 
		else 
			lista1.push_back(i);
	}

	pair<vector<int>::iterator, list<int>::iterator> para_WektorLista;
	para_WektorLista = mismatch(wektor1.begin(), wektor1.end(), lista1.begin());	//znajduje pary nierówne
	cout<<"Niezgodna para dla wektora1 i listy1: ( "<<*para_WektorLista.first<<", "<<*para_WektorLista.second<<")"<<endl;
	

	//Zastosowanie mismatch z predytktem.
	int tablica1[] = {1,2,3,4,67,6,7,8,9,10};
	int tablica2[] = {1,2,3,4, 5,6,7,8,9,10,11,12};

	int rozmiar_tablicy1= sizeof(tablica1)/sizeof(int);
	int rozmiar_tablicy2= sizeof(tablica2)/sizeof(int);

	pair<int*,int*> para_tablica;
	//zastsowanie mismatch z pierwszym predyktem
	para_tablica = mismatch(tablica1, tablica1+rozmiar_tablicy1, tablica2, rowne_parzyste()); //znajduje pary, ktore nie spelniaja predyktu
	cout<<"Nierowna i nieparzysta para dla tablicy1 i tablicy2: ( "<<*para_tablica.first<<", "<<*para_tablica.second<<")"<<endl;

	//zastosowanie mismatch z drugi predyktem
	para_tablica = mismatch(tablica1, tablica1+rozmiar_tablicy1, tablica2, nierowne_nieparzyste); //znajduje pary, ktore nie spelniaja predyktu
	cout<<"Rowna i parzysta para dla tablicy1 i tablicy2: ( "<<*para_tablica.first<<", "<<*para_tablica.second<<")"<<endl;

	return 0;
}
