#include <iostream>
#include <vector>
#include <stddef.h>
class tensor
{
std::vector<int> data;
size_t depth;
size_t height;
size_t width;
public:
tensor(size_t depth, size_t height, size_t width)
: data(depth * height * width), depth(depth), height(height), width(width) {}
int& operator()(int z, int y, int x)
{
return data[(z * height + y) * width + x];
}
int operator()(int z, int y, int x) const
{
return data[(z * height + y) * width + x];
}
int* raw_pointer_for_gpu()
{
return &data[0];
}
};
int main()
{
tensor test(2, 3, 5);
std::cout << "Should be contiguous:\n";
for (int z = 0; z < 2; ++z)
{
for (int y = 0; y < 3; ++y)
{
for (int x = 0; x < 5; ++x)
{
std::cout << &test(z, y, x) << '\n';
}
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RkZGVmLmg+CgpjbGFzcyB0ZW5zb3IKewogICAgc3RkOjp2ZWN0b3I8aW50PiBkYXRhOwogICAgc2l6ZV90IGRlcHRoOwogICAgc2l6ZV90IGhlaWdodDsKICAgIHNpemVfdCB3aWR0aDsKCnB1YmxpYzoKCiAgICB0ZW5zb3Ioc2l6ZV90IGRlcHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgd2lkdGgpCiAgICA6IGRhdGEoZGVwdGggKiBoZWlnaHQgKiB3aWR0aCksIGRlcHRoKGRlcHRoKSwgaGVpZ2h0KGhlaWdodCksIHdpZHRoKHdpZHRoKSB7fQoKICAgIGludCYgb3BlcmF0b3IoKShpbnQgeiwgaW50IHksIGludCB4KQogICAgewogICAgICAgIHJldHVybiBkYXRhWyh6ICogaGVpZ2h0ICsgeSkgKiB3aWR0aCArIHhdOwogICAgfQoKICAgIGludCBvcGVyYXRvcigpKGludCB6LCBpbnQgeSwgaW50IHgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIGRhdGFbKHogKiBoZWlnaHQgKyB5KSAqIHdpZHRoICsgeF07CiAgICB9CgogICAgaW50KiByYXdfcG9pbnRlcl9mb3JfZ3B1KCkKICAgIHsKICAgICAgICByZXR1cm4gJmRhdGFbMF07CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHRlbnNvciB0ZXN0KDIsIDMsIDUpOwogICAgc3RkOjpjb3V0IDw8ICJTaG91bGQgYmUgY29udGlndW91czpcbiI7CiAgICBmb3IgKGludCB6ID0gMDsgeiA8IDI7ICsreikKICAgIHsKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDM7ICsreSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgNTsgKyt4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgJnRlc3QoeiwgeSwgeCkgPDwgJ1xuJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQo=