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