00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026
00027
00028 #ifndef __DECK_H__
00029 #define __DECK_H__
00030
00031 #include <iostream>
00032 #include <vector>
00033 #include <string>
00034 #include <algorithm>
00035 #include "Exception.h"
00036 #include "Card.h"
00037 #include "NumberCard.h"
00038 #include "LetterCard.h"
00039 #include "CardFactory.h"
00040
00041 namespace deck {
00042
00044 class Deck {
00045 public:
00047 enum DeckType {
00048 STANDARD = 1
00049 };
00050
00051 Deck(enum DeckType = STANDARD) throw(error::Exception);
00053
00054 virtual ~Deck();
00056
00057 Card *deal() throw(error::Exception);
00059
00060 void shuffle();
00062
00063 void reset();
00065
00066 std::string view() const;
00068
00069 private:
00071 void clear_();
00072
00074 void createCards_(enum Card::SuitType suit);
00075
00076 std::vector<Card *> cards_;
00078
00079
00080
00081
00082 enum DeckType type_;
00084
00085 CardFactory<NumberCard> numberCardFactory_;
00087
00088 CardFactory<LetterCard> letterCardFactory_;
00090
00092 static const int STANDARD_CARDS_NUM_ = 52;
00093 };
00094
00095 inline std::ostream &operator<<(std::ostream &out, const Deck &deck) {
00096 return out << deck.view();
00097 }
00099
00100 }
00101
00102 #endif