#include <iostream>
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)
template <int... Args>
struct arg_counter {
enum { count = sizeof...(Args) };
};
#define INC_COUNTER1 arg_counter<-1>::count
#define INC_COUNTER2 arg_counter<-1, __COUNTER__>::count
#define INC_COUNTER3 arg_counter<-1, __COUNTER__, __COUNTER__>::count
#define INC_COUNTER4 arg_counter<-1, __COUNTER__, __COUNTER__, __COUNTER__>::count
#define INC_COUNTER5 arg_counter<-1, __COUNTER__, __COUNTER__, __COUNTER__, __COUNTER__>::count
#define INC_COUNTER_IMPL2(count, ...) INC_COUNTER ## count
#define INC_COUNTER_IMPL(count, ...) INC_COUNTER_IMPL2(count, __VA_ARGS__)
#define INC_COUNTER(...) INC_COUNTER_IMPL(VA_NARGS(__VA_ARGS__), __VA_ARGS__)
// removed: __asm__( ".readonly__" #location "__" #name)
#define CreateReadOnlyBlockImpl(name, location, size, ...) \
template<> \
const unsigned int ReadOnlyBlock<location, size>::Data[] \
= { __VA_ARGS__ }; \
ReadOnlyBlock<location, size> name;
#define CreateReadOnlyBlock(name, ...) \
CreateReadOnlyBlockImpl(name, __COUNTER__, INC_COUNTER(__VA_ARGS__), __VA_ARGS__);
template<int Location, int Size> struct ReadOnlyBlock
{
static const unsigned int Data[Size];
int loc () const { return Location; }
int size() const { return Size; }
};
CreateReadOnlyBlock(readOnlyArray1, 0, 1, 2, 3);
CreateReadOnlyBlock(readOnlyArray2, 4, 5, 6, 7);
CreateReadOnlyBlock(readOnlyArray3, 9);
CreateReadOnlyBlock(readOnlyArray4, 1, 2, 3, 4, 5);
int main()
{
std::cout << "@" << readOnlyArray1.loc() << ": " << readOnlyArray1.size() << '\n';
std::cout << "@" << readOnlyArray2.loc() << ": " << readOnlyArray2.size() << '\n';
std::cout << "@" << readOnlyArray3.loc() << ": " << readOnlyArray3.size() << '\n';
std::cout << "@" << readOnlyArray4.loc() << ": " << readOnlyArray4.size() << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBWQV9OQVJHU19JTVBMKF8xLCBfMiwgXzMsIF80LCBfNSwgTiwgLi4uKSBOCiNkZWZpbmUgVkFfTkFSR1MoLi4uKSBWQV9OQVJHU19JTVBMKF9fVkFfQVJHU19fLCA1LCA0LCAzLCAyLCAxKQoKdGVtcGxhdGUgPGludC4uLiBBcmdzPgpzdHJ1Y3QgYXJnX2NvdW50ZXIgewogIGVudW0geyBjb3VudCA9IHNpemVvZi4uLihBcmdzKSB9Owp9OwoKI2RlZmluZSBJTkNfQ09VTlRFUjEgYXJnX2NvdW50ZXI8LTE+Ojpjb3VudAojZGVmaW5lIElOQ19DT1VOVEVSMiBhcmdfY291bnRlcjwtMSwgX19DT1VOVEVSX18+Ojpjb3VudAojZGVmaW5lIElOQ19DT1VOVEVSMyBhcmdfY291bnRlcjwtMSwgX19DT1VOVEVSX18sIF9fQ09VTlRFUl9fPjo6Y291bnQKI2RlZmluZSBJTkNfQ09VTlRFUjQgYXJnX2NvdW50ZXI8LTEsIF9fQ09VTlRFUl9fLCBfX0NPVU5URVJfXywgX19DT1VOVEVSX18+Ojpjb3VudAojZGVmaW5lIElOQ19DT1VOVEVSNSBhcmdfY291bnRlcjwtMSwgX19DT1VOVEVSX18sIF9fQ09VTlRFUl9fLCBfX0NPVU5URVJfXywgX19DT1VOVEVSX18+Ojpjb3VudAoKI2RlZmluZSBJTkNfQ09VTlRFUl9JTVBMMihjb3VudCwgLi4uKSBJTkNfQ09VTlRFUiAjIyBjb3VudAojZGVmaW5lIElOQ19DT1VOVEVSX0lNUEwoY291bnQsIC4uLikgSU5DX0NPVU5URVJfSU1QTDIoY291bnQsIF9fVkFfQVJHU19fKSAKI2RlZmluZSBJTkNfQ09VTlRFUiguLi4pIElOQ19DT1VOVEVSX0lNUEwoVkFfTkFSR1MoX19WQV9BUkdTX18pLCBfX1ZBX0FSR1NfXykKCi8vIHJlbW92ZWQ6IF9fYXNtX18oICIucmVhZG9ubHlfXyIgI2xvY2F0aW9uICJfXyIgI25hbWUpCiNkZWZpbmUgQ3JlYXRlUmVhZE9ubHlCbG9ja0ltcGwobmFtZSwgbG9jYXRpb24sIHNpemUsIC4uLikgICAgICBcCiAgdGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgY29uc3QgdW5zaWduZWQgaW50IFJlYWRPbmx5QmxvY2s8bG9jYXRpb24sIHNpemU+OjpEYXRhW10gICAgICBcCiAgICA9IHsgX19WQV9BUkdTX18gfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgUmVhZE9ubHlCbG9jazxsb2NhdGlvbiwgc2l6ZT4gbmFtZTsKCgojZGVmaW5lIENyZWF0ZVJlYWRPbmx5QmxvY2sobmFtZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgQ3JlYXRlUmVhZE9ubHlCbG9ja0ltcGwobmFtZSwgX19DT1VOVEVSX18sIElOQ19DT1VOVEVSKF9fVkFfQVJHU19fKSwgX19WQV9BUkdTX18pOwoKdGVtcGxhdGU8aW50IExvY2F0aW9uLCBpbnQgU2l6ZT4gc3RydWN0IFJlYWRPbmx5QmxvY2sKewogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRGF0YVtTaXplXTsKICBpbnQgbG9jICgpIGNvbnN0IHsgcmV0dXJuIExvY2F0aW9uOyB9CiAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9Cn07CgpDcmVhdGVSZWFkT25seUJsb2NrKHJlYWRPbmx5QXJyYXkxLCAwLCAxLCAyLCAzKTsKQ3JlYXRlUmVhZE9ubHlCbG9jayhyZWFkT25seUFycmF5MiwgNCwgNSwgNiwgNyk7CkNyZWF0ZVJlYWRPbmx5QmxvY2socmVhZE9ubHlBcnJheTMsIDkpOwpDcmVhdGVSZWFkT25seUJsb2NrKHJlYWRPbmx5QXJyYXk0LCAxLCAyLCAzLCA0LCA1KTsKCmludCBtYWluKCkKewogIHN0ZDo6Y291dCA8PCAiQCIgPDwgcmVhZE9ubHlBcnJheTEubG9jKCkgPDwgIjogIiA8PCByZWFkT25seUFycmF5MS5zaXplKCkgPDwgJ1xuJzsKICBzdGQ6OmNvdXQgPDwgIkAiIDw8IHJlYWRPbmx5QXJyYXkyLmxvYygpIDw8ICI6ICIgPDwgcmVhZE9ubHlBcnJheTIuc2l6ZSgpIDw8ICdcbic7CiAgc3RkOjpjb3V0IDw8ICJAIiA8PCByZWFkT25seUFycmF5My5sb2MoKSA8PCAiOiAiIDw8IHJlYWRPbmx5QXJyYXkzLnNpemUoKSA8PCAnXG4nOwogIHN0ZDo6Y291dCA8PCAiQCIgPDwgcmVhZE9ubHlBcnJheTQubG9jKCkgPDwgIjogIiA8PCByZWFkT25seUFycmF5NC5zaXplKCkgPDwgJ1xuJzsKfQ==