blob: ea4ee65893f7dc56923a29648fa8606944636741 (
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
96
97
98
99
100
101
102
103
104
105
106
107
|
#pragma once
#include <cstdint>
#include <vector>
#include <string>
namespace CMI {
/**
* @brief Chess Move Interface
* A standard chess half move interface for improving chess libraries
* interoperability.
* NONE OF THESE METHODS IMPLEMENTATIONS MUST DELETE A CMI::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 {
protected:
HalfMove *parent = nullptr;
HalfMove *mainline = nullptr;
std::vector<HalfMove *> variations;
std::string SAN,comment;
std::uint16_t number;
std::uint8_t NAG;
bool isBlack;
public:
HalfMove();
/// @brief Ensure that the destructor of the child class is called
virtual ~HalfMove();
/**
* @brief Return a pointer to the next CMI::HalfMove
*
* @return HalfMove* if any and nullptr otherwise
*/
virtual HalfMove* GetMainline() const;
/**
* @brief Set the next CMI::HalfMove
* Existing main line pointer will be overriten (NOT DELETED) and the internal state (Number, IsBlack) of the new move
* must be ajusted in the implementation of this method.
*/
virtual void SetMainline(HalfMove*);
/**
* @brief Get the previous CMI::HalfMove
*
* @return HalfMove* if any and nullptr otherwise
*/
virtual HalfMove* GetParent() const;
/**
* @brief Set the parent of current CMI::HalfMove
*
*/
virtual void SetParent(HalfMove*);
/// @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(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(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 Setter to replace current variations
virtual void SetVariations(std::vector<HalfMove*>);
// ---------- Implementation of various common operations ----------
/// @brief Promote the current variation if any
void Promote();
/// @brief Make the current variation the main line
void SetAsMainline();
/// @brief Add a variation to the variations list
void AddVariation(HalfMove*);
/**
* @brief Remove the given CMI::HalfMove from the variations list
*
* @return true if found and deleted
* @return false otherwise
*/
bool RemoveVariation(HalfMove*);
/**
* @brief Remove the given CMI::HalfMove from mainline and variations list
*
* @return true if found and deleted
* @return false otherwise
*/
bool RemoveChild(HalfMove*);
/**
* @brief Return the CMI::HalfMove root node of the current move branch
*
* @return HalfMove* the branch root (might be nullptr)
*/
HalfMove* GetBranchRoot();
};
}
|