#ifndef PILE_H_
#define PILE_H_

#include <iostream>
using namespace std;

#include <string>
#include <stdlib.h>
#include "Mem.h"

struct Pile
{
	int* o;		// Table de mot.
	int n;		// Nombre d'int empilés
	int t;		// Nombre maximum avant réallocation.
	
	Pile(int x){n=0; t=x; o=Mem::Malloc(t);}
	Pile(){n=0;t=0;o=NULL;}	                        
	Pile(const Pile &);	                            // Constructeur de recopie;
	~Pile(){if (o) Mem::Free(o,t);}
	
	friend ostream & operator <<(ostream & f,Pile A){return A.put(f);}
	friend istream & operator >>(istream & f,Pile &A){return A.get(f);}
	ostream & put(ostream & f);							// Affiche la Pile, exemple : (15 5623 102 456805)
	istream & get(istream & f);							// Lit la Pile, exemple : (15 5623 102 456805)
	void Rand(int tmax);								// Génère un ensemble au hasard de taille <= tmax
	void Rand();										// Génère un ensemble au hasard de taille inchangée.
	void Muer(int y);									// Change la taille t à y.
	void Empile(int);			  						// Empile un mot
	int Depile();              							// Depile un mot
	Pile & operator = (const Pile & A);
	bool operator==(const Pile & A);
	
	int & operator[](int i){int & r = o[i];return r;}

	
	int Index(int x);       	// Index de x dans la pile.
	void Supp(int x);     		// Supprime l'entier x de la pile
	void TriA();                // Trie la pile.
	void TriAD();               // Trie la pile en enlevant les doublons.
	void TriAP();               // Trie la pile en enlevant les paires.
	void SuppDoublon();   		// Supprime les doublons consecutifs.
	void SuppPaire();     	    // Supprime les paires d'éléments égaux consécutifs.
	void Qsort();				// Trie la pile.
	void * Bsearch(const void * cl);	//
	int PointeurToIndex(int* p){return((int)p - (int)o)/sizeof(int);}
	static int Cmp (const void* a, const void *b){return (*(int*)a < *(int*)b )?-1:((*(int*)a == *(int*)b )?0:1);}
	

	static void Test(int);
	static void TestRand();	
	static void TestRandT();
	static void TestMuer();
	static void TestEgale();
	static void TestCopy();
	static void TestEmpile();
	static void TestDepile();
	static void TestIndex();
	static void TestSupp();
	static void TestSuppDoublon();
	static void TestSuppPaire();
	static void TestTriA();
	static void TestTriAD();
	static void TestTriAP();
	
	static void Synopsis();
};

#endif
