Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members  

DimensionGroup.C

00001 #include <citrus/config.h>
00002 
00003 #include <stdio.h>
00004 #include <algorithm>
00005 #include <iterator>
00006 
00007 #include <citrus/DimensionGroup.H>
00008 #include <citrus/Dimension.H>
00009 #include <citrus/Unit.H>
00010 
00069 DimensionGroup* DimensionGroup::theDimensionGroups = 0 ;
00070 
00075 DimensionGroup::DimensionGroup( const char* name )
00076 {
00077   if ( name ) {
00078     m_name = new char[ strlen(name) + 1 ] ;
00079     strcpy( m_name, name ) ;
00080   } else {
00081     m_name = 0 ;
00082   }
00083 
00084   // Add each dimension to the global list of all dimensions
00085   if ( theDimensionGroups ) {
00086     m_next = theDimensionGroups ;
00087   } else {
00088     m_next = 0 ;
00089   }
00090   
00091   m_dims.clear() ;
00092 
00093   theDimensionGroups = this ;
00094 }
00095 
00105 DimensionGroup::DimensionGroup( const char* name, 
00106                                 const vector<DimensionPower> dims )
00107 {
00108   if ( name ) {
00109     m_name = new char[ strlen(name) + 1 ] ;
00110     strcpy( m_name, name ) ;
00111   } else {
00112     m_name = 0 ;
00113   }
00114 
00115   // Add each dimension to the global list of all dimensions
00116   if ( theDimensionGroups ) {
00117     m_next = theDimensionGroups ;
00118   } else {
00119     m_next = 0 ;
00120   }
00121   
00122   m_dims = dims ;
00123 
00124   theDimensionGroups = this ;
00125 }
00126 
00129 DimensionGroup::~DimensionGroup()
00130 {
00131   if ( m_name )
00132     delete [] m_name ;
00133 
00134   destroy( m_children.begin(), m_children.end() ) ;
00135 
00136   if (theDimensionGroups == this) {
00137     theDimensionGroups = m_next ;
00138   } else {
00139     DimensionGroup*     tmp = theDimensionGroups ;
00140     while ( tmp && tmp->m_next != this )
00141       tmp = tmp->m_next ;
00142     tmp->m_next = m_next ;
00143   }
00144 }
00145 
00150 void    DimensionGroup::setDimensions( vector<DimensionPower> dims ) 
00151 {
00152   m_dims = dims ;
00153 }
00154 
00157 void DimensionGroup::name( const char* name )
00158 {
00159   if ( !name )
00160     return ;
00161 
00162   if ( m_name )
00163     delete m_name ;
00164 
00165   m_name = new char[ strlen(name) + 1 ] ;
00166   strcpy( m_name, name ) ;
00167 }
00168 
00174 void    DimensionGroup::p_add( Unit* unit )
00175 {
00176   m_children.push_back( unit ) ;
00177 }
00178 
00185 void    DimensionGroup::p_remove( Unit* unit )
00186 {
00187   list<Unit*>::iterator posn = ::find( m_children.begin(), m_children.end(),
00188                                        unit ) ;
00189   if ( posn != m_children.end() )
00190     m_children.erase( posn ) ;
00191   // was m_children.remove( unit ) ;
00192 }
00193 
00196 bool    DimensionGroup::operator == (const vector<DimensionPower>& pwr)
00197 {
00198   return pwr == m_dims ;
00199 }
00200 
00203 DimensionGroup* DimensionGroup::find( const char* dgrp_name )
00204 {
00205   DimensionGroup*       tmp = theDimensionGroups ;
00206   while ( tmp ) {
00207     if (!strcmp(tmp->name(), dgrp_name) ) {
00208       return tmp ;
00209     }
00210     tmp=tmp->next() ;
00211   }
00212   return 0 ;
00213 }
00214 
00217 void DimensionPower::print( const vector<DimensionPower>& dpwr, FILE* f=stderr)
00218 {
00219   vector<DimensionPower>::const_iterator iter = dpwr.begin() ;
00220   while ( iter != dpwr.end() ) {
00221     fprintf( f, "%c(%d) ", iter->m_dim->symbol(), iter->m_pwr ) ;
00222     ++iter ;
00223   }
00224 }
00225 
00228 DimensionGroup* DimensionGroup::find( const vector<DimensionPower>& dpwr )
00229 {
00230   DimensionGroup*       norbert = theDimensionGroups ;
00231   while (norbert) {
00232     if ( (*norbert) == dpwr )
00233       return norbert ;
00234    norbert = norbert->next() ;
00235   }
00236   return 0 ;
00237 }
00238 
00259 vector<DimensionPower>::iterator find_dimn( Dimension* dimn,
00260                                             vector<DimensionPower>& dpwr)
00261 {
00262   DimensionPower        phil ;
00263 
00264   vector<DimensionPower>::iterator iter = dpwr.begin() ;
00265   while ( iter != dpwr.end() ) {
00266     /* fprintf( stderr, "%x != %x\n", &(*iter), &(*dpwr.end()) ) ;*/
00267     phil = *iter ;
00268     if (phil.m_dim == dimn)
00269       return iter ;
00270     iter++ ;
00271   }
00272   return dpwr.end() ; /* dpwr.end() should be past_end, right? */
00273 }
00274 
00283 vector<DimensionPower>::const_iterator find_dimn( Dimension* dimn,
00284                                             const vector<DimensionPower>& dpwr)
00285 {
00286   DimensionPower        phil ;
00287 
00288   vector<DimensionPower>::const_iterator iter = dpwr.begin() ;
00289   while ( iter != dpwr.end() ) {
00290     /* fprintf( stderr, "%x != %x\n", &(*iter), &(*dpwr.end()) ) ;*/
00291     phil = *iter ;
00292     if (phil.m_dim == dimn)
00293       return iter ;
00294     iter++ ;
00295   }
00296   return dpwr.end() ; /* dpwr.end() should be past_end, right? */
00297 }
00298 
00304 bool areDimensionsMatched( const vector<DimensionPower>& d1, 
00305                            const vector<DimensionPower>& d2 )
00306 {
00307   if ( d1.size() != d2.size() )
00308     return false ;
00309 
00310   vector<DimensionPower>::const_iterator found ;
00311   vector<DimensionPower>::const_iterator iter = d1.begin() ;
00312   while ( iter != d1.end() ) {
00313     found = find_dimn( iter->m_dim, d2 ) ;
00314     if ( found != d2.end() ) {
00315       if ( found->m_pwr != iter->m_pwr )
00316         return false ;
00317     } else {
00318       return false ;
00319     }
00320     ++iter ;
00321   }
00322 
00323   return true ;
00324 }
00325 
Citrus C++ Reference Manual  20010520