#include <iostream>
typedef unsigned char byte;
typedef char int8;
typedef unsigned char uint8;
typedef short int16;
typedef unsigned short uint16;
typedef int int32;
typedef unsigned int uint32;
typedef long long int64;
typedef unsigned long long uint64;
typedef float single;
template < byte b0, byte b1, byte b2, byte b3, byte b4 = b0 + 4, byte b5 = b1 + 4, byte b6 = b2 + 4, byte b7 = b3 + 4 >
struct ByteOrder {
const static byte Positions[8];
static int8 Int8 ( int8 value ) {
return Value( value );
}
static int16 Int16 ( int16 value ) {
return Value( value );
}
static int32 Int32 ( int32 value ) {
return Value( value );
}
static int64 Int64 ( int64 value ) {
return Value( value );
}
static uint8 UInt8 ( uint8 value ) {
return Value( value );
}
static uint16 UInt16 ( uint16 value ) {
return Value( value );
}
static uint32 UInt32 ( uint32 value ) {
return Value( value );
}
static uint64 UInt64 ( uint64 value ) {
return Value( value );
}
static single Single ( single value ) {
return Value( value );
}
static double Double ( double value ) {
return Value( value );
}
template <typename T>
static T Value ( T value ) {
T out = 0;
byte* b = (byte*)&value;
byte* bout = (byte*)&out;
for ( size_t p = 0; p < sizeof( value ); ++p ) {
bout[p] = b[ Positions[p] ];
}
return out;
}
};
template < byte b0, byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7>
const byte BaseByteOrder<b0, b1, b2, b3, b4, b5, b6, b7>::Positions[8] = { b0, b1, b2, b3, b4, b5, b6, b7 };
template <int16 order>
struct ByteOrder<order, order, order, order, order, order, order, order> {
const static byte Positions[8];
static int8 Int8 ( int8 value ) {
return Value( value );
}
static int16 Int16 ( int16 value ) {
return Value( value );
}
static int32 Int32 ( int32 value ) {
return Value( value );
}
static int64 Int64 ( int64 value ) {
return Value( value );
}
static uint8 UInt8 ( uint8 value ) {
return Value( value );
}
static uint16 UInt16 ( uint16 value ) {
return Value( value );
}
static uint32 UInt32 ( uint32 value ) {
return Value( value );
}
static uint64 UInt64 ( uint64 value ) {
return Value( value );
}
static single Single ( single value ) {
return Value( value );
}
static double Double ( double value ) {
return Value( value );
}
template <typename T>
static T Value ( T value ) {
T out = 0;
byte* b = (byte*)&value;
byte* bout = (byte*)&out;
for ( size_t p = 0; p < sizeof( value ); ++p ) {
bout[p] = b[ Positions[p] ];
}
return out;
}
};
int main (int argc, char* argv[]) {
std::cout << std::hex;
std::cout << "Argc before: " << argc << std::endl;
std::cout << "Argc with 0x3210: " << ByteOrder<0x3210>::UInt64( argc ) << std::endl;
//std::cout << "Argc with 0x32107654: " << ByteOrder<(int)0x32107654>::UInt64( argc ) << std::endl;
//std::cout << "Argc with 0x76543210: " << ByteOrder<(int)0x76543210>::UInt64( argc ) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJ5dGU7CnR5cGVkZWYgY2hhciBpbnQ4Owp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7CnR5cGVkZWYgc2hvcnQgaW50MTY7CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2Owp0eXBlZGVmIGludCBpbnQzMjsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwp0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0Owp0eXBlZGVmIGZsb2F0IHNpbmdsZTsKCnRlbXBsYXRlIDwgYnl0ZSBiMCwgYnl0ZSBiMSwgYnl0ZSBiMiwgYnl0ZSBiMywgYnl0ZSBiNCA9IGIwICsgNCwgYnl0ZSBiNSA9IGIxICsgNCwgYnl0ZSBiNiA9IGIyICsgNCwgYnl0ZSBiNyA9IGIzICsgNCA+CnN0cnVjdCBCeXRlT3JkZXIgewoJY29uc3Qgc3RhdGljIGJ5dGUgUG9zaXRpb25zWzhdOwoJCglzdGF0aWMgaW50OCBJbnQ4ICggaW50OCB2YWx1ZSApIHsKCQlyZXR1cm4gVmFsdWUoIHZhbHVlICk7Cgl9CgoJc3RhdGljIGludDE2IEludDE2ICggaW50MTYgdmFsdWUgKSB7CgkJcmV0dXJuIFZhbHVlKCB2YWx1ZSApOwoJfQoKCXN0YXRpYyBpbnQzMiBJbnQzMiAoIGludDMyIHZhbHVlICkgewoJCXJldHVybiBWYWx1ZSggdmFsdWUgKTsKCX0KCglzdGF0aWMgaW50NjQgSW50NjQgKCBpbnQ2NCB2YWx1ZSApIHsKCQlyZXR1cm4gVmFsdWUoIHZhbHVlICk7Cgl9CgoJc3RhdGljIHVpbnQ4IFVJbnQ4ICggdWludDggdmFsdWUgKSB7CgkJcmV0dXJuIFZhbHVlKCB2YWx1ZSApOwoJfQoKCXN0YXRpYyB1aW50MTYgVUludDE2ICggdWludDE2IHZhbHVlICkgewoJCXJldHVybiBWYWx1ZSggdmFsdWUgKTsKCX0KCglzdGF0aWMgdWludDMyIFVJbnQzMiAoIHVpbnQzMiB2YWx1ZSApIHsKCQlyZXR1cm4gVmFsdWUoIHZhbHVlICk7Cgl9CgoJc3RhdGljIHVpbnQ2NCBVSW50NjQgKCB1aW50NjQgdmFsdWUgKSB7CgkJcmV0dXJuIFZhbHVlKCB2YWx1ZSApOwoJfQoKCXN0YXRpYyBzaW5nbGUgU2luZ2xlICggc2luZ2xlIHZhbHVlICkgewoJCXJldHVybiBWYWx1ZSggdmFsdWUgKTsKCX0KCglzdGF0aWMgZG91YmxlIERvdWJsZSAoIGRvdWJsZSB2YWx1ZSApIHsKCQlyZXR1cm4gVmFsdWUoIHZhbHVlICk7Cgl9CgoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglzdGF0aWMgVCBWYWx1ZSAoIFQgdmFsdWUgKSB7CgkJVCBvdXQgPSAwOwoJCWJ5dGUqIGIgPSAoYnl0ZSopJnZhbHVlOwoJCWJ5dGUqIGJvdXQgPSAoYnl0ZSopJm91dDsKCQlmb3IgKCBzaXplX3QgcCA9IDA7IHAgPCBzaXplb2YoIHZhbHVlICk7ICsrcCApIHsKCQkJYm91dFtwXSA9IGJbIFBvc2l0aW9uc1twXSBdOwoJCX0KCQlyZXR1cm4gb3V0OwoJfQoKfTsKCnRlbXBsYXRlIDwgYnl0ZSBiMCwgYnl0ZSBiMSwgYnl0ZSBiMiwgYnl0ZSBiMywgYnl0ZSBiNCwgYnl0ZSBiNSwgYnl0ZSBiNiwgYnl0ZSBiNz4KY29uc3QgYnl0ZSBCYXNlQnl0ZU9yZGVyPGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNz46OlBvc2l0aW9uc1s4XSA9IHsgYjAsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3IH07Cgp0ZW1wbGF0ZSA8aW50MTYgb3JkZXI+CnN0cnVjdCBCeXRlT3JkZXI8b3JkZXIsIG9yZGVyLCBvcmRlciwgb3JkZXIsIG9yZGVyLCBvcmRlciwgb3JkZXIsIG9yZGVyPiB7CiAgICBjb25zdCBzdGF0aWMgYnl0ZSBQb3NpdGlvbnNbOF07CiAgICAKCXN0YXRpYyBpbnQ4IEludDggKCBpbnQ4IHZhbHVlICkgewoJCXJldHVybiBWYWx1ZSggdmFsdWUgKTsKCX0KCglzdGF0aWMgaW50MTYgSW50MTYgKCBpbnQxNiB2YWx1ZSApIHsKCQlyZXR1cm4gVmFsdWUoIHZhbHVlICk7Cgl9CgoJc3RhdGljIGludDMyIEludDMyICggaW50MzIgdmFsdWUgKSB7CgkJcmV0dXJuIFZhbHVlKCB2YWx1ZSApOwoJfQoKCXN0YXRpYyBpbnQ2NCBJbnQ2NCAoIGludDY0IHZhbHVlICkgewoJCXJldHVybiBWYWx1ZSggdmFsdWUgKTsKCX0KCglzdGF0aWMgdWludDggVUludDggKCB1aW50OCB2YWx1ZSApIHsKCQlyZXR1cm4gVmFsdWUoIHZhbHVlICk7Cgl9CgoJc3RhdGljIHVpbnQxNiBVSW50MTYgKCB1aW50MTYgdmFsdWUgKSB7CgkJcmV0dXJuIFZhbHVlKCB2YWx1ZSApOwoJfQoKCXN0YXRpYyB1aW50MzIgVUludDMyICggdWludDMyIHZhbHVlICkgewoJCXJldHVybiBWYWx1ZSggdmFsdWUgKTsKCX0KCglzdGF0aWMgdWludDY0IFVJbnQ2NCAoIHVpbnQ2NCB2YWx1ZSApIHsKCQlyZXR1cm4gVmFsdWUoIHZhbHVlICk7Cgl9CgoJc3RhdGljIHNpbmdsZSBTaW5nbGUgKCBzaW5nbGUgdmFsdWUgKSB7CgkJcmV0dXJuIFZhbHVlKCB2YWx1ZSApOwoJfQoKCXN0YXRpYyBkb3VibGUgRG91YmxlICggZG91YmxlIHZhbHVlICkgewoJCXJldHVybiBWYWx1ZSggdmFsdWUgKTsKCX0KCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCXN0YXRpYyBUIFZhbHVlICggVCB2YWx1ZSApIHsKCQlUIG91dCA9IDA7CgkJYnl0ZSogYiA9IChieXRlKikmdmFsdWU7CgkJYnl0ZSogYm91dCA9IChieXRlKikmb3V0OwoJCWZvciAoIHNpemVfdCBwID0gMDsgcCA8IHNpemVvZiggdmFsdWUgKTsgKytwICkgewoJCQlib3V0W3BdID0gYlsgUG9zaXRpb25zW3BdIF07CgkJfQoJCXJldHVybiBvdXQ7Cgl9Cn07CgppbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICAgCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpoZXg7CiAgICBzdGQ6OmNvdXQgPDwgIkFyZ2MgYmVmb3JlOiAiIDw8IGFyZ2MgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJBcmdjIHdpdGggMHgzMjEwOiAiIDw8IEJ5dGVPcmRlcjwweDMyMTA+OjpVSW50NjQoIGFyZ2MgKSA8PCBzdGQ6OmVuZGw7CiAgICAvL3N0ZDo6Y291dCA8PCAiQXJnYyB3aXRoIDB4MzIxMDc2NTQ6ICIgPDwgQnl0ZU9yZGVyPChpbnQpMHgzMjEwNzY1ND46OlVJbnQ2NCggYXJnYyApIDw8IHN0ZDo6ZW5kbDsKICAgIC8vc3RkOjpjb3V0IDw8ICJBcmdjIHdpdGggMHg3NjU0MzIxMDogIiA8PCBCeXRlT3JkZXI8KGludCkweDc2NTQzMjEwPjo6VUludDY0KCBhcmdjICkgPDwgc3RkOjplbmRsOwogICAgCn0=
prog.cpp:72:25: error: expected initializer before '<' token
prog.cpp: In function 'int main(int, char**)':
prog.cpp:134:58: error: wrong number of template arguments (1, should be 8)
prog.cpp:15:8: error: provided for 'template<unsigned char b0, unsigned char b1, unsigned char b2, unsigned char b3, unsigned char b4, unsigned char b5, unsigned char b6, unsigned char b7> struct ByteOrder'