fork download
  1. #include <memory>
  2. #include <iostream>
  3.  
  4. #define RC
  5. #define WR
  6. #define mixin class
  7. #define interface class
  8.  
  9. typedef unsigned short ushort;
  10. typedef unsigned long long ulong64;
  11. typedef unsigned long ulong;
  12.  
  13. // Карандаши и кисточки.
  14. namespace PaintingToolbox
  15. {
  16. // Внутренние классы.
  17. namespace private_classes
  18. {
  19. // Предмет для письма (интерфейс класса).
  20. interface IDrawStick
  21. {
  22. public:
  23. virtual void draw () = 0;
  24. ;
  25. };
  26.  
  27. // Коробка или контейнер (интерфейс класса).
  28. template <class T> interface IHolder
  29. {
  30. public:
  31. virtual void add (const ulong, const T &) = 0;
  32. virtual void remove (const ulong) = 0;
  33.  
  34. virtual bool isEmpty () = 0;
  35. ;
  36. };
  37.  
  38. // Коробка или контейнер (добавляемый код).
  39. template <class T> mixin THolder
  40. {
  41. public:
  42. THolder () {}
  43. ~THolder () {}
  44. ;
  45.  
  46. protected:
  47. ulong counter = 0;
  48.  
  49. void incCounter ()
  50. {
  51. this->counter ++;
  52. }
  53.  
  54. void decCounter ()
  55. {
  56. this->counter --;
  57. }
  58.  
  59. bool checkIsEmpty ()
  60. {
  61. return (this->counter == 0) ? true : false;
  62. }
  63. ;
  64. };
  65. };
  66.  
  67. using IDrawStick = private_classes::IDrawStick;
  68.  
  69. template <class T> using IHolder = private_classes::IHolder <T>;
  70. template <class T> using THolder = private_classes::THolder <T>;
  71.  
  72. // Карандаш.
  73. class Pencil : public IDrawStick
  74. {
  75. public:
  76. Pencil () {}
  77. virtual ~Pencil () {}
  78.  
  79. virtual void draw ()
  80. {
  81. std::cout << "Pencil::draw ()" << std::endl;
  82. }
  83. ;
  84. };
  85.  
  86. // Кисточка.
  87. class Brush : public IDrawStick
  88. {
  89. public:
  90. Brush () {}
  91. virtual ~Brush () {}
  92.  
  93. virtual void draw ()
  94. {
  95. std::cout << "Brush::draw ()" << std::endl;
  96. }
  97. ;
  98. };
  99.  
  100. // Контейнер с чем угодно.
  101. template <class T> class Container : public IHolder <T>, private THolder <T>
  102. {
  103. public:
  104. Container () {}
  105. virtual ~Container () {}
  106.  
  107. virtual void add (const ulong id, const T &item)
  108. {
  109. std::cout << "Container::add ()" << std::endl;
  110.  
  111. this->incCounter ();
  112. }
  113.  
  114. virtual void remove (const ulong id)
  115. {
  116. std::cout << "Container::remove ()" << std::endl;
  117.  
  118. this->decCounter ();
  119. }
  120.  
  121. virtual bool isEmpty ()
  122. {
  123. std::cout << "Container::isEmpty ()" << std::endl;
  124.  
  125. return this->checkIsEmpty ();
  126. }
  127. ;
  128. };
  129.  
  130. // Коробка с чем угодно.
  131. template <class T> class Box : public IHolder <T>, private THolder <T>
  132. {
  133. public:
  134. Box () {}
  135. virtual ~Box () {}
  136.  
  137. virtual void add (const ulong id, const T &item)
  138. {
  139. std::cout << "Box::add ()" << std::endl;
  140.  
  141. this->incCounter ();
  142. }
  143.  
  144. virtual void remove (const ulong id)
  145. {
  146. std::cout << "Box::remove ()" << std::endl;
  147.  
  148. this->decCounter ();
  149. }
  150.  
  151. virtual bool isEmpty ()
  152. {
  153. std::cout << "Box::isEmpty ()" << std::endl;
  154.  
  155. return this->checkIsEmpty ();
  156. }
  157. ;
  158. };
  159. };
  160.  
  161. using namespace PaintingToolbox;
  162.  
  163. int main ()
  164. {
  165. // Карандаш.
  166. std::shared_ptr <Pencil> pencil (
  167. new Pencil ()
  168. );
  169.  
  170. // Коробка с карандашами.
  171. std::shared_ptr <Box <Pencil>> pencilBox (
  172. new Box <Pencil> ()
  173. );
  174.  
  175. // Контейнер с коробками с кисточками.
  176. std::shared_ptr <Container <Box <Brush>>> container (
  177. new Container <Box <Brush>> ()
  178. );
  179.  
  180. // И...
  181. pencil->draw ();
  182.  
  183. pencilBox->add (0xFF, *pencil);
  184.  
  185. std::cout << pencilBox->isEmpty () << std::endl;
  186. std::cout << container->isEmpty () << std::endl;
  187.  
  188. // Табы лучше, чем пробелы.
  189. return 0;
  190. }
Success #stdin #stdout 0s 4500KB
stdin
Standard input is empty
stdout
Pencil::draw ()
Box::add ()
Box::isEmpty ()
0
Container::isEmpty ()
1