#pragma once #include #include #include 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 GetVariations() const = 0; /// @brief Setter to replace current variations virtual void SetVariations(std::vector) = 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(); }; }