daily pastebin goal
42%
SHARE
TWEET

Untitled

a guest Dec 7th, 2017 50 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
Top