#include <array>
#include <iostream>
#include <iterator>
#include <initializer_list>
template <typename T, size_t N>
struct Array
{
private:
T data[N];
public:
constexpr Array(std::initializer_list<T> init)
: data{}
{
if (init.size() > N) {
throw "overflow";
}
using std::begin;
using std::end;
auto dst = begin(data);
for (auto src = begin(init); src != end(init); ++src, ++dst) {
*dst = *src;
}
}
auto begin() const { return std::begin(data); }
auto end() const { return std::end(data); }
};
template <typename T, size_t N>
std::ostream& operator << (std::ostream& output, const Array<T, N>& array)
{
output << "[";
for (auto&& element : array)
output << " " << element;
return output << " ]";
}
int main()
{
static constexpr Array<int, 4> m{-1, -2, -3, -4};
std::cout << m << std::endl;
static constexpr Array<Array<int, 2>, 2> n{{0, 1}, {2, 3}};
std::cout << n << std::endl;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CnN0cnVjdCBBcnJheQp7CnByaXZhdGU6CiAgICBUIGRhdGFbTl07CnB1YmxpYzoKICAgIGNvbnN0ZXhwciBBcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gaW5pdCkKICAgICAgICA6IGRhdGF7fQogICAgeyAgCiAgICAgICAgaWYgKGluaXQuc2l6ZSgpID4gTikgewogICAgICAgICAgICB0aHJvdyAib3ZlcmZsb3ciOwogICAgICAgIH0KICAgICAgICB1c2luZyBzdGQ6OmJlZ2luOwogICAgICAgIHVzaW5nIHN0ZDo6ZW5kOwogICAgICAgIGF1dG8gZHN0ID0gYmVnaW4oZGF0YSk7CiAgICAgICAgZm9yIChhdXRvIHNyYyA9IGJlZ2luKGluaXQpOyBzcmMgIT0gZW5kKGluaXQpOyArK3NyYywgKytkc3QpIHsKICAgICAgICAgICAgKmRzdCA9ICpzcmM7CiAgICAgICAgfQogICAgfQoKICAgIGF1dG8gYmVnaW4oKSBjb25zdCB7IHJldHVybiBzdGQ6OmJlZ2luKGRhdGEpOyB9CiAgICBhdXRvIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6ZW5kKGRhdGEpOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYgb3V0cHV0LCBjb25zdCBBcnJheTxULCBOPiYgYXJyYXkpCnsKICAgb3V0cHV0IDw8ICJbIjsKICAgZm9yIChhdXRvJiYgZWxlbWVudCA6IGFycmF5KQogICAgICBvdXRwdXQgPDwgIiAiIDw8IGVsZW1lbnQ7CgogICByZXR1cm4gb3V0cHV0IDw8ICIgXSI7Cn0KCmludCBtYWluKCkKewogICBzdGF0aWMgY29uc3RleHByIEFycmF5PGludCwgND4gbXstMSwgLTIsIC0zLCAtNH07CiAgIHN0ZDo6Y291dCA8PCBtIDw8IHN0ZDo6ZW5kbDsKICAgc3RhdGljIGNvbnN0ZXhwciBBcnJheTxBcnJheTxpbnQsIDI+LCAyPiBue3swLCAxfSwgezIsIDN9fTsKICAgc3RkOjpjb3V0IDw8IG4gPDwgc3RkOjplbmRsOwp9Cgo=