fork download
  1. // Copyright Evgeny Panasyuk 2012.
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://w...content-available-to-author-only...t.org/LICENSE_1_0.txt)
  5.  
  6. #include <iostream>
  7. #include <ostream>
  8. #include <vector>
  9. #include <string>
  10. using namespace std;
  11.  
  12. // ____________________________________________________________________________________ //
  13.  
  14. // Implementation
  15.  
  16. #define DEFINE_ELEM(type,name) \
  17.   type name; \
  18. /**/
  19. #define DEFINE_ELEM_REF(type,name) \
  20.   type &name; \
  21. /**/
  22.  
  23. #define DEFINE_MEMBER_VEC(type,name) \
  24.   vector<type> name; \
  25. /**/
  26.  
  27. #define SCATTER_ELEM(type,name) \
  28.   name.push_back(rec.name); \
  29. /**/
  30.  
  31. #define ELEM_SIZE(type,name) \
  32.   name.size() |
  33. /**/
  34. #define ELEM_AGGR(type,name) \
  35.   name[index], \
  36. /**/
  37.  
  38.  
  39. #define SCATTER_STRUCT(name,struct_elems) \
  40. struct name \
  41. { \
  42.   struct_elems(DEFINE_ELEM) \
  43. }; \
  44. struct ref_##name \
  45. { \
  46.   struct_elems(DEFINE_ELEM_REF) \
  47. }; \
  48. class scattered_##name \
  49. { \
  50.   struct_elems(DEFINE_MEMBER_VEC) \
  51. public: \
  52.   unsigned size() \
  53.   { \
  54.   return unsigned(struct_elems(ELEM_SIZE) 0);\
  55.   } \
  56.   void push_back(const name &rec) \
  57.   { \
  58.   struct_elems(SCATTER_ELEM) \
  59.   } \
  60.   ref_##name operator[](unsigned index) \
  61.   { \
  62.   ref_##name temp = { struct_elems(ELEM_AGGR) }; \
  63.   return temp;\
  64.   } \
  65. }; \
  66. /**/
  67.  
  68. // ____________________________________________________________________________________ //
  69.  
  70. #define CUSTOM_STRUCT(elem) \
  71. elem(string,name) \
  72. elem(int,age) \
  73. /**/
  74.  
  75. SCATTER_STRUCT(record,CUSTOM_STRUCT)
  76.  
  77. int main()
  78. {
  79. scattered_record vecs;
  80. {
  81. record temp={"One",1}; vecs.push_back(temp);
  82. }
  83. {
  84. record temp={"Two",2}; vecs.push_back(temp);
  85. }
  86. {
  87. record temp={"Three",3}; vecs.push_back(temp);
  88. }
  89. for(unsigned i=0,size=vecs.size();i!=size;++i)
  90. {
  91. cout << vecs[i].name << " " << vecs[i].age << endl;
  92. vecs[i].name+="_postfix";
  93. vecs[i].age+=10;
  94. }
  95. cout << string(16,'_') << endl;
  96. for(unsigned i=0,size=vecs.size();i!=size;++i)
  97. cout << vecs[i].name << " " << vecs[i].age << endl;
  98. }
  99.  
Success #stdin #stdout 0.01s 2860KB
stdin
Standard input is empty
stdout
One 1
Two 2
Three 3
________________
One_postfix 11
Two_postfix 12
Three_postfix 13