Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members  

UnitExpr.C

00001 #include <citrus/config.h>
00002 
00003 #include <citrus/UnitExpr.H>
00004 #include <citrus/UnitInfo.H>
00005 
00006 /* Debug flags.
00007  * Define the following for gobs of meaningless output.
00008  *
00009  * DBG_UEDESTRUCT       Print a message when a UnitExpr is destroyed.
00010  * DBG_UECOPY           Print a message when UnitExpr assignment or copy
00011  *                      constructor is called.
00012  */
00013 
00014 UnitExpr::UnitExpr( const UnitExpr& src )
00015 {
00016 #ifdef DBG_UECOPY
00017   fprintf( stderr, "--Copying [" ) ; src.print( stderr ) ; fprintf( stderr, "]\n" ) ;
00018 #endif // DBG_UECOPY
00019 
00020   p_copy( src ) ;
00021 
00022 #ifdef DBG_UECOPY
00023   fprintf( stderr, "       =[" ) ; print(stderr) ; fprintf( stderr, "]\n" ) ;
00024 #endif // DBG_UECOPY
00025 }
00026 
00027 UnitExpr::UnitExpr( UnitUnitInfo* u, UnitExpr* lf, UnitExpr* rt )
00028 {
00029   m_lf = lf ; 
00030   m_rt = rt ;
00031   m_i = u ;
00032 }
00033 
00034 UnitExpr::UnitExpr( UnitOperInfo* o, UnitExpr* lf, UnitExpr* rt )
00035 {
00036   m_lf = lf ; 
00037   m_rt = rt ;
00038   m_i = o ;
00039 }
00040 
00041 UnitExpr::~UnitExpr()
00042 {
00043   // kill all subexpressions
00044   if ( m_lf )
00045     delete m_lf ;
00046 
00047 #ifdef DBG_UEDESTRUCT
00048   fprintf( stderr, "(kill 0x%x", this ) ; m_i->print(stderr) ; fprintf( stderr, ")" ) ;
00049   fflush(stderr) ;
00050 #endif // DBG_UEDESTRUCT
00051 
00052   delete m_i ;
00053 
00054   if ( m_rt )
00055     delete m_rt ;
00056 }
00057 
00058 UnitExpr& UnitExpr::operator = ( const UnitExpr& ue )
00059 {
00060   if ( &ue == this )
00061     return *this ;
00062 
00063 #ifdef DBG_UECOPY
00064   fprintf( stderr, "Copying [" ) ; ue.print( stderr ) ; fprintf( stderr, "]\n" ) ;
00065 #endif // DBG_UECOPY
00066 
00067   if ( m_i )
00068     delete m_i ;
00069   if ( m_lf )
00070     delete m_lf ;
00071   if ( m_rt )
00072     delete m_rt ;
00073 
00074   p_copy( ue ) ;
00075 
00076 #ifdef DBG_UECOPY
00077   fprintf( stderr, "       =[" ) ; print(stderr) ; fprintf( stderr, "]\n" ) ;
00078 #endif // DBG_UECOPY
00079 
00080   return *this ;
00081 }
00082 
00083 void UnitExpr::p_copy( const UnitExpr& src )
00084 {
00085   if ( src.m_i )
00086     m_i = src.m_i->copy() ;
00087 
00088   if ( src.m_lf )
00089     m_lf = new UnitExpr( *src.m_lf ) ;
00090   else
00091     m_lf = 0 ;
00092 
00093   if ( src.m_rt )
00094     m_rt = new UnitExpr( *src.m_rt ) ;
00095   else
00096     m_rt = 0 ;
00097 }
00098 
00099 void UnitExpr::print(FILE* f) const
00100 {
00101   if (m_lf) {
00102     fprintf(f, "(") ; m_lf->print(f) ; fprintf(f, ")") ;
00103   }
00104   m_i->print( f ) ;
00105   if (m_rt) {
00106     fprintf(f, "(") ; m_rt->print(f) ; fprintf(f, ")") ;
00107   }
00108 }
Citrus C++ Reference Manual  20010520