/*
Texel - A UCI chess engine.
Copyright (C) 2012-2014 Peter Ă–sterlund, peterosterlund2@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* move.hpp
*
* Created on: Feb 25, 2012
* Author: petero
*/
#ifndef MOVE_HPP_
#define MOVE_HPP_
#include <iosfwd>
#include "util/util.hpp"
/** Represents a chess move. */
class Move {
public:
/** Create empty move object. */
Move();
/** Create a move object. */
Move(int from, int to, int promoteTo, int score = 0);
/** Copy constructor. */
Move(const Move& m);
/** Set move properties. */
void setMove(int from, int to, int promoteTo, int score);
void setScore(int score);
/** Get 16 bit compressed representation of move, not including score. */
U16 getCompressedMove() const;
/** Set move from 16 bit compressed representation. Score not changed. */
void setFromCompressed(U16 move);
int from() const;
int to() const;
int promoteTo() const;
int score() const;
bool isEmpty() const;
/** Note that score is not included in the comparison. */
bool equals(const Move& other) const;
bool operator==(const Move& other) const;
int hashCode() const;
/** Not declared "nothrow". Avoids nullptr check in generated assembly code when using placement new. */
void* operator new (std::size_t size, void* ptr);
/** For debugging. */
std::ostream& operator<<(std::ostream& os);
private:
/** From square, 0-63. */
int from_;
/** To square, 0-63. */
int to_;
/** Promotion piece. */
int promoteTo_;
/** Score. */
int score_;
};
inline
Move::Move()
: from_(0), to_(0), promoteTo_(0), score_(0) {
}
inline
Move::Move(int from, int to, int promoteTo, int score) {
from_ = from;
to_ = to;
promoteTo_ = promoteTo;
score_ = score;
}
inline
Move::Move(const Move& m) {
from_ = m.from_;
to_ = m.to_;
promoteTo_ = m.promoteTo_;
score_ = m.score_;
}
inline void
Move::setMove(int from, int to, int promoteTo, int score)
{
from_ = from;
to_ = to;
promoteTo_ = promoteTo;
score_ = score;
}
inline void
Move::setScore(int score) {
score_ = score;
}
inline U16
Move::getCompressedMove() const {
return (U16)(from() + (to() << 6) + (promoteTo() << 12));
}
inline void
Move::setFromCompressed(U16 move) {
setMove(move & 63, (move >> 6) & 63, (move >> 12) & 15, score());
}
inline int
Move::from() const {
return from_;
}
inline int
Move::to() const {
return to_;
}
inline int
Move::promoteTo() const {
return promoteTo_;
}
inline int
Move::score() const {
return score_;
}
inline bool
Move::isEmpty() const {
return (from_ == 0) && (to_ == 0);
}
inline bool
Move::equals(const Move& other) const {
if (from_ != other.from_)
return false;
if (to_ != other.to_)
return false;
if (promoteTo_ != other.promoteTo_)
return false;
return true;
}
inline bool
Move::operator==(const Move& other) const {
return (*this).equals(other);
}
inline int
Move::hashCode() const {
return (from_ * 64 + to_) * 16 + promoteTo_;
}
inline void*
Move::operator new (std::size_t size, void* ptr) {
return ptr;
}
#endif /* MOVE_HPP_ */