-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLottery.h
More file actions
103 lines (80 loc) · 2.61 KB
/
Copy pathLottery.h
File metadata and controls
103 lines (80 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// ===========================================================================
// Lottery.h
// ===========================================================================
#pragma once
#include <cstddef>
#include <iostream>
#include <random>
#include <vector>
class Lottery
{
private:
std::vector<int> m_numbers;
mutable std::default_random_engine m_random_engine;
mutable std::uniform_int_distribution<int> m_dist;
// ----------------------------------------------------------
// iterator support
class DrawPosition
{
private:
size_t m_drawnNumbers;
// need back reference
Lottery& m_outer;
public:
DrawPosition(Lottery& outer, size_t drawnNumbers)
: m_outer{ outer }, m_drawnNumbers{ drawnNumbers }
{
// need to draw first number
if (m_drawnNumbers == 1) {
int number = m_outer.drawNextNumber();
m_outer.setNextNumber(number);
}
}
bool operator != (const DrawPosition& other) {
return m_drawnNumbers != other.m_drawnNumbers;
}
void operator++ () {
m_drawnNumbers++;
if (m_drawnNumbers == 7) {
// drawing of lottery numbers is complete
m_drawnNumbers = 0;
}
else {
// draw next number
int number = m_outer.drawNextNumber();
m_outer.setNextNumber(number);
}
}
int operator* () {
size_t currentIndex = m_drawnNumbers - 1;
return m_outer.m_numbers[currentIndex];
}
};
public:
using iterator = DrawPosition;
DrawPosition begin() { return DrawPosition(*this, 1); };
DrawPosition end() { return DrawPosition(*this, 0); };
// end of iterator support
// ----------------------------------------------------------
public:
// c'tors
Lottery ();
Lottery (int seed);
// getter
size_t getDrawnNumbers () const;
// public interface
void play ();
void print ();
private:
// private helper methods
int nextRandomNumber () const;
bool numberAlreadyDrawn (int number) const;
int drawNextNumber () const;
void setNextNumber (int number);
void verifyNumbers () const;
// private class method
static void printNumber (int number);
};
// ===========================================================================
// End-of-File
// ===========================================================================