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
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
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
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
00267 phil = *iter ;
00268 if (phil.m_dim == dimn)
00269 return iter ;
00270 iter++ ;
00271 }
00272 return dpwr.end() ;
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
00291 phil = *iter ;
00292 if (phil.m_dim == dimn)
00293 return iter ;
00294 iter++ ;
00295 }
00296 return dpwr.end() ;
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