#include <iostream>
#include <new>
#include <cstring>
using namespace std;
template <typename STRUCT, typename TYPE> class flex_struct {
flex_struct(){}
public:
//should be safe to access and check what length the array is
static STRUCT* head(char*buff) {
//is this next line wrong?
//if((alignof(STRUCT)%reinterpret_cast<size_t>(buff))!=0) { throw std::exception(); }
return reinterpret_cast<STRUCT*>(buff);
}
struct struct_with_array : public STRUCT { TYPE buf[1]; };
TYPE* buff() {
//if(length==0) { throw std::exception(); }
auto p = reinterpret_cast<struct_with_array*>(this);
return p->buf;
}
};
typedef short testtype;
struct MyVariableLengthStruct : public flex_struct<MyVariableLengthStruct, testtype> {
int a, b;
char c;
};
struct MyVariableLengthStruct2 {
int a, b;
char c;
testtype buf[1];
};
struct MyVariableLengthStruct3a {
int a, b;
char c;
};
struct MyVariableLengthStruct3 : MyVariableLengthStruct3a {
testtype buf[1];
};
int main() {
auto srcarray=new char[1024];
memset(srcarray, 0, sizeof(srcarray)); //whats a C++ way to do this w/o writing a loop or function?
auto v = MyVariableLengthStruct::head(srcarray);
auto buff = v->buff();
auto dif1 = (int)buff-(int)v;
printf("%X %X %d\n", v, buff, dif1);
MyVariableLengthStruct2 v2;
auto dif2 = (int)v2.buf-(int)&v2;
printf("%X %X %d\n", &v2, v2.buf, dif2);
MyVariableLengthStruct3 v3;
auto dif3 = (int)v3.buf-(int)&v3;
printf("%X %X %d\n", &v3, v3.buf, dif3);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bmV3PgojaW5jbHVkZSA8Y3N0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgU1RSVUNULCB0eXBlbmFtZSBUWVBFPiBjbGFzcyBmbGV4X3N0cnVjdCB7CglmbGV4X3N0cnVjdCgpe30KcHVibGljOgoJLy9zaG91bGQgYmUgc2FmZSB0byBhY2Nlc3MgYW5kIGNoZWNrIHdoYXQgbGVuZ3RoIHRoZSBhcnJheSBpcwoJc3RhdGljIFNUUlVDVCogaGVhZChjaGFyKmJ1ZmYpIHsKCQkvL2lzIHRoaXMgbmV4dCBsaW5lIHdyb25nPwoJCS8vaWYoKGFsaWdub2YoU1RSVUNUKSVyZWludGVycHJldF9jYXN0PHNpemVfdD4oYnVmZikpIT0wKSB7IHRocm93IHN0ZDo6ZXhjZXB0aW9uKCk7IH0KCQlyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTVFJVQ1QqPihidWZmKTsKCX0KCQoJc3RydWN0IHN0cnVjdF93aXRoX2FycmF5IDogcHVibGljIFNUUlVDVCB7IFRZUEUgYnVmWzFdOyB9OwoKCVRZUEUqIGJ1ZmYoKSB7CgkJLy9pZihsZW5ndGg9PTApIHsgdGhyb3cgc3RkOjpleGNlcHRpb24oKTsgfQoJCWF1dG8gcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0X3dpdGhfYXJyYXkqPih0aGlzKTsKCQlyZXR1cm4gcC0+YnVmOwoJfQp9OwoKdHlwZWRlZiBzaG9ydCB0ZXN0dHlwZTsKCnN0cnVjdCBNeVZhcmlhYmxlTGVuZ3RoU3RydWN0IDogcHVibGljIGZsZXhfc3RydWN0PE15VmFyaWFibGVMZW5ndGhTdHJ1Y3QsIHRlc3R0eXBlPiB7CglpbnQgYSwgYjsKCWNoYXIgYzsKfTsKCnN0cnVjdCBNeVZhcmlhYmxlTGVuZ3RoU3RydWN0MiB7CglpbnQgYSwgYjsKCWNoYXIgYzsKCXRlc3R0eXBlIGJ1ZlsxXTsKfTsKc3RydWN0IE15VmFyaWFibGVMZW5ndGhTdHJ1Y3QzYSB7CglpbnQgYSwgYjsKCWNoYXIgYzsKfTsKc3RydWN0IE15VmFyaWFibGVMZW5ndGhTdHJ1Y3QzIDogTXlWYXJpYWJsZUxlbmd0aFN0cnVjdDNhIHsKCXRlc3R0eXBlIGJ1ZlsxXTsKfTsKaW50IG1haW4oKSB7CgoJYXV0byBzcmNhcnJheT1uZXcgY2hhclsxMDI0XTsKCW1lbXNldChzcmNhcnJheSwgMCwgc2l6ZW9mKHNyY2FycmF5KSk7IC8vd2hhdHMgYSBDKysgd2F5IHRvIGRvIHRoaXMgdy9vIHdyaXRpbmcgYSBsb29wIG9yIGZ1bmN0aW9uPwoJYXV0byB2ID0gTXlWYXJpYWJsZUxlbmd0aFN0cnVjdDo6aGVhZChzcmNhcnJheSk7CglhdXRvIGJ1ZmYgPSB2LT5idWZmKCk7CglhdXRvIGRpZjEgPSAoaW50KWJ1ZmYtKGludCl2OwoJcHJpbnRmKCIlWCAlWCAlZFxuIiwgdiwgYnVmZiwgZGlmMSk7CglNeVZhcmlhYmxlTGVuZ3RoU3RydWN0MiB2MjsKCWF1dG8gZGlmMiA9IChpbnQpdjIuYnVmLShpbnQpJnYyOwoJcHJpbnRmKCIlWCAlWCAlZFxuIiwgJnYyLCB2Mi5idWYsIGRpZjIpOwoJTXlWYXJpYWJsZUxlbmd0aFN0cnVjdDMgdjM7CglhdXRvIGRpZjMgPSAoaW50KXYzLmJ1Zi0oaW50KSZ2MzsKCXByaW50ZigiJVggJVggJWRcbiIsICZ2MywgdjMuYnVmLCBkaWYzKTsKfQo=