blob: 999a0dca06299c1dd4770e1e1f296dafca1b5a7e (
plain)
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
|
#pragma once
#include <cstdint>
#include <string>
#include <vector>
namespace CMI {
/**
* @brief Chess Move Interface
* A standard chess half move interface for improving chess libraries
* interoperability.
* NONE OF THESE METHODS IMPLEMENTATIONS DELETE A CMI::HalfMove EXCEPT
* CMI::HalfMove::~HalfMove. It is up to the user of the object instance to do
* it after ensuring that no references to the CMI::HalfMove remains in the move
* tree.
*/
class HalfMove {
HalfMove *parent;
HalfMove *mainline;
std::vector<HalfMove *> variations;
std::string SAN, comment;
std::uint16_t number;
std::uint8_t NAG;
bool isBlack;
/// @brief Set the parent of current CMI::HalfMove, only used internally
void SetParent(HalfMove *);
public:
HalfMove();
HalfMove(const std::string &SAN);
HalfMove(const std::string &SAN, const std::string &comment,
std::uint16_t number, std::uint8_t NAG, bool isBlack);
/// @brief Ensure that the destructor of the child class is called
virtual ~HalfMove();
/// @brief Return a pointer to the next CMI::HalfMove
virtual HalfMove *GetMainline() const;
/// @brief Bind two moves together
virtual void SetMainline(HalfMove *);
/// @brief Get the previous CMI::HalfMove
virtual HalfMove *GetParent() const;
/// @brief Return the current move using the SAN notation e.g: "Qxc5+" or "a4"
virtual std::string GetSAN() const;
/// @brief Setter to replace current SAN
virtual void SetSAN(const std::string &);
/// @brief Return the HalfMove move number e.g 1 for the first white's and
/// black's move
virtual std::uint16_t GetNumber() const;
/// @brief Setter to replace current Number
virtual void SetNumber(std::uint16_t);
/// @brief Return the Numeric Annotation Glyphs code
virtual std::uint8_t GetNAG() const;
/// @brief Setter to replace current NAG
virtual void SetNAG(std::uint8_t);
/// @brief Return the comment linked to the current move or empty string
virtual std::string GetComment() const;
/// @brief Setter to replace current comment
virtual void SetComment(const std::string &);
/// @brief Return true if the current HalfMove was played by black
virtual bool IsBlack() const;
/// @brief Setter to replace that determined the return values of
/// HalfMove::IsBlack()
virtual void SetIsBlack(bool);
/// @brief All the variations of the current move
virtual std::vector<HalfMove *> GetVariations() const;
/// @brief Add a variation to the variations list
virtual void AddVariation(HalfMove *);
/**
* @brief Remove the given CMI::HalfMove from the variations list
*
* @return true if found and deleted
* @return false otherwise
*/
virtual bool RemoveVariation(HalfMove *);
virtual void ClearVariations();
/**
* @brief Remove the given CMI::HalfMove from mainline and variations list
*
* @return true if found and deleted
* @return false otherwise
*/
virtual bool RemoveChild(HalfMove *);
/// @brief Return the CMI::HalfMove root node of the current move branch
virtual HalfMove *GetBranchRoot();
/// @brief Promote the current variation if any
virtual void Promote();
/// @brief Make the current variation the main line
virtual void SetAsMainline();
/// @brief Check if the tree move contains a pointer to the given move
virtual bool Contains(HalfMove *) const;
/// @brief Check if the current tree of move is consistent
virtual bool IsConsistent() const;
};
} // namespace CMI
|