]> git.scottworley.com Git - slidingtile/blobdiff - sliding_tile_lib.cc
Input validation
[slidingtile] / sliding_tile_lib.cc
index a4d522e6745a99507612540f9664ed3ab6f9a8ee..3b7806bd0a204eb113146871eb5deaedcfbb7fd3 100644 (file)
@@ -21,6 +21,29 @@ signed char adjacent[BOARD_SIZE][5] = {
   11,  14,  -1,  -1,  -1,
 };
 
   11,  14,  -1,  -1,  -1,
 };
 
+bool Board::is_valid() {
+  bool seen[BOARD_SIZE];
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    seen[i] = false;
+  }
+
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    if (board[i] < 0 || board[i] >= BOARD_SIZE || seen[board[i]]) {
+      return false;
+    }
+    seen[board[i]] = true;
+  }
+
+  // Redundant because pigeon-hole-principle, but check anyway
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    if (!seen[i]) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
 std::istream& operator>>(std::istream& is, Board& board) {
   for (int i = 0; i < BOARD_SIZE; i++) {
     if (!is.good()) {
 std::istream& operator>>(std::istream& is, Board& board) {
   for (int i = 0; i < BOARD_SIZE; i++) {
     if (!is.good()) {
@@ -33,7 +56,10 @@ std::istream& operator>>(std::istream& is, Board& board) {
     }
     int numeric;
     is >> numeric;
     }
     int numeric;
     is >> numeric;
-    board[i] = numeric;
+    board.board[i] = numeric;
+  }
+  if (!board.is_valid()) {
+    is.setstate(std::istream::failbit);
   }
   return is;
 }
   }
   return is;
 }