Guest User

Untitled

a guest
Dec 7th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <algorithm>
  4. #include <boost/shared_ptr.hpp>
  5. #include <boost/foreach.hpp>
  6.  
  7. struct IText{
  8.  
  9. typedef boost::shared_ptr<IText> SPtr;
  10.  
  11. virtual void draw() = 0;
  12.  
  13. virtual void add(const SPtr&) {
  14. throw std::runtime_error("IText: Can't add to a leaf");
  15. }
  16.  
  17. virtual void remove(const SPtr&){
  18. throw std::runtime_error("IText: Can't remove from a leaf");
  19. }
  20. };
  21.  
  22. struct CompositeText: public IText{
  23.  
  24. void add(const SPtr& sptr){
  25. children_.push_back(sptr);
  26. }
  27.  
  28. void remove(const SPtr& sptr){
  29. children_.remove(sptr);
  30. }
  31.  
  32. void replace(const SPtr& oldValue, const SPtr& newValue){
  33. std::replace(children_.begin(), children_.end(), oldValue, newValue);
  34. }
  35.  
  36. virtual void draw(){
  37. BOOST_FOREACH(SPtr& sptr, children_){
  38. sptr->draw();
  39. }
  40. }
  41.  
  42. private:
  43. std::list<SPtr> children_;
  44. };
  45.  
  46. struct Letter: public IText{
  47.  
  48. Letter(char c):c_(c) {}
  49.  
  50. virtual void draw(){
  51. std::cout<<c_;
  52. }
  53.  
  54. private:
  55. char c_;
  56. };
  57.  
  58.  
  59. int main(){
  60.  
  61. CompositeText sentence;
  62.  
  63. IText::SPtr lSpace(new Letter(' '));
  64. IText::SPtr lExcl(new Letter('!'));
  65. IText::SPtr lComma(new Letter(','));
  66. IText::SPtr lNewLine(new Letter('\n'));
  67. IText::SPtr lH(new Letter('H')); // letter 'H'
  68. IText::SPtr le(new Letter('e')); // letter 'e'
  69. IText::SPtr ll(new Letter('l')); // letter 'l'
  70. IText::SPtr lo(new Letter('o')); // letter 'o'
  71. IText::SPtr lW(new Letter('W')); // letter 'W'
  72. IText::SPtr lr(new Letter('r')); // letter 'r'
  73. IText::SPtr ld(new Letter('d')); // letter 'd'
  74. IText::SPtr li(new Letter('i')); // letter 'i'
  75.  
  76. IText::SPtr wHello(new CompositeText);
  77. wHello->add(lH);
  78. wHello->add(le);
  79. wHello->add(ll);
  80. wHello->add(ll);
  81. wHello->add(lo);
  82.  
  83. IText::SPtr wWorld(new CompositeText); // word "World"
  84. wWorld->add(lW);
  85. wWorld->add(lo);
  86. wWorld->add(lr);
  87. wWorld->add(ll);
  88. wWorld->add(ld);
  89.  
  90. sentence.add(wHello);
  91. sentence.add(lComma);
  92. sentence.add(lSpace);
  93. sentence.add(wWorld);
  94. sentence.add(lExcl);
  95. sentence.add(lNewLine);
  96.  
  97. sentence.draw(); // prints "Hello, World!\n"
  98.  
  99. IText::SPtr wHi(new CompositeText); // word "Hi"
  100. wHi->add(lH);
  101. wHi->add(li);
  102.  
  103. sentence.replace(wHello, wHi);
  104. sentence.draw(); // prints "Hi, World!\n"
  105.  
  106. sentence.remove(wWorld);
  107. sentence.remove(lSpace);
  108. sentence.remove(lComma);
  109. sentence.draw(); // prints "Hi!\n"
  110.  
  111. return 0;
  112. }
Add Comment
Please, Sign In to add comment