/*
This file is part of the Dandere2x project.
Dandere2x 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.
Dandere2x 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 Foobar. If not, see .
*/
/*
========= Copyright aka_katto 2018, All rights reserved. ============
Original Author: aka_katto
Date: 4/11/20
Purpose:
===================================================================== */
#include "Block.h"
Block::Block(const Block &other) {
this->x_start = other.x_start;
this->y_start = other.y_start;
this->x_end = other.x_end;
this->y_end = other.y_end;
this->sum = other.sum;
this->valid = other.valid;
this->left_to_right_hash = other.left_to_right_hash;
this->right_to_left_hash = other.right_to_left_hash;
}
Block::Block() {
this->x_start = -1;
this->y_start = -1;
this->x_end = -1;
this->y_end = -1;
this->sum = INT32_MAX;
this->valid = false;
this->left_to_right_hash = -1;
this->right_to_left_hash = -1;
}
Block::Block(int x_start, int y_start, int x_end, int y_end, double sum) {
this->x_start = x_start;
this->y_start = y_start;
this->x_end = x_end;
this->y_end = y_end;
this->sum = sum;
this->valid = true;
// memoization stuff
string left_to_right_string = to_string(x_start) + " " + to_string(y_start) + " " +
to_string(x_end) + " " + to_string(y_end);
string right_to_left_string = to_string(x_end) + " " + to_string(y_end) + " " +
to_string(x_start) + " " + to_string(y_start);
this->left_to_right_hash = hash{}(left_to_right_string);
this->right_to_left_hash = hash{}(right_to_left_string);
}
void Block::reverse_block() {
// Reverse a blocks direction.
int temp_x_start = this->x_start;
int temp_y_start = this->y_start;
this->x_start = x_end;
this->y_start = y_end;
this->x_end = temp_x_start;
this->y_end = temp_y_start;
}
// Protected
//-----------------------------------------------------------------------------
// Purpose: Checks if two blocks are equivalent either by default or under a
// flip_direction() operation. We can use hashes to efficiently check
// for this.
//-----------------------------------------------------------------------------
bool Block::is_equivalent(const Block &other) const {
return (this->left_to_right_hash == other.right_to_left_hash) ||
(this->left_to_right_hash == other.left_to_right_hash);
}