Link Search Menu Expand Document
あるまかんライブラリ

:heavy_check_mark: 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