MOOSE - Multiscale Object Oriented Simulation Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Cinfo.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 ** This program is part of 'MOOSE', the
3 ** Messaging Object Oriented Simulation Environment,
4 ** also known as GENESIS 3 base code.
5 ** copyright (C) 2003-2013 Upinder S. Bhalla. and NCBS
6 ** It is made available under the terms of the
7 ** GNU Lesser General Public License version 2.1
8 ** See the file COPYING.LIB for the full notice.
9 **********************************************************************/
10 #include "header.h"
11 #include "../shell/Shell.h"
12 #include "Dinfo.h"
13 
14 // Static declaration.
15 unsigned int Cinfo::numCoreOpFunc_ = 0;
16 
17 Cinfo::Cinfo( const string& name,
18  const Cinfo* baseCinfo,
19  Finfo** finfoArray,
20  unsigned int nFinfos,
21  DinfoBase* d,
22  const string* doc,
23  unsigned int numDoc,
24  bool banCreation
25 )
26  : name_( name ), baseCinfo_( baseCinfo ), dinfo_( d ),
27  numBindIndex_( 0 ), banCreation_( banCreation )
28 {
29  if ( cinfoMap().find( name ) != cinfoMap().end() ) {
30  cout << "Warning: Duplicate Cinfo name " << name << endl;
31  }
32  init( finfoArray, nFinfos );
33  cinfoMap()[ name ] = this;
34  doc_.clear();
35 
36 #if VERBOSITY > 2
37  cerr << setw(VERBOSITY) << "Doing initCinfo for " << name << " with numDoc = " << numDoc << endl;
38 #endif /* ----- not DEBUG ----- */
39  if ( doc && numDoc ) {
40  for ( unsigned int i = 0; i < numDoc - 1; i += 2 ) {
41  const string argName = doc[i];
42  const string argVal = doc[i+1];
43  // cout << "in initCinfo for " << name << ", doc[" << i << "] = " << doc[i] << ", " << doc[i+1] << endl;
44  // doc_[ doc[i] ] = doc[i+i];
45  doc_[ argName ] = argVal;
46  }
47  }
48 }
49 
51  : name_( "dummy" ), baseCinfo_( 0 ), dinfo_( 0 ),
52  numBindIndex_( 0 ), banCreation_( false )
53 {;}
54 
55 Cinfo::Cinfo( const Cinfo& other )
56  : name_( "dummy" ), baseCinfo_( 0 ), dinfo_( 0 ),
57  numBindIndex_( 0 ), banCreation_( false )
58 {;}
59 
60 /*
61 const Cinfo& Cinfo::operator=( const Cinfo& other )
62 {
63  name_ = other.name_;
64  baseCinfo_ = other.baseCinfo_;
65  dinfo_ = 0;
66  numBindIndex_ = other.numBindIndex_;
67  doc_ = doc_;
68  finfoMap_ = other
69 }
70 */
71 
73 {;} // The dinfos are statically allocated, we don't free them.
74 
76 // Initialization funcs
78 
82 void Cinfo::init( Finfo** finfoArray, unsigned int nFinfos )
83 {
84  if ( baseCinfo_ ) {
85  // Copy over base Finfos.
90  }
91  for ( unsigned int i = 0; i < nFinfos; i++ ) {
92  registerFinfo( finfoArray[i] );
93  }
94 }
95 
97 {
98  FuncId ret = funcs_.size();
99  funcs_.push_back( f );
100  return ret;
101 }
102 
103 void Cinfo::overrideFunc( FuncId fid, const OpFunc* f )
104 {
105  assert ( funcs_.size() > fid );
106  funcs_[ fid ] = f;
107 }
108 
110 {
111  return numBindIndex_++;
112 }
113 
115 {
116  finfoMap_[ f->name() ] = f;
117  f->registerFinfo( this );
118  if ( dynamic_cast< DestFinfo* >( f ) ) {
119  destFinfos_.push_back( f );
120  }
121  else if ( dynamic_cast< SrcFinfo* >( f ) ) {
122  srcFinfos_.push_back( f );
123  }
124  else if ( dynamic_cast< ValueFinfoBase* >( f ) ) {
125  valueFinfos_.push_back( f );
126  }
127  else if ( dynamic_cast< LookupValueFinfoBase* >( f ) ) {
128  lookupFinfos_.push_back( f );
129  }
130  else if ( dynamic_cast< SharedFinfo* >( f ) ) {
131  sharedFinfos_.push_back( f );
132  }
133  else if ( dynamic_cast< FieldElementFinfoBase* >( f ) ) {
134  fieldElementFinfos_.push_back( f );
135  }
136 }
137 
139 {
140  postCreationFinfos_.push_back( f );
141 }
142 
143 void Cinfo::postCreationFunc( Id newId, Element* newElm ) const
144 {
145  for ( vector< const Finfo* >::const_iterator i =
146  postCreationFinfos_.begin();
147  i != postCreationFinfos_.end(); ++i )
148  (*i)->postCreationFunc( newId, newElm );
149 }
150 
151 void buildFinfoElement( Id parent, vector< Finfo* >& f, const string& name )
152 {
153  if ( f.size() > 0 ) {
154  char* data = reinterpret_cast< char* >( &f[0] );
155  Id id = Id::nextId();
156  Element* e = new GlobalDataElement(
157  id, Finfo::initCinfo(), name, f.size() );
158  Finfo::initCinfo()->dinfo()->assignData( e->data( 0 ), f.size(), data, f.size());
159  Shell::adopt( parent, id, 0 );
160  }
161 }
162 
163 // Static function called by init()
165 {
166  static Dinfo< Cinfo > dummy;
167  vector< unsigned int > dims( 1, 0 );
168 
169  vector< Id > cinfoElements;
170  for ( map< string, Cinfo* >::iterator i = cinfoMap().begin();
171  i != cinfoMap().end(); ++i ) {
172  Id id = Id::nextId();
173  char* data = reinterpret_cast< char* >( i->second );
174  Element* e = new GlobalDataElement(
175  id, Cinfo::initCinfo(), i->first );
176  Cinfo::initCinfo()->dinfo()->assignData( e->data( 0 ), 1, data, 1 );
177  // Cinfo* temp = reinterpret_cast< Cinfo* >( e->data( 0 ) );
178 
179  Shell::adopt( parent, id, 0 );
180  cinfoElements.push_back( id );
181  // cout << "Cinfo::makeCinfoElements: parent= " << parent << ", Id = " << id << ", name = " << i->first << endl;
182  }
183  vector< Id >::iterator j = cinfoElements.begin();
184  for ( map< string, Cinfo* >::iterator i = cinfoMap().begin();
185  i != cinfoMap().end(); ++i ) {
186  buildFinfoElement( *j, i->second->srcFinfos_, "srcFinfo" );
187  buildFinfoElement( *j, i->second->destFinfos_, "destFinfo" );
188  buildFinfoElement( *j, i->second->valueFinfos_, "valueFinfo" );
189  buildFinfoElement( *j, i->second->lookupFinfos_, "lookupFinfo" );
190  buildFinfoElement( *j, i->second->sharedFinfos_, "sharedFinfo" );
191  buildFinfoElement( *j, i->second->fieldElementFinfos_, "fieldElementFinfo" );
192  j++;
193  }
194 }
195 
197 // Look up operations.
199 
200 const Cinfo* Cinfo::find( const string& name )
201 {
202  map<string, Cinfo*>::iterator i = cinfoMap().find(name);
203  if ( i != cinfoMap().end() )
204  return i->second;
205 
206 #ifdef RESULT_CHECK
207  stringstream ss;
208  ss << "+ " << name << " not found. Available names are " << endl;
209  ss << mapToString<string, Cinfo*>( cinfoMap() );
210  dump(ss.str(), "DEBUG");
211 #endif /* ----- not RESULT_CHECK ----- */
212 
213  return 0;
214 }
215 
216 const Cinfo* Cinfo::baseCinfo() const
217 {
218  return baseCinfo_;
219 }
220 
224 const Finfo* Cinfo::findFinfo( const string& name ) const
225 {
226  map< string, Finfo*>::const_iterator i = finfoMap_.find( name );
227  if ( i != finfoMap_.end() )
228  return i->second;
229  return 0;
230 }
231 
232 bool Cinfo::banCreation() const
233 {
234  return banCreation_;
235 }
236 
240 const OpFunc* Cinfo::getOpFunc( FuncId fid ) const {
241  if ( fid < funcs_.size () )
242  return funcs_[ fid ];
243  return 0;
244 }
245 
246 /*
247 FuncId Cinfo::getOpFuncId( const string& funcName ) const {
248  map< string, FuncId >::const_iterator i = opFuncNames_.find( funcName );
249  if ( i != opFuncNames_.end() ) {
250  return i->second;
251  }
252  return 0;
253 }
254 */
255 
257 // Miscellaneous
259 
260 const std::string& Cinfo::name() const
261 {
262  return name_;
263 }
264 
265 unsigned int Cinfo::numBindIndex() const
266 {
267  return numBindIndex_;
268 }
269 
270 const map< string, Finfo* >& Cinfo::finfoMap() const
271 {
272  return finfoMap_;
273 }
274 
275 const DinfoBase* Cinfo::dinfo() const
276 {
277  return dinfo_;
278 }
279 
280 bool Cinfo::isA( const string& ancestor ) const
281 {
282  if ( ancestor == "Neutral" ) return 1;
283  const Cinfo* base = this;
284  while( base && base != Neutral::initCinfo() ) {
285  if ( ancestor == base->name_ )
286  return 1;
287  base = base->baseCinfo_;
288  }
289  return 0;
290 }
291 
292 void Cinfo::reportFids() const
293 {
294  for ( map< string, Finfo*>::const_iterator i = finfoMap_.begin();
295  i != finfoMap_.end(); ++i ) {
296  const DestFinfo* df = dynamic_cast< const DestFinfo* >(
297  i->second );
298  if ( df ) {
299  cout << df->getFid() << " " << df->name() << endl;
300  }
301  }
302 }
303 
305 // Private functions.
307 map<string, Cinfo*>& Cinfo::cinfoMap()
308 {
309  static map<std::string, Cinfo*> lookup_;
310  return lookup_;
311 }
312 
313 
314 
315 /*
316 map< OpFunc, FuncId >& Cinfo::funcMap()
317 {
318  static map< OpFunc, FuncId > lookup_;
319  return lookup_;
320 }
321 */
322 
324 // MOOSE class functions.
326 
328 {
330  // Field Definitions
333  "docs",
334  "Documentation",
336  );
337 
338  static ReadOnlyValueFinfo< Cinfo, string > baseClass(
339  "baseClass",
340  "Name of base class",
342  );
343 
344  static string doc[] =
345  {
346  "Name", "Cinfo",
347  "Author", "Upi Bhalla",
348  "Description", "Class information object."
349  };
350 
351  static Finfo* cinfoFinfos[] = {
352  &docs, // ReadOnlyValue
353  &baseClass, // ReadOnlyValue
354  };
355 
356  static Dinfo< Cinfo > dinfo;
357  static Cinfo cinfoCinfo (
358  "Cinfo",
360  cinfoFinfos,
361  sizeof( cinfoFinfos ) / sizeof ( Finfo* ),
362  &dinfo,
363  doc,
364  sizeof(doc)/sizeof(string)
365  );
366 
367  return &cinfoCinfo;
368 }
369 
371 
372 
374 // Field functions
376 string Cinfo::getDocs() const
377 {
378  ostringstream doc;
379  for (map <string, string>::const_iterator ii = doc_.begin(); ii != doc_.end(); ++ii){
380  doc << '\n' << ii->first << ":\t\t" << ii->second << endl;
381  }
382  return doc.str();
383 }
384 
385 
386 static DestFinfo dummy(
387  "dummy",
388  "This Finfo is a dummy. If you are reading this you have used an invalid index",
389 0 );
390 
391 string Cinfo::getBaseClass() const
392 {
393  if ( baseCinfo_ )
394  return baseCinfo_->name();
395  else
396  return "none";
397 }
398 
400 // Below we have a set of functions for getting various categories of
401 // Finfos. These also return the base class finfos. The baseclass finfos
402 // come first, then the new finfos. This is a bit messy because it changes
403 // the indices of the new finfos, but I shouldn't be looking them up
404 // by index anyway.
406 Finfo* Cinfo::getSrcFinfo( unsigned int i ) const
407 {
408  if ( i >= getNumSrcFinfo() )
409  return 0;
410  if ( baseCinfo_ ) {
411  if ( i >= baseCinfo_->getNumSrcFinfo() )
412  return srcFinfos_[ i - baseCinfo_->getNumSrcFinfo() ];
413  else
414  return baseCinfo_->getSrcFinfo( i );
415  //return const_cast< Cinfo* >( baseCinfo_ )->getSrcFinfo( i );
416  }
417 
418  return srcFinfos_[i];
419 }
420 
421 unsigned int Cinfo::getNumSrcFinfo() const
422 {
423  if ( baseCinfo_ )
424  return srcFinfos_.size() + baseCinfo_->getNumSrcFinfo();
425  else
426  return srcFinfos_.size();
427 }
428 
430 Finfo* Cinfo::getDestFinfo( unsigned int i ) const
431 {
432  if ( i >= getNumDestFinfo() )
433  return &dummy;
434  if ( baseCinfo_ ) {
435  if ( i >= baseCinfo_->getNumDestFinfo() )
436  return destFinfos_[ i - baseCinfo_->getNumDestFinfo() ];
437  else
438  return const_cast< Cinfo* >( baseCinfo_ )->getDestFinfo( i );
439  }
440 
441  return destFinfos_[i];
442 }
443 
444 unsigned int Cinfo::getNumDestFinfo() const
445 {
446  if ( baseCinfo_ )
447  return destFinfos_.size() + baseCinfo_->getNumDestFinfo();
448  else
449  return destFinfos_.size();
450 }
451 
453 Finfo* Cinfo::getValueFinfo( unsigned int i ) const
454 {
455  if ( i >= getNumValueFinfo() )
456  return &dummy;
457  if ( baseCinfo_ ) {
458  if ( i >= baseCinfo_->getNumValueFinfo() )
459  return valueFinfos_[ i - baseCinfo_->getNumValueFinfo() ];
460  else
461  return const_cast< Cinfo* >(baseCinfo_)->getValueFinfo( i );
462  }
463 
464  return valueFinfos_[i];
465 }
466 
467 unsigned int Cinfo::getNumValueFinfo() const
468 {
469  if ( baseCinfo_ )
470  return valueFinfos_.size() + baseCinfo_->getNumValueFinfo();
471  else
472  return valueFinfos_.size();
473 }
474 
475 
477 Finfo* Cinfo::getLookupFinfo( unsigned int i ) const
478 {
479  if ( i >= getNumLookupFinfo() )
480  return &dummy;
481  if ( baseCinfo_ ) {
482  if ( i >= baseCinfo_->getNumLookupFinfo() )
483  return lookupFinfos_[ i - baseCinfo_->getNumLookupFinfo() ];
484  else
485  return const_cast< Cinfo* >(baseCinfo_)->getLookupFinfo( i );
486  }
487 
488  return lookupFinfos_[i];
489 }
490 
491 unsigned int Cinfo::getNumLookupFinfo() const
492 {
493  if ( baseCinfo_ )
494  return lookupFinfos_.size() + baseCinfo_->getNumLookupFinfo();
495  else
496  return lookupFinfos_.size();
497 }
498 
500 Finfo* Cinfo::getSharedFinfo( unsigned int i )
501 {
502  if ( i >= getNumSharedFinfo() )
503  return &dummy;
504  if ( baseCinfo_ ) {
505  if ( i >= baseCinfo_->getNumSharedFinfo() )
506  return sharedFinfos_[ i - baseCinfo_->getNumSharedFinfo() ];
507  else
508  return const_cast< Cinfo* >( baseCinfo_ )->getSharedFinfo( i );
509  }
510 
511  return sharedFinfos_[i];
512 }
513 
514 unsigned int Cinfo::getNumSharedFinfo() const
515 {
516  if ( baseCinfo_ )
517  return sharedFinfos_.size() + baseCinfo_->getNumSharedFinfo();
518  else
519  return sharedFinfos_.size();
520 }
521 
523 Finfo* Cinfo::getFieldElementFinfo( unsigned int i ) const
524 {
525  if ( i >= getNumFieldElementFinfo() )
526  return &dummy;
527  if ( baseCinfo_ ) {
528  if ( i >= baseCinfo_->getNumFieldElementFinfo() )
530  else
531  return const_cast< Cinfo* >( baseCinfo_ )->getFieldElementFinfo( i );
532  }
533 
534  return fieldElementFinfos_[i];
535 }
536 
537 unsigned int Cinfo::getNumFieldElementFinfo() const
538 {
539  if ( baseCinfo_ )
541  else
542  return fieldElementFinfos_.size();
543 }
544 
546 void Cinfo::setNumFinfo( unsigned int val ) // Dummy function
547 {
548  ;
549 }
550 
552 const string& Cinfo::srcFinfoName( BindIndex bid ) const
553 {
554  static const string err = "";
555  for ( vector< Finfo* >::const_iterator i = srcFinfos_.begin();
556  i != srcFinfos_.end(); ++i ) {
557  const SrcFinfo* sf = dynamic_cast< const SrcFinfo* >( *i );
558  assert( sf );
559  if ( sf->getBindIndex() == bid ) {
560  return sf->name();
561  }
562  }
563  if ( baseCinfo_ )
564  return baseCinfo_->srcFinfoName( bid );
565  cout << "Error: Cinfo::srcFinfoName( " << bid << " ): not found\n";
566  return err;
567 }
568 
569 const string& Cinfo::destFinfoName( FuncId fid ) const
570 {
571  static const string err = "";
572  for ( vector< Finfo* >::const_iterator i = destFinfos_.begin();
573  i != destFinfos_.end(); ++i ) {
574  const DestFinfo* df = dynamic_cast< const DestFinfo* >( *i );
575  assert( df );
576  if ( df->getFid() == fid ) {
577  return df->name();
578  }
579  }
580  if ( baseCinfo_ )
581  return baseCinfo_->destFinfoName( fid );
582  cout << "Error: Cinfo::destFinfoName( " << fid << " ): not found\n";
583  return err;
584 }
585 
587 
588 // Static function. Should be called soonest after static initialization.
590 {
592  unsigned int num = 0;
593  for ( map< string, Cinfo* >::iterator
594  i = cinfoMap().begin(); i != cinfoMap().end(); ++i )
595  {
596  vector< const OpFunc* >& vec = i->second->funcs_;
597  for( vector< const OpFunc* >::iterator
598  j = vec.begin(); j != vec.end(); ++j )
599  {
600  OpFunc* of = const_cast< OpFunc* >( *j );
601  num += of->setIndex( num );
602  }
603  }
604  // cout << "on node " << Shell::myNode() << ": oldNumOpFunc = " << numCoreOpFunc_ << ", new = " << num << endl;
605  numCoreOpFunc_ = num;
606 }
vector< Finfo * > valueFinfos_
Keep track of all ValueFinfos.
Definition: Cinfo.h:302
static void makeCinfoElements(Id parent)
Definition: Cinfo.cpp:164
const Cinfo * baseCinfo() const
Definition: Cinfo.cpp:216
virtual void registerFinfo(Cinfo *c)=0
Id init(int argc, char **argv, bool &doUnitTests, bool &doRegressionTests, unsigned int &benchmark)
Definition: main.cpp:150
Finfo * getFieldElementFinfo(unsigned int i) const
Definition: Cinfo.cpp:523
FuncId registerOpFunc(const OpFunc *f)
Definition: Cinfo.cpp:96
const OpFunc * getOpFunc(FuncId fid) const
Definition: Cinfo.cpp:240
Finfo * getDestFinfo(unsigned int i) const
Definition: Cinfo.cpp:430
Finfo * getValueFinfo(unsigned int i) const
Definition: Cinfo.cpp:453
unsigned int getNumSrcFinfo() const
Definition: Cinfo.cpp:421
void init(Finfo **finfoArray, unsigned int nFinfos)
Definition: Cinfo.cpp:82
BindIndex registerBindIndex()
Definition: Cinfo.cpp:109
unsigned short BindIndex
Definition: header.h:62
unsigned int getNumDestFinfo() const
Definition: Cinfo.cpp:444
BindIndex getBindIndex() const
Definition: SrcFinfo.cpp:28
string getDocs() const
Definition: Cinfo.cpp:376
Definition: Dinfo.h:60
vector< Finfo * > destFinfos_
Keep track of all DestFinfos.
Definition: Cinfo.h:299
static unsigned int numCoreOpFunc_
Definition: Cinfo.h:323
static DestFinfo dummy("dummy","This Finfo is a dummy. If you are reading this you have used an invalid index", 0)
bool setIndex(unsigned int i)
Used when rebuilding the Fid->OpFunc mapping.
Definition: OpFuncBase.cpp:58
const Cinfo * baseCinfo_
Definition: Cinfo.h:282
map< string, Finfo * > finfoMap_
Definition: Cinfo.h:293
unsigned int getNumValueFinfo() const
Definition: Cinfo.cpp:467
static const Cinfo * initCinfo()
Definition: Cinfo.cpp:327
static const Cinfo * find(const std::string &name)
Definition: Cinfo.cpp:200
void buildFinfoElement(Id parent, vector< Finfo * > &f, const string &name)
Definition: Cinfo.cpp:151
static map< string, Cinfo * > & cinfoMap()
Definition: Cinfo.cpp:307
Cinfo()
Definition: Cinfo.cpp:50
const map< string, Finfo * > & finfoMap() const
Definition: Cinfo.cpp:270
const string & name() const
Definition: Finfo.cpp:80
const DinfoBase * dinfo() const
Definition: Cinfo.cpp:275
~Cinfo()
Definition: Cinfo.cpp:72
void reportFids() const
Definition: Cinfo.cpp:292
vector< Finfo * > fieldElementFinfos_
Keep track of all FieldElementFinfos.
Definition: Cinfo.h:311
const std::string & name() const
Definition: Cinfo.cpp:260
string name_
Definition: Cinfo.h:278
vector< Finfo * > sharedFinfos_
Keep track of all SharedFinfos.
Definition: Cinfo.h:308
static Id nextId()
Definition: Id.cpp:132
static const Cinfo * initCinfo()
Definition: Finfo.cpp:23
void overrideFunc(FuncId fid, const OpFunc *f)
Definition: Cinfo.cpp:103
void registerFinfo(Finfo *f)
Definition: Cinfo.cpp:114
void postCreationFunc(Id newId, Element *newElm) const
Definition: Cinfo.cpp:143
Finfo * getLookupFinfo(unsigned int i) const
Definition: Cinfo.cpp:477
FuncId getFid() const
Definition: DestFinfo.cpp:45
unsigned int getNumFieldElementFinfo() const
Definition: Cinfo.cpp:537
bool isA(const string &ancestor) const
Definition: Cinfo.cpp:280
unsigned int getNumSharedFinfo() const
Definition: Cinfo.cpp:514
bool banCreation_
Definition: Cinfo.h:288
const string & destFinfoName(FuncId fid) const
Definition: Cinfo.cpp:569
Finfo * getSrcFinfo(unsigned int i) const
Definition: Cinfo.cpp:406
vector< Finfo * > lookupFinfos_
Keep track of all LookupFinfos.
Definition: Cinfo.h:305
virtual void assignData(char *copy, unsigned int copyEntries, const char *orig, unsigned int origEntries) const =0
bool banCreation() const
Definition: Cinfo.cpp:232
string getBaseClass() const
Definition: Cinfo.cpp:391
vector< const Finfo * > postCreationFinfos_
Definition: Cinfo.h:318
Finfo * getSharedFinfo(unsigned int i)
Definition: Cinfo.cpp:500
void setNumFinfo(unsigned int v)
Definition: Cinfo.cpp:546
std::map< std::string, std::string > doc_
Definition: Cinfo.h:286
const DinfoBase * dinfo_
Definition: Cinfo.h:283
static char name[]
Definition: mfield.cpp:401
static const Cinfo * cinfoCinfo
Definition: Cinfo.cpp:370
vector< const OpFunc * > funcs_
Definition: Cinfo.h:319
virtual char * data(unsigned int rawIndex, unsigned int fieldIndex=0) const =0
static void rebuildOpIndex()
Definition: Cinfo.cpp:589
static bool adopt(ObjId parent, Id child, unsigned int msgIndex)
Definition: Shell.cpp:654
Definition: Id.h:17
static unsigned int rebuildOpIndex()
cleans out the entire Ops vector. Returns size of orig vector.
Definition: OpFuncBase.cpp:49
unsigned int numBindIndex() const
Definition: Cinfo.cpp:265
const string & srcFinfoName(BindIndex bid) const
Definition: Cinfo.cpp:552
vector< Finfo * > srcFinfos_
Keep track of all SrcFinfos.
Definition: Cinfo.h:296
void registerPostCreationFinfo(const Finfo *f)
Definition: Cinfo.cpp:138
static const Cinfo * initCinfo()
Definition: Neutral.cpp:16
unsigned int getNumLookupFinfo() const
Definition: Cinfo.cpp:491
unsigned int FuncId
Definition: header.h:42
Definition: Cinfo.h:18
BindIndex numBindIndex_
Definition: Cinfo.h:285
const Finfo * findFinfo(const string &name) const
Definition: Cinfo.cpp:224
Definition: Finfo.h:12