namespace NAlignOf
{
template <class TType>
struct TSizeIncrement: TType
{
char Increment;
};
template <class TType, unsigned Start, bool Stop>
struct TIncreaseSizeImpl: TIncreaseSizeImpl<TSizeIncrement<TType>, Start,
sizeof(TSizeIncrement<TType>) != Start>
{
};
template <class TType, unsigned Start>
struct TIncreaseSizeImpl<TType, Start, true>
{
typedef TType TType_;
};
template <class TType>
struct TIncreaseSize: TIncreaseSizeImpl<TType, sizeof(TType), false>
{
};
template <class TType>
struct TAlignOf
{
typedef typename TIncreaseSize<TType>::TType_ TIncreased_;
static const unsigned Value_ =
sizeof(typename TIncreaseSize<TIncreased_>::TType_)
- sizeof(TIncreased_);
};
}
#include <iostream>
struct S0
{
char c;
};
struct S1
{
char c;
short s;
};
struct S2
{
char c;
int i;
char c2;
};
struct S3
{
char c;
char c2;
int i;
};
struct S4
{
double d;
};
struct S5
{
char c;
long double d;
}__attribute__((packed));
int main()
{
std::cout << NAlignOf::TAlignOf<S0>::Value_ << std::endl;
std::cout << NAlignOf::TAlignOf<S1>::Value_ << std::endl;
std::cout << NAlignOf::TAlignOf<S2>::Value_ << std::endl;
std::cout << NAlignOf::TAlignOf<S3>::Value_ << std::endl;
std::cout << NAlignOf::TAlignOf<S4>::Value_ << std::endl;
std::cout << NAlignOf::TAlignOf<S5>::Value_ << std::endl;
}
bmFtZXNwYWNlIE5BbGlnbk9mCnsKICAgIHRlbXBsYXRlIDxjbGFzcyBUVHlwZT4KICAgIHN0cnVjdCBUU2l6ZUluY3JlbWVudDogVFR5cGUKICAgIHsKICAgICAgICBjaGFyIEluY3JlbWVudDsKICAgIH07CgogICAgdGVtcGxhdGUgPGNsYXNzIFRUeXBlLCB1bnNpZ25lZCBTdGFydCwgYm9vbCBTdG9wPgogICAgc3RydWN0IFRJbmNyZWFzZVNpemVJbXBsOiBUSW5jcmVhc2VTaXplSW1wbDxUU2l6ZUluY3JlbWVudDxUVHlwZT4sIFN0YXJ0LAogICAgICAgIHNpemVvZihUU2l6ZUluY3JlbWVudDxUVHlwZT4pICE9IFN0YXJ0PgogICAgewogICAgfTsKCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgVFR5cGUsIHVuc2lnbmVkIFN0YXJ0PgogICAgc3RydWN0IFRJbmNyZWFzZVNpemVJbXBsPFRUeXBlLCBTdGFydCwgdHJ1ZT4KICAgIHsKICAgICAgICB0eXBlZGVmIFRUeXBlIFRUeXBlXzsKICAgIH07CgogICAgdGVtcGxhdGUgPGNsYXNzIFRUeXBlPgogICAgc3RydWN0IFRJbmNyZWFzZVNpemU6IFRJbmNyZWFzZVNpemVJbXBsPFRUeXBlLCBzaXplb2YoVFR5cGUpLCBmYWxzZT4KICAgIHsKICAgIH07CgogICAgdGVtcGxhdGUgPGNsYXNzIFRUeXBlPgogICAgc3RydWN0IFRBbGlnbk9mCiAgICB7CiAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUSW5jcmVhc2VTaXplPFRUeXBlPjo6VFR5cGVfIFRJbmNyZWFzZWRfOwogICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBWYWx1ZV8gPQogICAgICAgICAgICBzaXplb2YodHlwZW5hbWUgVEluY3JlYXNlU2l6ZTxUSW5jcmVhc2VkXz46OlRUeXBlXykKICAgICAgICAgICAgLSBzaXplb2YoVEluY3JlYXNlZF8pOwogICAgfTsKfQoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFMwCnsKICAgIGNoYXIgYzsKfTsKCnN0cnVjdCBTMQp7CiAgICBjaGFyIGM7CiAgICBzaG9ydCBzOwp9OwoKc3RydWN0IFMyCnsKICAgIGNoYXIgYzsKICAgIGludCBpOwogICAgY2hhciBjMjsKfTsKCnN0cnVjdCBTMwp7CiAgICBjaGFyIGM7CiAgICBjaGFyIGMyOwogICAgaW50IGk7Cn07CgpzdHJ1Y3QgUzQKewogICAgZG91YmxlIGQ7Cn07CgpzdHJ1Y3QgUzUKewogICAgY2hhciBjOwogICAgbG9uZyBkb3VibGUgZDsKfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgTkFsaWduT2Y6OlRBbGlnbk9mPFMwPjo6VmFsdWVfIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBOQWxpZ25PZjo6VEFsaWduT2Y8UzE+OjpWYWx1ZV8gPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IE5BbGlnbk9mOjpUQWxpZ25PZjxTMj46OlZhbHVlXyA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgTkFsaWduT2Y6OlRBbGlnbk9mPFMzPjo6VmFsdWVfIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBOQWxpZ25PZjo6VEFsaWduT2Y8UzQ+OjpWYWx1ZV8gPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IE5BbGlnbk9mOjpUQWxpZ25PZjxTNT46OlZhbHVlXyA8PCBzdGQ6OmVuZGw7Cn0KCg==