// Copyright Evgeny Panasyuk 2012.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://w...content-available-to-author-only...t.org/LICENSE_1_0.txt)
#include <iostream>
#include <ostream>
#include <vector>
#include <string>
using namespace std;
// ____________________________________________________________________________________ //
// Implementation
#define DEFINE_ELEM(type,name) \
type name; \
/**/
#define DEFINE_ELEM_REF(type,name) \
type &name; \
/**/
#define DEFINE_MEMBER_VEC(type,name) \
vector<type> name; \
/**/
#define SCATTER_ELEM(type,name) \
name.push_back(rec.name); \
/**/
#define ELEM_SIZE(type,name) \
name.size() |
/**/
#define ELEM_AGGR(type,name) \
name[index], \
/**/
#define SCATTER_STRUCT(name,struct_elems) \
struct name \
{ \
struct_elems(DEFINE_ELEM) \
}; \
struct ref_##name \
{ \
struct_elems(DEFINE_ELEM_REF) \
}; \
class scattered_##name \
{ \
struct_elems(DEFINE_MEMBER_VEC) \
public: \
unsigned size() \
{ \
return unsigned(struct_elems(ELEM_SIZE) 0);\
} \
void push_back(const name &rec) \
{ \
struct_elems(SCATTER_ELEM) \
} \
ref_##name operator[](unsigned index) \
{ \
ref_##name temp = { struct_elems(ELEM_AGGR) }; \
return temp;\
} \
}; \
/**/
// ____________________________________________________________________________________ //
#define CUSTOM_STRUCT(elem) \
elem(string,name) \
elem(int,age) \
/**/
SCATTER_STRUCT(record,CUSTOM_STRUCT)
int main()
{
scattered_record vecs;
{
record temp={"One",1}; vecs.push_back(temp);
}
{
record temp={"Two",2}; vecs.push_back(temp);
}
{
record temp={"Three",3}; vecs.push_back(temp);
}
for(unsigned i=0,size=vecs.size();i!=size;++i)
{
cout << vecs[i].name << " " << vecs[i].age << endl;
vecs[i].name+="_postfix";
vecs[i].age+=10;
}
cout << string(16,'_') << endl;
for(unsigned i=0,size=vecs.size();i!=size;++i)
cout << vecs[i].name << " " << vecs[i].age << endl;
}
Ly8gICAgICAgICAgICAgQ29weXJpZ2h0IEV2Z2VueSBQYW5hc3l1ayAyMDEyLgovLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCi8vICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKLy8gICAgICAgICAgaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQub3JnL0xJQ0VOU0VfMV8wLnR4dCkKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gLy8KCi8vIEltcGxlbWVudGF0aW9uCgojZGVmaW5lIERFRklORV9FTEVNKHR5cGUsbmFtZSkgXAogICAgdHlwZSBuYW1lOyBcCi8qKi8KI2RlZmluZSBERUZJTkVfRUxFTV9SRUYodHlwZSxuYW1lKSBcCiAgICB0eXBlICZuYW1lOyBcCi8qKi8KCiNkZWZpbmUgREVGSU5FX01FTUJFUl9WRUModHlwZSxuYW1lKSBcCiAgICB2ZWN0b3I8dHlwZT4gbmFtZTsgXAovKiovCgojZGVmaW5lIFNDQVRURVJfRUxFTSh0eXBlLG5hbWUpIFwKICAgIG5hbWUucHVzaF9iYWNrKHJlYy5uYW1lKTsgXAovKiovCgojZGVmaW5lIEVMRU1fU0laRSh0eXBlLG5hbWUpIFwKICAgIG5hbWUuc2l6ZSgpIHwKLyoqLwojZGVmaW5lIEVMRU1fQUdHUih0eXBlLG5hbWUpIFwKICAgIG5hbWVbaW5kZXhdLCBcCi8qKi8KCgojZGVmaW5lIFNDQVRURVJfU1RSVUNUKG5hbWUsc3RydWN0X2VsZW1zKSBcCnN0cnVjdCBuYW1lIFwKeyBcCiAgICBzdHJ1Y3RfZWxlbXMoREVGSU5FX0VMRU0pIFwKfTsgXApzdHJ1Y3QgcmVmXyMjbmFtZSBcCnsgXAogICAgc3RydWN0X2VsZW1zKERFRklORV9FTEVNX1JFRikgXAp9OyBcCmNsYXNzIHNjYXR0ZXJlZF8jI25hbWUgXAp7IFwKICAgIHN0cnVjdF9lbGVtcyhERUZJTkVfTUVNQkVSX1ZFQykgXApwdWJsaWM6IFwKICAgIHVuc2lnbmVkIHNpemUoKSBcCiAgICB7IFwKICAgICAgICByZXR1cm4gdW5zaWduZWQoc3RydWN0X2VsZW1zKEVMRU1fU0laRSkgMCk7XAogICAgfSBcCiAgICB2b2lkIHB1c2hfYmFjayhjb25zdCBuYW1lICZyZWMpIFwKICAgIHsgXAogICAgICAgIHN0cnVjdF9lbGVtcyhTQ0FUVEVSX0VMRU0pIFwKICAgIH0gXAogICAgcmVmXyMjbmFtZSBvcGVyYXRvcltdKHVuc2lnbmVkIGluZGV4KSBcCiAgICB7IFwKICAgICAgICByZWZfIyNuYW1lIHRlbXAgPSB7IHN0cnVjdF9lbGVtcyhFTEVNX0FHR1IpIH07IFwKICAgICAgICByZXR1cm4gdGVtcDtcCiAgICB9IFwKfTsgXAovKiovCgovLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gLy8KCiNkZWZpbmUgQ1VTVE9NX1NUUlVDVChlbGVtKSBcCmVsZW0oc3RyaW5nLG5hbWUpIFwKZWxlbShpbnQsYWdlKSBcCi8qKi8KClNDQVRURVJfU1RSVUNUKHJlY29yZCxDVVNUT01fU1RSVUNUKQoKaW50IG1haW4oKQp7CiAgICBzY2F0dGVyZWRfcmVjb3JkIHZlY3M7CiAgICB7CiAgICAgICAgcmVjb3JkIHRlbXA9eyJPbmUiLDF9OyB2ZWNzLnB1c2hfYmFjayh0ZW1wKTsKICAgIH0KICAgIHsKICAgICAgICByZWNvcmQgdGVtcD17IlR3byIsMn07IHZlY3MucHVzaF9iYWNrKHRlbXApOwogICAgfQogICAgewogICAgICAgIHJlY29yZCB0ZW1wPXsiVGhyZWUiLDN9OyB2ZWNzLnB1c2hfYmFjayh0ZW1wKTsKICAgIH0KICAgIGZvcih1bnNpZ25lZCBpPTAsc2l6ZT12ZWNzLnNpemUoKTtpIT1zaXplOysraSkKICAgIHsKICAgICAgICBjb3V0IDw8IHZlY3NbaV0ubmFtZSA8PCAiICIgPDwgdmVjc1tpXS5hZ2UgPDwgZW5kbDsKICAgICAgICB2ZWNzW2ldLm5hbWUrPSJfcG9zdGZpeCI7CiAgICAgICAgdmVjc1tpXS5hZ2UrPTEwOwogICAgfQogICAgY291dCA8PCBzdHJpbmcoMTYsJ18nKSA8PCBlbmRsOwogICAgZm9yKHVuc2lnbmVkIGk9MCxzaXplPXZlY3Muc2l6ZSgpO2khPXNpemU7KytpKQogICAgICAgIGNvdXQgPDwgdmVjc1tpXS5uYW1lIDw8ICIgIiA8PCB2ZWNzW2ldLmFnZSA8PCBlbmRsOwp9Cg==