aboutsummaryrefslogtreecommitdiff
path: root/src/CMI.hpp
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