|
Jaroslav |
203cc8 |
#pragma once
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
#ifndef CELL_POSITION_INCLUDED
|
|
Jaroslav |
203cc8 |
#define CELL_POSITION_INCLUDED
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
#include <algorithm></algorithm>
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
using std::min;
|
|
Jaroslav |
203cc8 |
using std::max;
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
// Identifies cells by frame and layer rather than row and column
|
|
Jaroslav |
203cc8 |
class CellPosition {
|
|
Jaroslav |
203cc8 |
int _frame; // a frame number. corresponds to row in vertical xsheet
|
|
Jaroslav |
203cc8 |
int _layer; // a layer number. corresponds to col in vertical xsheet
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
public:
|
|
Jaroslav |
203cc8 |
CellPosition() : _frame(0), _layer(0) {}
|
|
Jaroslav |
203cc8 |
CellPosition(int frame, int layer) : _frame(frame), _layer(layer) {}
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
int frame() const { return _frame; }
|
|
Jaroslav |
203cc8 |
int layer() const { return _layer; }
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
void setFrame(int frame) { _frame = frame; }
|
|
Jaroslav |
203cc8 |
void setLayer(int layer) { _layer = layer; }
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
CellPosition &operator=(const CellPosition &that) = default;
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
operator bool() const { return _frame || _layer; }
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
CellPosition operator+(const CellPosition &add) {
|
|
Jaroslav |
203cc8 |
return CellPosition(_frame + add._frame, _layer + add._layer);
|
|
Jaroslav |
203cc8 |
}
|
|
Jaroslav |
203cc8 |
CellPosition operator*(const CellPosition &mult) {
|
|
Jaroslav |
203cc8 |
return CellPosition(_frame * mult._frame, _layer * mult._layer);
|
|
Jaroslav |
203cc8 |
}
|
|
Jaroslav |
203cc8 |
void ensureValid() {
|
|
John Dancel |
421acd |
if (_frame < 0) _frame = 0;
|
|
John Dancel |
421acd |
if (_layer < -1) _layer = -1;
|
|
Jaroslav |
203cc8 |
}
|
|
Jaroslav |
203cc8 |
};
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
// A square range identified by two corners
|
|
Jaroslav |
203cc8 |
class CellRange {
|
|
Jaroslav |
203cc8 |
CellPosition _from, _to; // from.frame <= to.frame && from.layer <= to.layer
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
public:
|
|
Jaroslav |
203cc8 |
CellRange() {}
|
|
Jaroslav |
203cc8 |
CellRange(const CellPosition &from, const CellPosition &to)
|
|
Jaroslav |
203cc8 |
: _from(min(from.frame(), to.frame()), min(from.layer(), to.layer()))
|
|
Jaroslav |
203cc8 |
, _to(max(from.frame(), to.frame()), max(from.layer(), to.layer())) {}
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
const CellPosition &from() const { return _from; }
|
|
Jaroslav |
203cc8 |
const CellPosition &to() const { return _to; }
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
CellRange &operator=(const CellRange &that) = default;
|
|
Jaroslav |
203cc8 |
};
|
|
Jaroslav |
203cc8 |
|
|
Jaroslav |
203cc8 |
#endif
|