//----------------------------------------------------------------------
//  IMPLEMENTATION FILE (digset.cpp)
//  This module exports a digit set ADT.
//  Set representation: a bit string.
//----------------------------------------------------------------------
#include "digset.h"
#include <iostream.h>
#include <iomanip.h>    // For setw()

// Private members of class:
//    unsigned int bitStr;        Bit string for set
//
// CLASSINV: For all n, (0 <= n <= 9),
//           (bit n of bitStr equals 1) --> integer n is in the set
//
// NOTE: Bits are numbered such that 0 is the rightmost bit

DigitSet::DigitSet()
    //..............................................................
    // Constructor
    // POST: bitStr == 0
    //..............................................................
{
    bitStr = 0;
}

Boolean DigitSet::IsEmpty() const
    //..............................................................
    // POST: FCTVAL == (bitStr == 0)
    //..............................................................
{
    return (bitStr == 0);
}

Boolean DigitSet::IsFull() const
    //..............................................................
    // POST: FCTVAL == FALSE
    //..............................................................
{
    return FALSE;
}

void DigitSet::Insert( /* in */ int someDig )
    //..............................................................
    // POST: Bit in position someDig equals 1
    //..............................................................
{
    bitStr |= (1 << someDig);
}

void DigitSet::Delete( /* in */ int someDig )
    //..............................................................
    // POST: Bit in position someDig equals 0
    //..............................................................
{
    bitStr &= ~(1 << someDig);
}

Boolean DigitSet::IsElt( /* in */ int someDig ) const
    //..............................................................
    // POST: FCTVAL == (Bit in position someDig == 1)
    //..............................................................
{
    return ( (bitStr & (1 << someDig)) > 0 );
}

void DigitSet::Write() const
    //..............................................................
    // POST: Elements of set have been displayed on one line
    //..............................................................
{
    int i;
    for (i = 0; i < 10; i++)
        if ((bitStr & (1 << i)) > 0 )
            cout << setw(2) << i;
}

DigitSet DigitSet::operator*( /* in */ DigitSet set2 ) const
    //..............................................................
    // POST: FCTVAL == new set represented by bit string
    //                 bitStr BITWISE-AND set2.bitStr
    //..............................................................
{
    DigitSet newSet;

    newSet.bitStr = bitStr & set2.bitStr;
    return newSet;
}

DigitSet DigitSet::operator+( /* in */ DigitSet set2 ) const
    //..............................................................
    // POST: FCTVAL == new set represented by bit string
    //                 bitStr BITWISE-OR set2.bitStr
    //..............................................................
{
    DigitSet newSet;

    newSet.bitStr = bitStr | set2.bitStr;
    return newSet;
}


