-
Notifications
You must be signed in to change notification settings - Fork 0
/
adversary.cpp
131 lines (115 loc) · 3.34 KB
/
adversary.cpp
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <unordered_map>
#include "adversary.h"
adversary_t::adversary_t(const std::string name, const std::string faction, const bool is_enemy)
: information(new adversary_information_t(name, faction, is_enemy)) {}
/*
adversary_t::get_first_hash
Return adversary name as a hash.
*/
const size_t adversary_t::get_first_hash() const
{
return std::hash<std::string>{}(information->name);
}
/*
adversary_t::get_rest
Return information.
Returns a newly-allocated complex if infomration is non-null.
*/
const complex_t* const adversary_t::get_rest() const
{
return new adversary_information_t(information->name, information->faction, information->is_enemy);
}
/*
adversary_t::get_inner_rest
Indicate that the structure height is singular.
*/
const complex_t* const adversary_t::get_inner_rest() const
{
return nullptr;
}
/*
adversary_t::find_exact
Indicate that the structure has no tokens.
*/
const complex_t* const adversary_t::find_exact(const token_t* const token) const
{
return nullptr;
}
/*
adversary_t::replace
Return a complex if the adversary matches another complex.
*/
const complex_t* const adversary_t::replace(const complex_t* const from, const complex_t* const to) const
{
return equals(this, from) ? to : this;
}
const std::string adversary_t::to_string() const
{
return information->to_string();
}
adversary_t::adversary_information_t::adversary_information_t(const std::string name, const std::string faction, const bool is_enemy, const int position)
: pctg_complex_t(position), name(name), faction(faction), is_enemy(is_enemy) {}
/*
adversary_information_t::get_first_hash
Return a hashed attribute based on pctg_complex_t::position.
*/
const size_t adversary_t::adversary_information_t::get_first_hash() const
{
switch (position)
{
case 0: // If name has been evaluated...
return std::hash<std::string>{}(faction);
case 1: // If name and faction have been evaluated...
return std::hash<int>{}(is_enemy + 100);
default:
return 0; // Ideally should never be reached.
}
}
/*
adversary_information_t::get_rest
Return the object with pctg_complex_t::position incremented.
Returns a newly-allocated complex if non-null.
*/
const complex_t* const adversary_t::adversary_information_t::get_rest() const
{
if (position < 1)
{
return new adversary_information_t(name, faction, is_enemy, position + 1);
}
else
{
return nullptr;
}
}
/*
adversary_information_t::get_inner_rest
Indicate that the structure height is singular.
*/
const complex_t* const adversary_t::adversary_information_t::get_inner_rest() const
{
return nullptr;
}
/*
adversary_information_t::find_exact
Indicate that the structure has no tokens.
*/
const complex_t* const adversary_t::adversary_information_t::find_exact(const token_t* const token) const
{
return nullptr;
}
/*
adversary_information_t::replace
Return a complex if the object matches another complex.
*/
const complex_t* const adversary_t::adversary_information_t::replace(const complex_t* const from, const complex_t* const to) const
{
return equals(this, from) ? to : this;
}
const std::string adversary_t::adversary_information_t::to_string() const
{
return "{Name: " + name + "; "
+ "Faction: " + faction + "; "
+ "Is Enemy: " + (is_enemy
? "Yes" : "No")
+ "}";
}