
#include "Set.h"


template <class Object>
bool Set<Object>::isEmpty( ) const
{
    return getSize( ) == 0;
}


template <class Object>
int Set<Object>::getSize( ) const
{
    return items.size( );
}


template <class Object>
void Set<Object>::print( ostream & out ) const
{
    if( isEmpty( ) )
        out << "Empty set";
    else
    {
        out << "{ " << items[ 0 ];
        for( int i = 1; i < items.size( ); i++ )
            out << ", " << items[ i ];
        out << " }";
    }
}

   
template <class Object>
int Set<Object>::findPos( const Object & x ) const
{
    for( int i = 0; i < items.size( ); i++ )
        if( items[ i ] == x )
            return i;

    return NOT_FOUND;
}

template <class Object>
bool Set<Object>::contains( const Object & x ) const
{
    return findPos( x ) != NOT_FOUND;
}


template <class Object>
void Set<Object>::insert( const Object & x )
{
    if( !contains( x ) )
        items.push_back( x );
}


template <class Object>
void Set<Object>::remove( const Object & x )
{
    int loc = findPos( x );

    if( loc != NOT_FOUND )
    {
        items[ loc ] = items.back( );
        items.pop_back( );
    }
}


template <class Object>
void Set<Object>::makeEmpty( )
{
    items.resize( 0 );
}

template <class Object>
Set<Object> Set<Object>::setUnion( const Set<Object> & rhs ) const
{
    Set<Object> result = *this;

    for( int i = 0; i < rhs.items.size( ); i++ )
        result.insert( rhs.items[ i ] );

    return result;
}


template <class Object>
Set<Object> Set<Object>::intersect( const Set<Object> & rhs ) const
{
    Set<Object> result;

    for( int i = 0; i < items.size( ); i++ )
        if( rhs.contains( items[ i ] ) )
            result.insert( items[ i ] );

    return result;
}


            
