Example Using the Essential Tools Module with the C++ Standard Library

The following example is a complete program that creates a deck of cards and shuffles it. The purpose of the example is to show how the Essential Tools Module template collections can be used in conjunction with the C++ Standard Library. See your C++ Standard Library documentation for more information on the features used in the example.

 

/* Note: This example requires the C++ Standard Library */

#include <iostream>

#include <algorithm>

#include <rw/tvordvec.h>

 

struct Card

{

char rank_;

char suit_;

Card (char r, char s) : rank_ (r), suit_ (s) { }

Card (const Card& ref) : rank_ (ref.rank_), suit_ (ref.suit_) { }

 

bool operator== (const Card& ref) const {

return rank_ == ref.rank_ && suit_ == ref.suit_;

}

 

bool operator< (const Card& ref) const {

return rank_ < ref.rank_;

}

 

// print a card: '3-H' = three of hearts, 'A-S' = ace of spades

friend std::ostream&

operator<< (std::ostream& s, const Card& ref) {

s << ref.rank_ << "-" << ref.suit_;

return s;

}

};

 

struct Deck

{

private:

 

int rank_index_; // indexes into static arrays below

int suit_index_;

 

static const char ranks_ [13];

static const char suits_ [4];

 

public:

 

Deck () : rank_index_ (-1), suit_index_ (-1) { }

 

// generate the next Card

Card operator()() {

rank_index_ = (rank_index_ + 1) % 13;

 

if (rank_index_ == 0)

// cycled through ranks, move on to next suit:

suit_index_ = (suit_index_ + 1) % 4;

 

return Card(ranks_[rank_index_], suits_[suit_index_]);

}

};

 

/* static */

const char Deck::suits_[4] = {

'S', 'H', 'D', 'C'

};

 

/* static */

const char Deck::ranks_[13] = {

'A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K'

};

 

int main ()

{

// Essential Tools Module collection:

RWTValOrderedVector<Card> deck;

RWTValOrderedVector<Card>::size_type pos;

 

Card aceOfSpades('A','S');

 

// Use standard library algorithm to generate deck:

generate_n(back_inserter(deck.std()), 52, Deck());

std::cout << std::endl << "The deck has been created" << std::endl;

 

// Use Essential Tools Module member function to find card:

pos = deck.index(aceOfSpades);

std::cout << "The Ace of Spades is at position " << pos+1 << std::endl;

 

// Use standard library algorithm to shuffle deck:

std::random_shuffle(deck.begin(), deck.end());

std::cout << std::endl << "The deck has been shuffled" << std::endl;

 

// Use Essential Tools Module member functions:

pos = deck.index(aceOfSpades);

Card firstCard = deck.first();

 

std::cout << "Now the Ace of Spades is at position " << pos+1

<< std::endl << "and the first card is " << firstCard << std::endl;

 

return 0;

}

Output (will vary because of the shuffle):

 

The deck has been created

The Ace of Spades is at position 1

The deck has been shuffled

Now the Ace of Spades is at position 37

and the first card is Q-D