#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <memory.h>
#include <stdbool.h>
//#include <crtdbg.h>//vc only
typedef struct Hoge {
int32_t* p;
size_t N;
int32_t*(*Index)(struct Hoge*, size_t);
bool(*Resize)(struct Hoge*, size_t);
void(*Destruct)(struct Hoge*);
}Hoge;
static int32_t* Idx(Hoge* H, size_t N) {
if (H->N <= N) return NULL;
return &H->p[N];
}
static bool Rsz(Hoge* H, size_t N) {
int32_t *P = NULL;
size_t C = H->N;
if (H->N == N)return false;
P
= calloc(N
, sizeof(int32_t)); if (P != NULL) {
if (C > N)C = N;
//memcpy_s(P, N * sizeof(int32_t), H->p, C * sizeof(int32_t));
memcpy(P
, H
->p
, C
* sizeof(int32_t)); H->p = P;
H->N = N;
}
else {
return false;
}
return true;
}
static void DestructHoge(Hoge* H) {
H->p = NULL;
H->N = 0;
return;
}
Hoge ConsutructHoge(size_t N) {
Hoge H;
H.Index = Idx;
H.Resize = Rsz;
H.Destruct = DestructHoge;
H.
p = calloc(N
, sizeof(int32_t)); H.N = 0;
if (H.p != NULL) H.N = N;
return H;
}
int main() {
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
Hoge H = ConsutructHoge(16);
(*H.Index(&H, 8)) = 256;
for (size_t i = 0; i < H.N; i++) {
printf("%d ", (*H.
Index(&H
, i
))); }
H.Resize(&H, 32);
(*H.Index(&H, 7)) = 256;
for (size_t i = 0; i < H.N; i++) {
printf("%d ", (*H.
Index(&H
, i
))); }
H.Resize(&H, 8);
for (size_t i = 0; i < H.N; i++) {
printf("%d ", (*H.
Index(&H
, i
))); }
H.Destruct(&H);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWVtb3J5Lmg+CiNpbmNsdWRlIDxzdGRib29sLmg+Ci8vI2luY2x1ZGUgPGNydGRiZy5oPi8vdmMgb25seQp0eXBlZGVmIHN0cnVjdCBIb2dlIHsKCWludDMyX3QqIHA7CglzaXplX3QgTjsKCglpbnQzMl90KigqSW5kZXgpKHN0cnVjdCBIb2dlKiwgc2l6ZV90KTsKCWJvb2woKlJlc2l6ZSkoc3RydWN0IEhvZ2UqLCBzaXplX3QpOwoJdm9pZCgqRGVzdHJ1Y3QpKHN0cnVjdCBIb2dlKik7Cn1Ib2dlOwoKc3RhdGljIGludDMyX3QqIElkeChIb2dlKiBILCBzaXplX3QgTikgewoJaWYgKEgtPk4gPD0gTikgcmV0dXJuIE5VTEw7CgoJcmV0dXJuICZILT5wW05dOwp9CgpzdGF0aWMgYm9vbCBSc3ooSG9nZSogSCwgc2l6ZV90IE4pIHsKCWludDMyX3QgKlAgPSBOVUxMOwoJc2l6ZV90IEMgPSBILT5OOwoKCWlmIChILT5OID09IE4pcmV0dXJuIGZhbHNlOwoKCVAgPSBjYWxsb2MoTiwgc2l6ZW9mKGludDMyX3QpKTsKCWlmIChQICE9IE5VTEwpIHsKCQlpZiAoQyA+IE4pQyA9IE47CgkJLy9tZW1jcHlfcyhQLCBOICogc2l6ZW9mKGludDMyX3QpLCBILT5wLCBDICogc2l6ZW9mKGludDMyX3QpKTsKCQltZW1jcHkoUCwgSC0+cCwgQyAqIHNpemVvZihpbnQzMl90KSk7CgkJZnJlZShILT5wKTsKCQlILT5wID0gUDsKCQlILT5OID0gTjsKCX0KCWVsc2UgewoJCXJldHVybiBmYWxzZTsKCX0KCXJldHVybiB0cnVlOwp9CnN0YXRpYyB2b2lkIERlc3RydWN0SG9nZShIb2dlKiBIKSB7CgoJZnJlZShILT5wKTsKCUgtPnAgPSBOVUxMOwoJSC0+TiA9IDA7CglyZXR1cm47Cn0KCkhvZ2UgQ29uc3V0cnVjdEhvZ2Uoc2l6ZV90IE4pIHsKCUhvZ2UgSDsKCUguSW5kZXggPSBJZHg7CglILlJlc2l6ZSA9IFJzejsKCUguRGVzdHJ1Y3QgPSBEZXN0cnVjdEhvZ2U7CgoJSC5wID0gY2FsbG9jKE4sIHNpemVvZihpbnQzMl90KSk7CglILk4gPSAwOwoJaWYgKEgucCAhPSBOVUxMKSBILk4gPSBOOwoKCXJldHVybiBIOwp9CgppbnQgbWFpbigpIHsKCS8vX0NydFNldERiZ0ZsYWcoX0NSVERCR19BTExPQ19NRU1fREYgfCBfQ1JUREJHX0xFQUtfQ0hFQ0tfREYpOwoJSG9nZSBIID0gQ29uc3V0cnVjdEhvZ2UoMTYpOwoKCSgqSC5JbmRleCgmSCwgOCkpID0gMjU2OwoKCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgSC5OOyBpKyspIHsKCQlwcmludGYoIiVkICIsICgqSC5JbmRleCgmSCwgaSkpKTsKCX0KCXByaW50ZigiXG4iKTsKCUguUmVzaXplKCZILCAzMik7CgkoKkguSW5kZXgoJkgsIDcpKSA9IDI1NjsKCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgSC5OOyBpKyspIHsKCQlwcmludGYoIiVkICIsICgqSC5JbmRleCgmSCwgaSkpKTsKCX0KCXByaW50ZigiXG4iKTsKCUguUmVzaXplKCZILCA4KTsKCglmb3IgKHNpemVfdCBpID0gMDsgaSA8IEguTjsgaSsrKSB7CgkJcHJpbnRmKCIlZCAiLCAoKkguSW5kZXgoJkgsIGkpKSk7Cgl9CglwcmludGYoIlxuIik7CglILkRlc3RydWN0KCZIKTsKCglyZXR1cm4gMDsKCn0=