File: test_extents.cpp

package info (click to toggle)
gridtools 2.3.9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 29,480 kB
  • sloc: cpp: 228,792; python: 17,561; javascript: 9,164; ansic: 4,101; sh: 850; makefile: 231; f90: 201
file content (97 lines) | stat: -rw-r--r-- 3,743 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * GridTools
 *
 * Copyright (c) 2014-2023, ETH Zurich
 * All rights reserved.
 *
 * Please, refer to the LICENSE file in the root directory.
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <gridtools/fn/extents.hpp>

#include <type_traits>

#include <gtest/gtest.h>

#include <gridtools/common/hymap.hpp>
#include <gridtools/common/integral_constant.hpp>

namespace gridtools::fn {
    // This file is included in another file (test_extents.cu)
    // that is why we should not use unnamed namespaces here to avoid ODR violation.
    namespace test_extents_cpp {
        using namespace literals;
        struct a {};
        struct b {};
        struct c {};

        static_assert(is_extent<extent<a, 0, 0>>::value);
        static_assert(is_extent<extent<a, -1, 1>>::value);
        static_assert(!is_extent<a>::value);
        static_assert(!is_extent<extent<a, 1, 0>>::value);

        static_assert(is_extents<extents<extent<a, 0, 0>, extent<b, 0, 0>>>::value);
        static_assert(!is_extents<extents<extent<a, 0, 0>, extent<a, 0, 0>>>::value);
        static_assert(!is_extents<extents<void>>::value);
        static_assert(!is_extents<a>::value);

        namespace extents_offsets {
            using testee = decltype(extents<extent<a, -1, 0>, extent<b, 0, 2>>::offsets());

            static_assert(!has_key<testee, b>::value);
            static_assert(element_at<a, testee>::value == -1);
        } // namespace extents_offsets

        namespace extents_sizes {
            using testee = decltype(extents<extent<a, -1, 0>, extent<b, 0, 2>, extent<c, 1, 1>>::sizes());

            static_assert(!has_key<testee, c>::value);
            static_assert(element_at<a, testee>::value == 1);
            static_assert(element_at<b, testee>::value == 2);
        } // namespace extents_sizes

        TEST(extents, extend_offsets) {
            using ext = extents<extent<a, -1, 0>, extent<b, 0, 2>, extent<c, 1, 1>>;
            auto offsets = hymap::keys<a, b, c>::make_values(0, 1, 2);

            auto testee = extend_offsets<ext>(offsets);

            EXPECT_EQ(at_key<a>(testee), -1);
            EXPECT_EQ(at_key<b>(testee), 1);
            EXPECT_EQ(at_key<c>(testee), 3);
        }

        TEST(extents, extend_sizes) {
            using ext = extents<extent<a, -1, 0>, extent<b, 0, 2>, extent<c, 1, 1>>;
            auto sizes = hymap::keys<a, b, c>::make_values(4, 5, 6);

            auto testee = extend_sizes<ext>(sizes);

            EXPECT_EQ(at_key<a>(testee), 5);
            EXPECT_EQ(at_key<b>(testee), 7);
            EXPECT_EQ(at_key<c>(testee), 6);
        }

        namespace extends_make_extends {
            using testee = make_extents<extent<a, -1, 1>, extent<b, -1, 1>, extent<a, -2, 0>, extent<b, 0, 3>>;

            static_assert(element_at<a, testee::offsets_t>::value == -2);
            static_assert(element_at<a, testee::sizes_t>::value == 3);
            static_assert(element_at<b, testee::offsets_t>::value == -1);
            static_assert(element_at<b, testee::sizes_t>::value == 4);
        } // namespace extends_make_extends

        namespace extents_enclosing_extents {
            using foo = extents<extent<a, -1, 1>, extent<b, -1, 1>>;
            using bar = extents<extent<a, -2, 0>, extent<b, 0, 3>>;
            using testee = enclosing_extents<foo, bar>;

            static_assert(element_at<a, testee::offsets_t>::value == -2);
            static_assert(element_at<a, testee::sizes_t>::value == 3);
            static_assert(element_at<b, testee::offsets_t>::value == -1);
            static_assert(element_at<b, testee::sizes_t>::value == 4);
        } // namespace extents_enclosing_extents

    } // namespace test_extents_cpp
} // namespace gridtools::fn