aboutsummaryrefslogtreecommitdiff
path: root/src/CMI.hpp
blob: 46d8aa469375cb4e9f51f6f95b6a8336b9c7d33d (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
#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 {
public:
  /// @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 = 0;
  /**
    * @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*) = 0;
  /**
    * @brief Get the previous CMI::HalfMove
    * 
    * @return HalfMove* if any and nullptr otherwise
    */
  virtual HalfMove* GetParent() const = 0;
  /**
    * @brief Set the parent of current CMI::HalfMove
    * 
    */
  virtual void SetParent(HalfMove*) = 0;
  /// @brief Return the current move using the SAN notation e.g: "Qxc5+" or "a4"
  virtual std::string GetSAN() const = 0;
  /// @brief Setter to replace current SAN 
  virtual void SetSAN(std::string) = 0;
  /// @brief Return the HalfMove move number e.g 1 for the first white's and black's move
  virtual std::uint16_t GetNumber() const = 0;
  /// @brief Setter to replace current Number 
  virtual void SetNumber(std::uint16_t) = 0;
  /// @brief Return the Numeric Annotation Glyphs code
  virtual std::uint8_t GetNAG() const = 0;
  /// @brief Setter to replace current NAG
  virtual void SetNAG(std::uint8_t) = 0;
  /// @brief Return the comment linked to the current move or empty string
  virtual std::string GetComment() const = 0;
  /// @brief Setter to replace current comment
  virtual void SetComment(std::string) = 0;
  /// @brief Return true if the current HalfMove was played by black
  virtual bool IsBlack() const = 0;
  /// @brief Setter to replace that determined the return values of HalfMove::IsBlack()
  virtual void SetIsBlack(bool) = 0;
  /// @brief All the variations of the current move
  virtual std::vector<HalfMove*> GetVariations() const = 0;
  /// @brief Setter to replace current variations
  virtual void SetVariations(std::vector<HalfMove*>) = 0;


  // ---------- 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();
};
}