//Készítette:    Gregorics Tibor
//Dátum:         2009.01.24.
//Feladat:       Halmaz típus

#include "halmaz.h"

using namespace std;

//Feladat: 	    Üres halmaz létrehozása
//Bemenő adatok:int n           - halmazba betehető természetes számok felső korlátja
//Kimenő adatok:vector<bool> v  - halmazt reprezentáló n elemű tömb
//              int db          - halmaz elemszáma
//Tevékenység:	csupa false értékkel tölti fel a halmazt reprezentáló n méretű logikai tömböt (v),
//              és nullázza a darabszámot (db)
Halmaz::Halmaz(int n)
{
    v.resize(n);
    for (int i=0; i<(int)v.size(); i++) v[i] = false;
    db=0;
}

//Feladat: 	    Elemet tesz a halmazba
//Bemenő adatok:int e           - halmazba betehető természetes számok felső korlátja
//Kimenő adatok:vector<bool> v  - halmazt reprezentáló tömb
//              int db          - halmaz elemszáma
//Tevékenység:	Kivételt dob, ha a betenni kívánt elem nagyobb, mint a megadott korlát.
//              Ha ilyen elem már van a halmazban, akkor semmit nem csinál, egyébként v[e]-t true-ra
//              állítja és növeli a darabszámot (db)
void Halmaz::Be(int e)
{
    if (e<0 || e>=(int)v.size()) throw WrongInput;
    if (!v[e]){
        v[e] = true;
        db++;
    }
}

//Feladat: 	    Halmaz számosságának lekérdezése
//Bemenő adatok:int db - reprezentált halmaz elemszáma
//Kimenő adatok:int    - reprezentált halmaz elemszáma (visszatérési érték)
int Halmaz::Darab() const
{
    return db;
}

//Feladat: 	Halmaz elemeinek kiírása egy output folyamba
//Bemenő adatok:Halmaz h - a halmaz
//Kimenő adatok:ostream o- halmazt reprezentáló tömb
//Tevékenység:	Kiirja a halmazt reprezentáló v vektornak minden olyan indexét, ahol a vektor
//              igaz értéket tárol, azaz kiírja a halmaz elemeit
ostream& operator<<(ostream& o, const Halmaz &h)
{
    o << "{";
    for(int i=0; i<(int)h.v.size(); ++i)
        if(h.v[i]) o << " " << i;
    o << " }\n";

    return o;
}
