test/helloworld/at.test.cpp
Depends on
Code
#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_A"
#include <cassert>
#include <iostream>
#include "../../Util/at.hpp"
void at_test_dim1_a() {
using arumakan::at;
constexpr int W = 5;
int a[W];
for (int i = 0; i < W; ++i) {
at(a, i) = i;
assert(&at(a, i) == &a[i]);
assert(a[i] == i);
}
std::clog << __func__ << " : OK" << std::endl;
}
void at_test_dim1_b() {
using arumakan::at;
constexpr int W = 5;
int a[W];
using P1 = std::array<int, 1>;
using P2 = std::tuple<int>;
for (int i = 0; i < W; ++i) {
at(a, P1{i}) = i;
assert(a[i] == i);
assert(&at(a, P1{i}) == &a[i]);
assert(&at(a, P2{i}) == &a[i]);
}
std::clog << __func__ << " : OK" << std::endl;
}
void at_test_dim2() {
using arumakan::at;
constexpr int H = 3;
constexpr int W = 4;
int a[H][W];
using P1 = std::array<int, 2>;
using P2 = std::pair<int, int>;
using P3 = std::tuple<int, int>;
for (int i = 0; i < H; ++i) {
for (int j = 0; j < W; ++j) {
at(a, P1{i, j}) = i * W + j;
assert(a[i][j] == i * W + j);
assert(&at(a, P1{i, j}) == &a[i][j]);
assert(&at(a, P2{i, j}) == &a[i][j]);
assert(&at(a, P3{i, j}) == &a[i][j]);
}
}
std::clog << __func__ << " : OK" << std::endl;
}
void at_test_dim3() {
using arumakan::at;
constexpr int D = 3;
constexpr int H = 3;
constexpr int W = 4;
int a[D][H][W];
using P1 = std::array<int, 3>;
using P2 = std::tuple<int, int, int>;
for (int z = 0; z < D; ++z) {
for (int y = 0; y < H; ++y) {
for (int x = 0; x < W; ++x) {
at(a, P1{z, y, x}) = (z * H * W) + (y * H) + (x);
assert(a[z][y][x] == (z * H * W) + (y * H) + (x));
assert(&at(a, P1{z, y, x}) == &a[z][y][x]);
assert(&at(a, P2{z, y, x}) == &a[z][y][x]);
}
}
}
std::clog << __func__ << " : OK" << std::endl;
}
int main() {
std::cout << "Hello World" << std::endl;
at_test_dim1_a();
at_test_dim1_b();
at_test_dim2();
at_test_dim3();
return 0;
}
#line 1 "test/helloworld/at.test.cpp"
#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_A"
#include <cassert>
#include <iostream>
#line 2 "Util/at.hpp"
#include <tuple>
#include <functional>
#include <type_traits>
/**
* @brief at() ()
*/
namespace arumakan {
//! at(a, i) returns a[i]
template <class Array, class Integer, std::enable_if_t<std::is_integral<Integer>::value, std::nullptr_t> = nullptr>
inline auto at(Array&& a, Integer i) -> decltype(a[0])& {
return a[i];
}
//! at(a, Tuple{i}) returns a[i]
template <class Array, class Tuple, std::enable_if_t<std::tuple_size<Tuple>::value == 1, std::nullptr_t> = nullptr>
inline auto at(Array&& a, Tuple index) -> decltype(a[0])& {
return a[std::get<0>(index)];
}
//! at(mat, Tuple{y, x}) returns mat[y][x]
template <class Matrix, class Tuple, std::enable_if_t<std::tuple_size<Tuple>::value == 2, std::nullptr_t> = nullptr>
inline auto at(Matrix&& mat, Tuple index) -> decltype(mat[0][0])& {
return mat[std::get<0>(index)][std::get<1>(index)];
}
//! at(cube, Tuple{z, y, x}) returns cube[z][y][x]
template <class Cube, class Tuple, std::enable_if_t<std::tuple_size<Tuple>::value == 3, std::nullptr_t> = nullptr>
inline auto at(Cube&& cube, Tuple index) -> decltype(cube[0][0][0])& {
return cube[std::get<0>(index)][std::get<1>(index)][std::get<2>(index)];
}
} // namespace arumakan
#line 6 "test/helloworld/at.test.cpp"
void at_test_dim1_a() {
using arumakan::at;
constexpr int W = 5;
int a[W];
for (int i = 0; i < W; ++i) {
at(a, i) = i;
assert(&at(a, i) == &a[i]);
assert(a[i] == i);
}
std::clog << __func__ << " : OK" << std::endl;
}
void at_test_dim1_b() {
using arumakan::at;
constexpr int W = 5;
int a[W];
using P1 = std::array<int, 1>;
using P2 = std::tuple<int>;
for (int i = 0; i < W; ++i) {
at(a, P1{i}) = i;
assert(a[i] == i);
assert(&at(a, P1{i}) == &a[i]);
assert(&at(a, P2{i}) == &a[i]);
}
std::clog << __func__ << " : OK" << std::endl;
}
void at_test_dim2() {
using arumakan::at;
constexpr int H = 3;
constexpr int W = 4;
int a[H][W];
using P1 = std::array<int, 2>;
using P2 = std::pair<int, int>;
using P3 = std::tuple<int, int>;
for (int i = 0; i < H; ++i) {
for (int j = 0; j < W; ++j) {
at(a, P1{i, j}) = i * W + j;
assert(a[i][j] == i * W + j);
assert(&at(a, P1{i, j}) == &a[i][j]);
assert(&at(a, P2{i, j}) == &a[i][j]);
assert(&at(a, P3{i, j}) == &a[i][j]);
}
}
std::clog << __func__ << " : OK" << std::endl;
}
void at_test_dim3() {
using arumakan::at;
constexpr int D = 3;
constexpr int H = 3;
constexpr int W = 4;
int a[D][H][W];
using P1 = std::array<int, 3>;
using P2 = std::tuple<int, int, int>;
for (int z = 0; z < D; ++z) {
for (int y = 0; y < H; ++y) {
for (int x = 0; x < W; ++x) {
at(a, P1{z, y, x}) = (z * H * W) + (y * H) + (x);
assert(a[z][y][x] == (z * H * W) + (y * H) + (x));
assert(&at(a, P1{z, y, x}) == &a[z][y][x]);
assert(&at(a, P2{z, y, x}) == &a[z][y][x]);
}
}
}
std::clog << __func__ << " : OK" << std::endl;
}
int main() {
std::cout << "Hello World" << std::endl;
at_test_dim1_a();
at_test_dim1_b();
at_test_dim2();
at_test_dim3();
return 0;
}
Back to top page