代码仍然是src/OpenFOAM/primitives/
路径中的,为文件夹strings
,其中有内容
fileName keyType lists string stringOps word wordRe
这里的多个文件夹都使用到了这里的word
文件夹中的文件,而word
用到了string
中的内容,所以我们先读这个吧。这里包含了如下几个文件:
string.C string.H stringI.H stringIO.C stringIOList.C stringIOList.H
从string.H
开始读,正文太长了我们分段放出来读:
/*Description
A class for handling character strings derived from std::string.
Strings may contain any characters and therefore are delimited by quotes
for IO : "any list of characters".
Used as a base class for word and fileName.
See also
Foam::findEtcFile() for information about the site/user OpenFOAM
configuration directory
SourceFiles
string.C
stringIO.C
---------------------------------------------------------------------------*/
#include "char.H"
#include "Hasher.H"
#include
#include
#include
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
这里使用到的char.H
头文件前面已经度过了,就是给Foam
名字域下的Istream
和Ostream
提供运算符重定义和readChar
函数。Hasher.H
头文件在路径~/OpenFOAM/OpenFOAM-7/src/OpenFOAM/primitives/hashes
中,主要是代码实现了哈希的功能,我们之后会仔细阅读。
Description
中描述了当前文件定义的类的功能,主要处理std::string
的字符串。另外字符串因为可能包含多种符号,所以要用双引号
namespace Foam
{
// Forward declaration of classes
class Istream;
class Ostream;
// Forward declaration of friend functions and operators
class string;
Istream& operator>>(Istream&, string&);
Ostream& operator<<(Ostream&, const string&);
Ostream& operator<<(Ostream&, const std::string&);
类似前面几个博客中阅读的,这里也是对>>
和<<
进行重定向,这里把多态扩展到了string
。下面为类的声明,为一系列的构造函数和成员函数,以及操作符重载。
/*---------------------------------------------------------------------------*\
Class string Declaration
\*---------------------------------------------------------------------------*/
class string
:
public std::string
{
public:
// Static Data Members
static const char* const typeName;
static int debug;
//- An empty string
static const string null;
//- Hashing function class, shared by all the derived classes
class hash
{
public:
hash()
{}
inline unsigned operator()(const string&, unsigned seed = 0) const;
};
// Constructors
//- Construct null
inline string();
...
// Member Functions
//- Count and return the number of a given character in the string
size_type count(const char) const;
...
// Member Operators
//- Return the sub-string from the i-th character for \a n characters
inline string operator()
(
const size_type i,
const size_type n
) const;
//- Return the sub-string from the first character for \a n characters
inline string operator()
(
const size_type n
) const;
inline void operator=(const string&);
inline void operator=(string&&);
// IOstream Operators
friend Istream& operator>>(Istream&, string&);
friend Ostream& operator<<(Ostream&, const string&);
};
void writeEntry(Ostream& os, const char* value);
void writeEntry(Ostream& os, const string& value);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "stringI.H"
这里的stringI.H
来自相同文件夹,其实是上述文件中所有inline
函数的具体实现,基本上都是通过直接调用std
名字域中的string
变量来。而其余函数的具体实现,在string.C
中。(话说为啥不直接用std::string
)。具体可以使用的成员函数如下:
valid(const string& str) 判断是否合法
meta(const string&, const char quote='\\') 判断string是否含有特定的字符串
stripInvalid(string& str) 裁掉不合法的部分
validate(const string&) 从给定string中给出一个合法的string
quotemeta(const string&, const char quote='\\') 返回带有特定字符串的字符串
replace(const string& oldStr,const string& newStr,size_type start = 0) 替换
replaceAll(const string& oldStr,const string& newStr,size_type start = 0) 全部替换
...
string()(const size_type i,const size_type n) 从第i个开始的n个字符
string()(const size_type n) 从头开始的n个字符
operator=(const string&); 赋值
operator=(string&&); 赋值
>> <<的重定义和之前一致
这里还用到了stringOps.H
,位于strings/stringOps/
文件夹中,之后再去阅读。
我们接下来看另外一组文件,首先从stringIOList.H
开始,内容如下:
#include "stringList.H"
#include "IOList.H"
namespace Foam
{
typedef IOList stringIOList;
typedef IOList stringListIOList;
}
定义了两个类型stringIOList
和stringListIOList
,即分别以string
和stringList
类型生成的IOList
。而IOList
类型的声明在IOList.H
中,路径src/OpenFOAM/db/IOobjects/IOList/IOList.H
。
我们之后再去阅读stringIO.C
,内容如下,我直接将函数的功能注释在代码中:
#include "string.H"
#include "IOstreams.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::string::string(Istream& is)
{
is >> *this; //将is中读取的字符串,保存在当前string对象中
}
// * * * * * * * * * * * * * * * IOstream Functions * * * * * * * * * * * * //
//注意这些普通函数,不是某个类的成员函数
void Foam::writeEntry(Ostream& os, const char* value)
{
os << value; //将char数组输出
}
void Foam::writeEntry(Ostream& os, const string& value)
{
os << value; //将string输出
}
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
Foam::Istream& Foam::operator>>(Istream& is, string& s)
{
token t(is);
if (!t.good())
{
is.setBad();
return is;
}
if (t.isString())
{
s = t.stringToken();
}
else
{
is.setBad();
FatalIOErrorInFunction(is)
<< "wrong token type - expected string, found " << t.info()
<< exit(FatalIOError);
return is;
}
// Check state of Istream
is.check("Istream& operator>>(Istream&, string&)");
return is;
}
//string意义下的运算符重定义,类似之前对char进行的工作
Foam::Ostream& Foam::operator<<(Ostream& os, const string& s)
{
os.write(s);
os.check("Ostream& operator<<(Ostream&, const string&)");
return os;
}
Foam::Ostream& Foam::operator<<(Ostream& os, const std::string& s)
{
os.write(string(s));
os.check("Ostream& operator<<(Ostream&, const std::string&)");
return os;
}
最后一个文件stringIOList.C
这里正文似乎对几个函数进行了声明,但是并未给出实现,再后续阅读读到了会在这里补齐
{
defineCompoundTypeName(List, stringList);
addCompoundToRunTimeSelectionTable(List, stringList);
defineTemplateTypeNameAndDebugWithName(stringIOList, "stringList", 0);
defineTemplateTypeNameAndDebugWithName
(
stringListIOList,
"stringListList",
0
);
}
呃,后面稍微改一下形式吧,贴代码讲解的形式,不如直接在代码上注释。之后会在总结完一个模块后,集中说明模块的作用