//----------------------------------------------------------------------
//  IMPLEMENTATION FILE (dealer.cpp)
//  This module exports CardValType, SuitType, and CardDeckType
//  to randomly deal playing cards.
//  Machine dependency: long ints must be at least 32 bits (4 bytes).
//----------------------------------------------------------------------
#include "newdeal.h"

// Private members of class:
//     RandGen  cardGen
//     int      cardsRemaining
//     CardType card[52]           
//
// CLASSINV: card[0..cardsRemaining-1] contain the undealt portion
//           of the deck

CardDeckType::CardDeckType( /* in */ long initSeed ) : cardGen(initSeed)
    //..................................................................
    // Constructor
    // PRE:  initSeed >= 1
    // POST: initSeed has been passed to cardGen constructor
    //    && The deck has been shuffled
    //..................................................................
{
    ShuffleDeck();
}

void CardDeckType::ShuffleDeck()
    //..................................................................
    // POST: cardsRemaining == 52
    //    && For all i, (0<=i<=51), card[i] = is a unique card from the 
    //           deck
    //..................................................................
{
    int i = 0;

    for (int s = clubs; s <= spades; s++)
        for (int r = two; r <= ace; r++)
            {
            card[i]._suit = SuitType (s);
            card[i++]._rank = CardValType (r);
            }
    cardsRemaining = 52;
}

CardType CardDeckType::DealACard()
    //..................................................................
    // PRE:  cardsRemaining >= 1
    // POST: Some card[r] has been chosen at random from
    //       card[0..cardsRemaining-1]
    //    && FCTVAL == card[r]
    //    && card[r] has been "removed" by swapping it
    //       with card[cardsRemaining-1]
    //    && cardsRemaining == cardsRemaining - 1
    //..................................................................
{
    int randNo;
    CardType temp;

    randNo = int( cardGen.NextRand()*float(cardsRemaining) );

    temp = card[randNo];
    card[randNo] = card[cardsRemaining-1];
    card[cardsRemaining-1] = temp;

    cardsRemaining--;
    return (temp);
}

int CardDeckType::CardsInDeck() const
    //..................................................................
    // POST: FCTVAL == cardsRemaining
    //..................................................................
{
    return cardsRemaining;
}