X-Git-Url: http://git.scottworley.com/slidingtile/blobdiff_plain/5d2f7c7cebb5423fa9618a28871a81671c380041..310a7132ffc617b93969703de7f3bf1c5ea0fa30:/sliding_tile_lib.cc?ds=sidebyside diff --git a/sliding_tile_lib.cc b/sliding_tile_lib.cc index b43cbba..e4f2f12 100644 --- a/sliding_tile_lib.cc +++ b/sliding_tile_lib.cc @@ -49,6 +49,30 @@ bool Board::is_valid() const { return true; } +bool Board::operator==(const Board& o) const { + for (int i = 0; i < BOARD_SIZE; i++) { + if (board[i] != o.board[i]) { + return false; + } + } + return true; +} + +bool Board::operator!=(const Board& o) const { + return !operator==(o); +} + +bool Board::operator<(const Board& o) const { + for (int i = 0; i < BOARD_SIZE; i++) { + if (board[i] < o.board[i]) { + return true; + } else if (board[i] > o.board[i]) { + return false; + } + } + return false; +} + std::istream& operator>>(std::istream& is, Board& board) { for (int i = 0; i < BOARD_SIZE; i++) { if (!is.good()) { @@ -118,3 +142,21 @@ std::vector Step::successors(std::shared_ptr shared_this) { } return suc; } + +std::ostream& operator<<(std::ostream& os, const Step& step) { + if (step.prev != nullptr) { + os << *step.prev; + signed char this_hole = step.board.hole(); + signed char prev_hole = step.prev->board.hole(); + os << int(step.board.board[prev_hole]) << " "; + switch (this_hole - prev_hole) { + case -1: os << "right"; break; + case 1: os << "left"; break; + case -BOARD_DIM: os << "down"; break; + case BOARD_DIM: os << "up"; break; + default: os << "somehow!"; break; + } + os << std::endl; + } + return os; +}