fork download
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4.  
  5. class ValueNotFoundException {};
  6.  
  7. template<typename T> class Memory
  8. {
  9. typedef std::map<std::string, T> MemoryMap;
  10.  
  11. Memory<T> *outerMemory;
  12. MemoryMap mmap;
  13.  
  14. std::string memname; // tylko dla wydruku :D
  15.  
  16. Memory(Memory *outer, std::string name) // tylko dla wydruku :D (memname = name)
  17. : outerMemory(outer), memname(name)
  18. {
  19. }
  20. public:
  21. std::string getName(void) const { return memname; } // tylko dla wydruku :D
  22. static Memory getGlobal(void)
  23. {
  24. static Memory global(0, "(global)");
  25. return global;
  26. }
  27.  
  28. Memory createInnerMemory(std::string name)
  29. {
  30. return Memory(this, name);
  31. }
  32.  
  33. Memory<T>& setValue(std::string name, T value)
  34. {
  35. mmap[name] = value;
  36. return *this;
  37. }
  38.  
  39. T getValue(std::string name)
  40. {
  41. if(mmap.find(name) != mmap.end()) return mmap[name]; // gdy znaleziono...
  42. if(!outerMemory) throw ValueNotFoundException(); // gdy nie znaleziono i jesteśmy w "globalu", to nie ma i na razie :D
  43. return outerMemory->getValue(name); // gdy nie znzaleziono, ale to na szczescie jakas inna pamiec :P
  44. }
  45.  
  46. unsigned printMemTree() // tylko dla wydruku
  47. {
  48. using std::cout;
  49. using std::endl;
  50.  
  51. class Helper
  52. {
  53. public:
  54. static void addTabs(unsigned u)
  55. {
  56. for(unsigned i = 0; i < u; i++)
  57. cout << " ";
  58. }
  59. };
  60.  
  61. unsigned tabs = outerMemory ? outerMemory->printMemTree() : 0; // dobijamy sie aż do globala
  62.  
  63.  
  64. Helper::addTabs(tabs);
  65. cout << "ZAKRES \"" << memname << "\" : " << endl;
  66.  
  67. typedef typename MemoryMap::iterator Iter;
  68. for(Iter it = mmap.begin(); it != mmap.end(); it++) // ALE SIĘ WKURWIŁEM TU KOMPILATORZE JEBANY
  69. {
  70. Helper::addTabs(tabs + 1);
  71. cout << '\"' << it->first << "\" : " << it->second << endl;
  72. }
  73.  
  74. return tabs + 1; // jedziem wyżej :D
  75. }
  76. };
  77.  
  78. template<typename T> void print(std::string name, Memory<T>& mem)
  79. {
  80. try
  81. {
  82. T value = mem.getValue(name);
  83. std::cout << '`' << name << '`' << " (z perspektywy \"" << mem.getName() <<"\") = " << value << std::endl;
  84. }
  85. catch(ValueNotFoundException&)
  86. {
  87. std::cout << "Nie znaleziono zmiennej `" << name << "` z zakresu \"" << mem.getName() << '\"' << std::endl;
  88. }
  89. }
  90.  
  91. int main(void)
  92. {
  93. typedef Memory<int> MemI;
  94.  
  95. MemI global = MemI::getGlobal();
  96. MemI inner1 = global.createInnerMemory("inner1");
  97. MemI inner2 = inner1.createInnerMemory("inner2");
  98.  
  99. global.setValue("o", 123);
  100. inner1.setValue("x", 666).setValue("r", 30);
  101. inner2.setValue("x", 82);
  102.  
  103. inner2.printMemTree(); // rysujemy drzewko :P
  104.  
  105. // TESTUJEMY
  106. print("o", global);
  107. print("r", inner2);
  108. print("o", inner2);
  109. print("dupadupadupa", inner1);
  110. print("x", inner2);
  111. print("o", inner1);
  112.  
  113. return 0;
  114. }
  115.  
Success #stdin #stdout 0s 3440KB
stdin
Standard input is empty
stdout
ZAKRES "(global)" : 
  "o" : 123
  ZAKRES "inner1" : 
    "r" : 30
    "x" : 666
    ZAKRES "inner2" : 
      "x" : 82
`o` (z perspektywy "(global)") = 123
`r` (z perspektywy "inner2") = 30
`o` (z perspektywy "inner2") = 123
Nie znaleziono zmiennej `dupadupadupa` z zakresu "inner1"
`x` (z perspektywy "inner2") = 82
`o` (z perspektywy "inner1") = 123