#include <iostream>
#include <cstddef>
#include <new>
#include <string.h>
template <typename T>
struct infinite_array {
infinite_array();
auto operator[](unsigned long long idx) -> T&;
auto size() const -> unsigned long long;
void resize(unsigned long long idx);
private:
T *data;
unsigned long long array_length;
};
template <typename T>
void infinite_array<T> :: resize(unsigned long long idx)
{
std::cout << "Resize with idx " << idx << std::endl;
T *temp = new T[idx];
memset(temp, 0, sizeof(T)*idx);
for(int i = 0; i < array_length; ++i) {
temp[i] = data[i];
std::cout << temp[i] << " ";
}
std::cout << std::endl;
//std::copy(data, data+size(), temp);
delete [] data;
data = temp;
array_length = idx;
}
template <typename T>
infinite_array<T> :: infinite_array()
{
data = NULL;
array_length = 0;
}
template <typename T>
auto infinite_array<T> :: size() const -> unsigned long long {
//array_length = sizeof(data)/sizeof(T);
return array_length;
}
template <typename T>
auto infinite_array<T> :: operator[](unsigned long long idx) -> T& {
//std::cout << "Accessing element at idx " << idx << std::endl;
if(idx+1 > size()) {
resize(idx+1);
}
return data[idx];
}
int main() {
infinite_array<int> ar;
for(int i = 0; i < 10; ++i) {
ar[i] = i;
}
ar[30] = ar[31] = 10;
for(int i = 0; i < ar.size(); ++i)
std::cout << ar[i] << ' ';
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGRlZj4KI2luY2x1ZGUgPG5ldz4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBpbmZpbml0ZV9hcnJheSB7CiAgICBpbmZpbml0ZV9hcnJheSgpOwogICAgYXV0byBvcGVyYXRvcltdKHVuc2lnbmVkIGxvbmcgbG9uZyBpZHgpIC0+IFQmOwoKICAgIGF1dG8gc2l6ZSgpIGNvbnN0IC0+IHVuc2lnbmVkIGxvbmcgbG9uZzsKICAgIHZvaWQgcmVzaXplKHVuc2lnbmVkIGxvbmcgbG9uZyBpZHgpOwoKICAgIHByaXZhdGU6CiAgICAgICAgVCAqZGF0YTsKICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgYXJyYXlfbGVuZ3RoOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgaW5maW5pdGVfYXJyYXk8VD4gOjogcmVzaXplKHVuc2lnbmVkIGxvbmcgbG9uZyBpZHgpCnsKICAgIHN0ZDo6Y291dCA8PCAiUmVzaXplIHdpdGggaWR4ICIgPDwgaWR4IDw8IHN0ZDo6ZW5kbDsKICAgIFQgKnRlbXAgPSBuZXcgVFtpZHhdOwogICAgbWVtc2V0KHRlbXAsIDAsIHNpemVvZihUKSppZHgpOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhcnJheV9sZW5ndGg7ICsraSkgewogICAgICAgICAgICB0ZW1wW2ldID0gZGF0YVtpXTsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICB0ZW1wW2ldIDw8ICIgIjsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7IAogICAgLy9zdGQ6OmNvcHkoZGF0YSwgZGF0YStzaXplKCksIHRlbXApOwogICAgZGVsZXRlIFtdIGRhdGE7CgogICAgZGF0YSA9IHRlbXA7CiAgICBhcnJheV9sZW5ndGggPSBpZHg7Cgp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KaW5maW5pdGVfYXJyYXk8VD4gOjogaW5maW5pdGVfYXJyYXkoKSAKewogICAgZGF0YSA9IE5VTEw7CiAgICBhcnJheV9sZW5ndGggPSAwOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KYXV0byBpbmZpbml0ZV9hcnJheTxUPiA6OiBzaXplKCkgY29uc3QgLT4gdW5zaWduZWQgbG9uZyBsb25nIHsKICAgIC8vYXJyYXlfbGVuZ3RoID0gc2l6ZW9mKGRhdGEpL3NpemVvZihUKTsKICAgIHJldHVybiBhcnJheV9sZW5ndGg7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgphdXRvIGluZmluaXRlX2FycmF5PFQ+IDo6IG9wZXJhdG9yW10odW5zaWduZWQgbG9uZyBsb25nIGlkeCkgLT4gVCYgewogICAgLy9zdGQ6OmNvdXQgPDwgIkFjY2Vzc2luZyBlbGVtZW50IGF0IGlkeCAiIDw8IGlkeCA8PCBzdGQ6OmVuZGw7CiAgICBpZihpZHgrMSA+IHNpemUoKSkgewogICAgICAgIHJlc2l6ZShpZHgrMSk7ICAKICAgIH0KICAgIHJldHVybiBkYXRhW2lkeF07Cn0KCgppbnQgbWFpbigpIHsKICAgIGluZmluaXRlX2FycmF5PGludD4gYXI7IAogICAgZm9yKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKICAgICAgICBhcltpXSA9IGk7CiAgICB9CiAgIAogICAgYXJbMzBdID0gYXJbMzFdID0gMTA7CgoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhci5zaXplKCk7ICsraSkKICAgICAgICBzdGQ6OmNvdXQgPDwgYXJbaV0gPDwgJyAnOyAgCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9