這是用戶二次開發代碼中非常常用的一個語法,我們這裏看一下它的底層實現。當然不同的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;
}