-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathword.h
More file actions
88 lines (71 loc) · 1.6 KB
/
Copy pathword.h
File metadata and controls
88 lines (71 loc) · 1.6 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
#ifndef WORD_H
#define WORD_H
#include <format>
#include <ranges>
#include <vector>
namespace
{
std::string upper(std::string_view text)
{
return std::views::transform(text, toupper) | std::ranges::to<std::string>();
}
}
struct Word
{
Word(const std::string &text = "")
: word(text)
{
}
bool guess(char ltr);
const std::string display() const
{
return upper(word);
}
bool in_word(char c) const
{
return word.find(c) != std::string::npos;
}
bool good(char c) const
{
return std::ranges::find(good_letters, c) != good_letters.end();
}
bool bad(char c) const
{
return std::ranges::find(bad_letters, c) != bad_letters.end();
}
bool guessed(char c) const
{
return good(c) || bad(c);
}
bool done() const
{
for (char ch : word)
{
if (!good(ch))
return false;
}
return true;
}
std::string word;
std::vector<char> good_letters;
std::vector<char> bad_letters;
};
// Formatting the word gives it with dashes for unguessed letters and spaces between letters otherwise
template <>
struct std::formatter<Word>
{
constexpr auto parse(std::format_parse_context &ctx)
{
return ctx.begin();
}
auto format(const Word &w, std::format_context &ctx) const
{
std::string out;
for (auto c : w.word)
{
out += std::format("{} ", w.guessed(c) ? static_cast<char>(toupper(c)) : '_');
}
return std::format_to(ctx.out(), "{}", out);
}
};
#endif // WORD_H