bugfixing, documentation in global/debug

- catch missing "controlDict" file immediately via findEtcFile() instead of
  checking IFstream::good(). This avoids segfaulting, since the error
  handling in IFstream uses classes that are not yet initialized.
- use new dictionary features (eg, lookupOrAddDefault) to reduce code
- fixed debug::switchSet to use ref-to-pointer so pointer actually gets set!
This commit is contained in:
Mark Olesen
2008-12-12 19:25:48 +01:00
parent 0571f5393e
commit c90a167e5a
2 changed files with 85 additions and 117 deletions

View File

@ -36,19 +36,16 @@ Description
namespace Foam
{
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace debug
{
//! @cond ignoreDocumentation - local scope
dictionary* controlDictPtr_(NULL);
dictionary* debugSwitchesPtr_(NULL);
dictionary* infoSwitchesPtr_(NULL);
dictionary* optimisationSwitchesPtr_(NULL);
//- Class to ensure controlDictPtr_ is deleted at the end of the run
// @cond ignore documentation for this class
// to ensure controlDictPtr_ is deleted at the end of the run
class deleteControlDictPtr
{
public:
@ -61,135 +58,110 @@ public:
if (controlDictPtr_)
{
delete controlDictPtr_;
controlDictPtr_ = 0;
}
}
};
//! @endcond
deleteControlDictPtr deleteControlDictPtr_;
//! @endcond ignoreDocumentation
dictionary& switchSet(const char* switchSetName, dictionary* switchSetPtr)
{
if (!switchSetPtr)
{
if (!controlDict().found(switchSetName))
{
cerr<< "debug::switchSet(const char*, dictionary*): " << std::endl
<< " Cannot find " << switchSetName
<< " in dictionary " << controlDictPtr_->name().c_str()
<< std::endl << std::endl;
::exit(1);
}
switchSetPtr =
const_cast<dictionary*>(&(controlDict().subDict(switchSetName)));
}
return *switchSetPtr;
}
int debugSwitch
(
dictionary& switchSet,
const char* switchName,
const int defaultValue
)
{
if (switchSet.found(switchName))
{
return readInt(switchSet.lookup(switchName));
}
else
{
switchSet.add(switchName, defaultValue);
return defaultValue;
}
}
}
} // End namespace debug
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dictionary& debug::controlDict()
Foam::dictionary& Foam::debug::controlDict()
{
if (!controlDictPtr_)
{
fileName controlDictFileName(dotFoam("controlDict"));
IFstream dictFile(controlDictFileName);
if (!dictFile.good())
{
cerr<< "debug::controlDict(): "
<< "Cannot open essential file " << controlDictFileName.c_str()
<< std::endl << std::endl;
::exit(1);
}
controlDictPtr_ = new dictionary(dictFile);
controlDictPtr_ = new dictionary
(
IFstream(findEtcFile("controlDict", true))()
);
}
return *controlDictPtr_;
}
dictionary& debug::debugSwitches()
Foam::dictionary& Foam::debug::switchSet
(
const char* subDictName,
dictionary*& subDictPtr
)
{
if (!subDictPtr)
{
entry* ePtr = controlDict().lookupEntryPtr
(
subDictName, false, false
);
if (!ePtr || !ePtr->isDict())
{
cerr<< "debug::switchSet(const char*, dictionary*&):\n"
<< " Cannot find " << subDictName << " in dictionary "
<< controlDict().name().c_str()
<< std::endl << std::endl;
::exit(1);
}
subDictPtr = &ePtr->dict();
}
return *subDictPtr;
}
Foam::dictionary& Foam::debug::debugSwitches()
{
return switchSet("DebugSwitches", debugSwitchesPtr_);
}
int debug::debugSwitch(const char* switchName, const int defaultValue)
{
return debugSwitch
(
debugSwitches(),
switchName,
defaultValue
);
}
dictionary& debug::infoSwitches()
Foam::dictionary& Foam::debug::infoSwitches()
{
return switchSet("InfoSwitches", infoSwitchesPtr_);
}
int debug::infoSwitch(const char* switchName, const int defaultValue)
{
return debugSwitch
(
infoSwitches(),
switchName,
defaultValue
);
}
dictionary& debug::optimisationSwitches()
Foam::dictionary& Foam::debug::optimisationSwitches()
{
return switchSet("OptimisationSwitches", optimisationSwitchesPtr_);
}
int debug::optimisationSwitch(const char* switchName, const int defaultValue)
int Foam::debug::debugSwitch(const char* name, const int defaultValue)
{
return debugSwitch
return debugSwitches().lookupOrAddDefault
(
optimisationSwitches(),
switchName,
defaultValue
name, defaultValue, false, false
);
}
int Foam::debug::infoSwitch(const char* name, const int defaultValue)
{
return infoSwitches().lookupOrAddDefault
(
name, defaultValue, false, false
);
}
int Foam::debug::optimisationSwitch(const char* name, const int defaultValue)
{
return optimisationSwitches().lookupOrAddDefault
(
name, defaultValue, false, false
);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View File

@ -41,44 +41,40 @@ SourceFiles
namespace Foam
{
// Forward declaration of classes
class dictionary;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace debug
{
//- The central control dictionary.
// Located in ~/.OpenFOAM/VERSION or $WM_PROJECT_DIR/etc
// @sa Foam::findEtcFile()
dictionary& controlDict();
dictionary& switchSet(const char* switchSetName, dictionary* switchSetPtr);
//- The DebugSwitches sub-dictionary in the central controlDict.
dictionary& debugSwitches();
int debugSwitch
(
const char* switchName,
const int defaultValue = 0
);
//- The InfoSwitches sub-dictionary in the central controlDict.
dictionary& infoSwitches();
int infoSwitch
(
const char* switchName,
const int defaultValue = 0
);
//- The OptimisationSwitches sub-dictionary in the central controlDict.
dictionary& optimisationSwitches();
int optimisationSwitch
(
const char* switchName,
const int defaultValue = 0
);
}
//- Lookup debug switch or add default value.
int debugSwitch(const char* name, const int defaultValue=0);
//- Lookup info switch or add default value.
int infoSwitch(const char* name, const int defaultValue=0);
//- Lookup optimisation switch or add default value.
int optimisationSwitch(const char* name, const int defaultValue=0);
//- Internal function to lookup a sub-dictionary from controlDict.
dictionary& switchSet(const char* subDictName, dictionary*& subDictPtr);
} // End namespace debug
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //