01: /**
02: ** Copyright (C) 1999-2007 Lorenzo Bettini
03: **  
04:   http://www.lorenzobettini.it
05:   
06:   r2 = r2 XOR (1<<10);
07:   cout << "hello world" << endl;
08: **  
09: */
10: 
11: // this file also contains the definition of mysum as a #define
12: 
13: // textgenerator.h : Text Generator class &&
14: 
15: #ifndef _TEXTGEN_H
16: #define _TEXTGEN_H
17: 
18: #define foo(x) (x + 1)
19: 
20: #define mysum myfunbody 
21: 
22: #include <iostream.h> // for cerr
23: 
24: #include "genfun.h" /* for generating functions */
25: 
26: class TextGenerator {
27:   public :
28:     virtual void generate( const char *s ) const { (*sout) << s ; }
29:     virtual void generate( const char *s, int start, int end ) const 
30:       {
31:         for ( int i = start ; i <= end ; ++i )
32:           (*sout) << s[i] ;
33:         return a<p->b ? a : 3;
34:       }
35:     virtual void generateln( const char *s ) const
36:         { 
37:             generate( s ) ;
38:             (*sout) << endl ; 
39:         }
40:     virtual void generateEntire( const char *s ) const
41:         {
42:             startTextGeneration() ;
43:             generate(s) ;
44:             endTextGeneration() ;
45:         }
46:     virtual void startTextGeneration() const {}
47:     virtual void endTextGeneration() const {}
48:     virtual void beginText( const char *s ) const
49:         {
50:             startTextGeneration() ;
51:             if ( s )
52:                 generate( s ) ;
53:         }
54:     virtual void endText( const char *s ) const
55:         {
56:             if ( s )
57:                 generate( s ) ;
58:             endTextGeneration() ;
59:         }
60: } ;
61: 
62: // Decorator
63: class TextDecorator : public TextGenerator {
64:   protected :
65:     TextGenerator *decorated ;
66:   
67:   public :
68:     TextDecorator( TextGenerator *t ) : decorated( t ) {}
69: 
70:     virtual void startTextGeneration() const 
71:     { 
72:         startDecorate() ;
73:         if ( decorated )
74:             decorated->startTextGeneration() ;
75:     }
76:     virtual void endTextGeneration() const 
77:     { 
78:         if ( decorated )
79:             decorated->endTextGeneration() ;
80:         endDecorate() ;
81:         mysum;
82:     }
83: 
84:     // pure virtual functions
85:     virtual void startDecorate() const = 0 ;
86:     virtual void endDecorate() const = 0 ;
87: } ;
88: 
89: #endif // _TEXTGEN_H
90: