From 5ca4acadd6450e8ec1bb4000dfe6efaf75d6e08d Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Tue, 22 Mar 2016 08:26:50 +0000
Subject: [PATCH] List: Added construction from and assignment to zero

---
 src/OpenFOAM/containers/Lists/List/List.C   | 24 +++++++++++++++++++++
 src/OpenFOAM/containers/Lists/List/List.H   |  6 ++++++
 src/OpenFOAM/containers/Lists/List/ListI.H  |  7 ++++++
 src/OpenFOAM/containers/Lists/UList/UList.C | 10 +++++++++
 src/OpenFOAM/containers/Lists/UList/UList.H |  4 ++++
 5 files changed, 51 insertions(+)

diff --git a/src/OpenFOAM/containers/Lists/List/List.C b/src/OpenFOAM/containers/Lists/List/List.C
index 134bd4f04aa..34cc05ee8d6 100644
--- a/src/OpenFOAM/containers/Lists/List/List.C
+++ b/src/OpenFOAM/containers/Lists/List/List.C
@@ -79,6 +79,30 @@ Foam::List<T>::List(const label s, const T& a)
 }
 
 
+template<class T>
+Foam::List<T>::List(const label s, const zero)
+:
+    UList<T>(NULL, s)
+{
+    if (this->size_ < 0)
+    {
+        FatalErrorInFunction
+            << "bad size " << this->size_
+            << abort(FatalError);
+    }
+
+    if (this->size_)
+    {
+        this->v_ = new T[this->size_];
+
+        List_ACCESS(T, (*this), vp);
+        List_FOR_ALL((*this), i)
+            List_ELEM((*this), vp, i) = Zero;
+        List_END_FOR_ALL
+    }
+}
+
+
 template<class T>
 Foam::List<T>::List(const List<T>& a)
 :
diff --git a/src/OpenFOAM/containers/Lists/List/List.H b/src/OpenFOAM/containers/Lists/List/List.H
index d86ea022511..9b28f5461f3 100644
--- a/src/OpenFOAM/containers/Lists/List/List.H
+++ b/src/OpenFOAM/containers/Lists/List/List.H
@@ -105,6 +105,9 @@ public:
         //- Construct with given size and value for all elements.
         List(const label, const T&);
 
+        //- Construct with given size initializing all elements to zero.
+        List(const label, const zero);
+
         //- Copy constructor.
         List(const List<T>&);
 
@@ -225,6 +228,9 @@ public:
         //- Assignment of all entries to the given value
         inline void operator=(const T&);
 
+        //- Assignment of all entries to zero
+        inline void operator=(const zero);
+
 
     // Istream operator
 
diff --git a/src/OpenFOAM/containers/Lists/List/ListI.H b/src/OpenFOAM/containers/Lists/List/ListI.H
index 1d1e9912441..7d4b325140f 100644
--- a/src/OpenFOAM/containers/Lists/List/ListI.H
+++ b/src/OpenFOAM/containers/Lists/List/ListI.H
@@ -141,4 +141,11 @@ inline void Foam::List<T>::operator=(const T& t)
 }
 
 
+template<class T>
+inline void Foam::List<T>::operator=(const zero)
+{
+    UList<T>::operator=(Zero);
+}
+
+
 // ************************************************************************* //
diff --git a/src/OpenFOAM/containers/Lists/UList/UList.C b/src/OpenFOAM/containers/Lists/UList/UList.C
index 2bbe09038ac..7014e396a98 100644
--- a/src/OpenFOAM/containers/Lists/UList/UList.C
+++ b/src/OpenFOAM/containers/Lists/UList/UList.C
@@ -76,6 +76,16 @@ void Foam::UList<T>::operator=(const T& t)
 }
 
 
+template<class T>
+void Foam::UList<T>::operator=(const zero)
+{
+    List_ACCESS(T, (*this), vp);
+    List_FOR_ALL((*this), i)
+        List_ELEM((*this), vp, i) = Zero;
+    List_END_FOR_ALL
+}
+
+
 // * * * * * * * * * * * * * * STL Member Functions  * * * * * * * * * * * * //
 
 template<class T>
diff --git a/src/OpenFOAM/containers/Lists/UList/UList.H b/src/OpenFOAM/containers/Lists/UList/UList.H
index aff5ff8e121..a2fd872fa63 100644
--- a/src/OpenFOAM/containers/Lists/UList/UList.H
+++ b/src/OpenFOAM/containers/Lists/UList/UList.H
@@ -46,6 +46,7 @@ SourceFiles
 #include "label.H"
 #include "uLabel.H"
 #include "nullObject.H"
+#include "zero.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -223,6 +224,9 @@ public:
         //- Assignment of all entries to the given value
         void operator=(const T&);
 
+        //- Assignment of all entries to zero
+        void operator=(const zero);
+
 
     // STL type definitions
 
-- 
GitLab