这是用户二次开发代码中非常常用的一个语法,我们这里看一下它的底层实现。当然不同的class会各自实现一个forall
,这里给出的是UList
的实现,具体路径位于
src/OpenFOAM/container/Lists/UList/
文件夹中定义了UList
类,使用一个连续存储,通过制定类型T
的指针给定首地址
template<class T>
class UList
{
// Private Data
//- Number of elements in UList
label size_;
//- Vector of values of type T
T* __restrict__ v_;
....
}
其中__restrict__ v_
就是首地址。而其中的宏定义下面也给出
//- Loop across all elements in \\a list
// \\par Usage
// \\code
// forAll(anyList, i)
// {
// statements;
// }
// \\endcode
// \\sa forAllReverse
#define forAll(list, i) \\
for (Foam::label i=0; i<(list).size(); i++)
//- Reverse loop across all elements in \\a list
// \\par Usage
// \\code
// forAllReverse(anyList, i)
// {
// statements;
// }
// \\endcode
// \\sa forAll
#define forAllReverse(list, i) \\
for (Foam::label i=(list).size()-1; i>=0; i--)
//- Iterate across all elements in the \\a container object of type
// \\a Container.
// \\par Usage
// \\code
// forAll(ContainerType, container, iter)
// {
// statements;
// }
// \\endcode
// \\sa forAllConstIter
#define forAllIter(Container,container,iter) \\
for \\
( \\
Container::iterator iter = (container).begin(); \\
iter != (container).end(); \\
++iter \\
)
//- Iterate across all elements in the \\a container object of type
// \\a Container with const access.
// \\par Usage
// \\code
// forAllConstIter(ContainerType, container, iter)
// {
// statements;
// }
// \\endcode
// \\sa forAllIter
#define forAllConstIter(Container,container,iter) \\
for \\
( \\
Container::const_iterator iter = (container).begin(); \\
iter != (container).end(); \\
++iter \\
)
大体是类似的,我们这里解析一下第一个forAll
,我们给定一个UList
类的对象list
和游标label i
输入后,i
会遍历list
中的每一个元素。本质上是for
的封装(其实我感觉这样降低了可读性)。比如说这里有一个UList list
,我们希望给里面的所有元素都加一,就这样写
label i;
UList<int> list;
....
forAll(list, i)
{ list[i] = list[i]+1;
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容