#include "set.hpp"

Set::Set()
{
    data_ = {};
}

Set::~Set()
{
    data_.erase(data_.begin(), data_.end());
}

Set::Set(const Set& s)
{
    data_ = s.data_;
}

Set& Set::operator=(const Set& s)
{
    data_ = s.data_;
    return *this;
}

bool Set::isEmpty() const
{
    return data_.size() == 0;
}

SetData::size_type Set::size() const
{
    return data_.size();
}

void Set::add(int value)
{
    if(!contains(value)) data_.push_back(value);
}

Set Set::operator+(const Set& s) const
{
    Set newSet(s);
    for (unsigned int i = 0; i < data_.size(); ++i)
    {
        if(!newSet.contains(data_[i])) newSet.add(data_[i]);
    }
    return newSet;
}

Set& Set::operator+=(const Set& s)
{
    for(unsigned int i = 0; i < s.size(); ++i)
    {
        if(!contains(s.data_[i])) add(s.data_[i]);
    }
    return *this;
}

bool Set::contains(int value) const
{
    for(unsigned int i = 0; i < size(); ++i)
    {
        if(data_[i] == value) return 1;
    }
    return 0;
}

Set Set::operator-(const Set& s) const
{
    Set newSet;
    for(unsigned int i = 0; i < size(); ++i)
    {
        if(!s.contains(data_[i])) newSet.add(data_[i]);
    }
    return newSet;
}

void Set::remove(int value)
{
    if(contains(value))
    {
        for(unsigned int i = 0; i < size(); ++i)
        {
            if(data_[i] == value) data_.erase(data_.begin() + i);
        }
    }
}

Set& Set::operator-=(const Set& s)
{
    for(int i = size(); i >= 0; i--)
    {
        if(s.contains(data_[i])) remove(data_[i]);
    }
    return *this;
}

const int& Set::operator[](int index) const
{
    return data_[index];
}
