parent
ee1e2e5bc5
commit
da0b941dfd
@ -0,0 +1,221 @@ |
||||
#include <catch2/catch_test_macros.hpp> |
||||
#include <fmt/core.h> |
||||
#include <string> |
||||
#include "config.hpp" |
||||
#include "matrix.hpp" |
||||
#include "components.hpp" |
||||
#include <nlohmann/json.hpp> |
||||
#include <fstream> |
||||
|
||||
using namespace nlohmann; |
||||
using namespace fmt; |
||||
using std::string; |
||||
|
||||
|
||||
|
||||
#include <algorithm> |
||||
#include <iostream> |
||||
|
||||
struct ItStep { |
||||
int cell; |
||||
size_t x; |
||||
size_t y; |
||||
bool row; |
||||
}; |
||||
|
||||
class MatrixIterator1 { |
||||
public: |
||||
class iterator |
||||
{ |
||||
public: |
||||
Matrix &mat; |
||||
size_t x = 0; |
||||
size_t y = 0; |
||||
|
||||
using iterator_category = std::input_iterator_tag; |
||||
using value_type = ItStep; |
||||
using difference_type = ItStep; |
||||
using pointer = ItStep *; |
||||
using reference = ItStep; |
||||
|
||||
explicit iterator(Matrix &_mat) |
||||
: mat(_mat) {} |
||||
|
||||
iterator& operator++() { |
||||
x++; |
||||
if(x < mat[0].size()) { |
||||
return *this; |
||||
} else { |
||||
x = 0; |
||||
y++; |
||||
return *this; |
||||
} |
||||
} |
||||
|
||||
iterator operator++(int) { |
||||
iterator retval = *this; |
||||
++(*this); |
||||
return retval; |
||||
} |
||||
|
||||
bool operator==(iterator other) const { |
||||
return x == other.x && y == other.y; |
||||
} |
||||
|
||||
reference operator*() const { |
||||
return { |
||||
.cell = mat[y][x], |
||||
.x = x, |
||||
.y = y, |
||||
.row = x >= mat[0].size() - 1 |
||||
}; |
||||
} |
||||
}; |
||||
|
||||
Matrix &mat; |
||||
|
||||
MatrixIterator1(Matrix &mat_) : |
||||
mat(mat_) |
||||
{ |
||||
} |
||||
|
||||
iterator begin() { |
||||
return iterator(mat); |
||||
} |
||||
|
||||
iterator end() { |
||||
iterator it(mat); |
||||
it.y = mat.size(); |
||||
it.x = 0; |
||||
return it; |
||||
} |
||||
}; |
||||
|
||||
struct MatrixIterator2 { |
||||
Matrix &$mat; |
||||
size_t x = ~0; |
||||
size_t y = ~0; |
||||
size_t width = 0; |
||||
size_t height = 0; |
||||
int cell = 0; |
||||
bool row = false; |
||||
|
||||
MatrixIterator2(Matrix &mat) : |
||||
$mat(mat) |
||||
{ |
||||
height = $mat.size(); |
||||
width = $mat[0].size(); |
||||
} |
||||
|
||||
bool next() { |
||||
x++; |
||||
x *= (x < width); |
||||
y = y + (x == 0); |
||||
row = x == width - 1; |
||||
|
||||
if(y < height) { |
||||
cell = $mat[y][x]; |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
}; |
||||
|
||||
TEST_CASE("basic matrix iterator", "[matrix]") { |
||||
std::ifstream infile("./tests/dijkstra.json"); |
||||
json data = json::parse(infile); |
||||
auto test = data[0]; |
||||
|
||||
Matrix walls = test["walls"]; |
||||
|
||||
matrix_dump("ITERATOR DUMP", walls); |
||||
|
||||
println("VS Matrix1 ------"); |
||||
|
||||
for(auto [cell, x, y, row] : MatrixIterator1(walls)) { |
||||
REQUIRE(walls[y][x] == cell); |
||||
print("{} ", cell); |
||||
if(row) print("\n"); |
||||
} |
||||
|
||||
println("VS Matrix2------"); |
||||
|
||||
for(MatrixIterator2 mit{walls}; mit.next();) { |
||||
REQUIRE(walls[mit.y][mit.x] == mit.cell); |
||||
print("{} ", mit.cell); |
||||
if(mit.row) print("\n"); |
||||
} |
||||
|
||||
println("END TEST============="); |
||||
} |
||||
|
||||
|
||||
template<long FROM, long TO> |
||||
class Range { |
||||
public: |
||||
class iterator |
||||
{ |
||||
long num = FROM; |
||||
|
||||
public: |
||||
using iterator_category = std::input_iterator_tag; |
||||
using value_type = long; |
||||
using difference_type = long; |
||||
using pointer = const long *; |
||||
using reference = long; |
||||
|
||||
explicit iterator(long _num = 0) : num(_num) {} |
||||
|
||||
iterator& operator++() { |
||||
num = TO >= FROM ? num + 1 : num - 1; |
||||
return *this; |
||||
} |
||||
|
||||
iterator operator++(int) { |
||||
iterator retval = *this; |
||||
++(*this); |
||||
return retval; |
||||
} |
||||
|
||||
bool operator==(iterator other) const { |
||||
return num == other.num; |
||||
} |
||||
|
||||
bool operator!=(iterator other) const { |
||||
return !(*this == other); |
||||
} |
||||
|
||||
reference operator*() const { |
||||
return num; |
||||
} |
||||
}; |
||||
|
||||
iterator begin() { |
||||
return iterator(FROM); |
||||
} |
||||
|
||||
iterator end() { |
||||
return iterator(TO >= FROM ? TO + 1 : TO - 1); |
||||
} |
||||
}; |
||||
|
||||
TEST_CASE("basic matrix example", "[matrix]") { |
||||
auto range = Range<15, 25>(); |
||||
auto itr = std::find(range.begin(), range.end(), 18); |
||||
std::cout << *itr << '\n'; |
||||
|
||||
for(long l : Range<3, 5>()) { |
||||
std::cout << l << ' '; |
||||
} |
||||
|
||||
std::cout << '\n'; |
||||
} |
||||
|
||||
TEST_CASE("matrix_assign works", "[matrix]") { |
||||
|
||||
} |
||||
|
||||
TEST_CASE("matrix_dump works", "[matrix]") { |
||||
|
||||
} |
Loading…
Reference in new issue