#include <array>
#include <iostream>
#include <vector>
#include <cassert>
#include <cmath>
#include <cstdint>
struct vertex
{
std::array<double, 3> vector_;
std::uint32_t color_;
double & operator () (std::size_t index) { assert(index < 3); return vector_[index]; }
double operator () (std::size_t index) const { assert(index < 3); return vector_[index]; }
double abs() const
{
return std::sqrt(
vector_[0] * vector_[0] +
vector_[1] * vector_[1] +
vector_[2] * vector_[2]
);
}
// turns RGBA value to gray, alpha channel is ignored for this
std::uint32_t gray() const
{
std::uint8_t g =
((color_ >> 24) +
((color_ >> 16) & 0xFF) +
((color_ >> 8) & 0xFF)) / 3;
return ((g << 24) | (g << 16) | (g << 8) | (color_ & 0xFF));
}
};
class field
{
public:
// the explicit prevents std::size_t's to be implicitely cast into fields ;-)
explicit field(std::size_t size)
: vertices_(size)
{
}
vertex & operator() (std::size_t index) { assert(index < vertices_.size()); return vertices_[index]; }
vertex operator() (std::size_t index) const { assert(index < vertices_.size()); return vertices_[index]; }
private:
// this is still pretty contigous
std::vector<vertex> vertices_;
};
int main()
{
field f(2);
vertex & v = f(1);
v(2) = 5;
// also: this is a copy of v, so changing v2 will not affect f[1][2]
vertex v2 = v;
v2(2) = 2;
std::cout << f(1)(2) << std::endl;
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3N0ZGludD4KCnN0cnVjdCB2ZXJ0ZXgKewoJc3RkOjphcnJheTxkb3VibGUsIDM+IHZlY3Rvcl87CglzdGQ6OnVpbnQzMl90IGNvbG9yXzsKCQoJZG91YmxlICYgb3BlcmF0b3IgKCkgKHN0ZDo6c2l6ZV90IGluZGV4KSB7IGFzc2VydChpbmRleCA8IDMpOyByZXR1cm4gdmVjdG9yX1tpbmRleF07IH0KCWRvdWJsZSBvcGVyYXRvciAoKSAoc3RkOjpzaXplX3QgaW5kZXgpIGNvbnN0IHsgYXNzZXJ0KGluZGV4IDwgMyk7IHJldHVybiB2ZWN0b3JfW2luZGV4XTsgfQoJCglkb3VibGUgYWJzKCkgY29uc3QKCXsKCQlyZXR1cm4gc3RkOjpzcXJ0KAoJCQl2ZWN0b3JfWzBdICogdmVjdG9yX1swXSArCgkJCXZlY3Rvcl9bMV0gKiB2ZWN0b3JfWzFdICsKCQkJdmVjdG9yX1syXSAqIHZlY3Rvcl9bMl0KCQkpOwoJfQoJCgkvLyB0dXJucyBSR0JBIHZhbHVlIHRvIGdyYXksIGFscGhhIGNoYW5uZWwgaXMgaWdub3JlZCBmb3IgdGhpcwoJc3RkOjp1aW50MzJfdCBncmF5KCkgY29uc3QKCXsKCQlzdGQ6OnVpbnQ4X3QgZyA9CgkJCSgoY29sb3JfID4+IDI0KSArCgkJCSgoY29sb3JfID4+IDE2KSAmIDB4RkYpICsKCQkJKChjb2xvcl8gPj4gOCkgJiAweEZGKSkgLyAzOwoJCXJldHVybiAoKGcgPDwgMjQpIHwgKGcgPDwgMTYpIHwgKGcgPDwgOCkgfCAoY29sb3JfICYgMHhGRikpOwoJfQp9OwoKY2xhc3MgZmllbGQKewpwdWJsaWM6CgkvLyB0aGUgZXhwbGljaXQgcHJldmVudHMgc3RkOjpzaXplX3QncyB0byBiZSBpbXBsaWNpdGVseSBjYXN0IGludG8gZmllbGRzIDstKQoJZXhwbGljaXQgZmllbGQoc3RkOjpzaXplX3Qgc2l6ZSkKCQk6IHZlcnRpY2VzXyhzaXplKQoJewoJfQoJCgl2ZXJ0ZXggJiBvcGVyYXRvcigpIChzdGQ6OnNpemVfdCBpbmRleCkgeyBhc3NlcnQoaW5kZXggPCB2ZXJ0aWNlc18uc2l6ZSgpKTsgcmV0dXJuIHZlcnRpY2VzX1tpbmRleF07IH0KCXZlcnRleCBvcGVyYXRvcigpIChzdGQ6OnNpemVfdCBpbmRleCkgY29uc3QgeyBhc3NlcnQoaW5kZXggPCB2ZXJ0aWNlc18uc2l6ZSgpKTsgcmV0dXJuIHZlcnRpY2VzX1tpbmRleF07IH0KCQpwcml2YXRlOgoJLy8gdGhpcyBpcyBzdGlsbCBwcmV0dHkgY29udGlnb3VzCglzdGQ6OnZlY3Rvcjx2ZXJ0ZXg+IHZlcnRpY2VzXzsKfTsKCmludCBtYWluKCkKewogICAgZmllbGQgZigyKTsKICAgIHZlcnRleCAmIHYgPSBmKDEpOwogICAgdigyKSA9IDU7CgoJLy8gYWxzbzogdGhpcyBpcyBhIGNvcHkgb2Ygdiwgc28gY2hhbmdpbmcgdjIgd2lsbCBub3QgYWZmZWN0IGZbMV1bMl0KICAgIHZlcnRleCB2MiA9IHY7CiAgICB2MigyKSA9IDI7CgogICAgc3RkOjpjb3V0IDw8IGYoMSkoMikgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9