#include <iostream>
#include <cstdint>
#include <cstddef>
using std::size_t;
struct head_t { size_t size; int data[]; };
int* make_intarray(size_t const size) {
head_t* h = static_cast<head_t*>(::operator new(sizeof(head_t) + size * sizeof(int)));
h->size = size;
return h->data;
}
void unmake_intarray(int* array) {
::operator delete(static_cast<void*>(array) - offsetof(head_t, data));
}
size_t get_intarray_size(int const*const begin) {
return static_cast<head_t const*>(static_cast<void const*>(begin) - offsetof(head_t, data))->size;
}
int main() {
int* my_10_ints = make_intarray(10);
// Oh noez! I forgot 10!
size_t what_was_10_again = get_intarray_size(my_10_ints);
::std::cout << what_was_10_again << "\n";
unmake_intarray(my_10_ints);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGNzdGRkZWY+CnVzaW5nIHN0ZDo6c2l6ZV90OwoKc3RydWN0IGhlYWRfdCB7IHNpemVfdCBzaXplOyBpbnQgZGF0YVtdOyB9OwoKaW50KiBtYWtlX2ludGFycmF5KHNpemVfdCBjb25zdCBzaXplKSB7CgloZWFkX3QqIGggPSBzdGF0aWNfY2FzdDxoZWFkX3QqPig6Om9wZXJhdG9yIG5ldyhzaXplb2YoaGVhZF90KSArIHNpemUgKiBzaXplb2YoaW50KSkpOwoJaC0+c2l6ZSA9IHNpemU7CglyZXR1cm4gaC0+ZGF0YTsKfQoKdm9pZCB1bm1ha2VfaW50YXJyYXkoaW50KiBhcnJheSkgewoJOjpvcGVyYXRvciBkZWxldGUoc3RhdGljX2Nhc3Q8dm9pZCo+KGFycmF5KSAtIG9mZnNldG9mKGhlYWRfdCwgZGF0YSkpOwp9CgpzaXplX3QgZ2V0X2ludGFycmF5X3NpemUoaW50IGNvbnN0KmNvbnN0IGJlZ2luKSB7CglyZXR1cm4gc3RhdGljX2Nhc3Q8aGVhZF90IGNvbnN0Kj4oc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJlZ2luKSAtIG9mZnNldG9mKGhlYWRfdCwgZGF0YSkpLT5zaXplOwp9CgppbnQgbWFpbigpIHsKCWludCogbXlfMTBfaW50cyA9IG1ha2VfaW50YXJyYXkoMTApOwoJLy8gT2ggbm9leiEgSSBmb3Jnb3QgMTAhCglzaXplX3Qgd2hhdF93YXNfMTBfYWdhaW4gPSBnZXRfaW50YXJyYXlfc2l6ZShteV8xMF9pbnRzKTsKCTo6c3RkOjpjb3V0IDw8IHdoYXRfd2FzXzEwX2FnYWluIDw8ICJcbiI7Cgl1bm1ha2VfaW50YXJyYXkobXlfMTBfaW50cyk7Cn0=