From 063d8edea114cbb6431d5345a5745f35b66fd667 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@Germany>
Date: Thu, 3 Dec 2009 16:33:58 +0100
Subject: [PATCH] PackedBoolList specializaton for operator=

- now that I re-examined the code, the note in commit 51fd6327a64ea
  can be mostly ignored

  PackedList isMaster(nPoints, 1u);
  is not really inefficient at all, since the '1u' is packed into
  32/64-bits before the subsequent assignment and doesn't involve
  shifts/masking for each index

  The same misinformation applies to the PackedList(size, 0u) form.
  It isn't much slower at all.

  Nonetheless, add bool specialization so that it is a simple assign.
---
 applications/test/PackedList/PackedListTest.C | 10 +++++++---
 .../containers/Lists/PackedList/PackedListI.H | 19 ++++++++++++++++++-
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/applications/test/PackedList/PackedListTest.C b/applications/test/PackedList/PackedListTest.C
index 1e0ca6f385d..e5670b3cbe9 100644
--- a/applications/test/PackedList/PackedListTest.C
+++ b/applications/test/PackedList/PackedListTest.C
@@ -82,9 +82,13 @@ int main(int argc, char *argv[])
     argList::noParallel();
     argList::validArgs.insert("file .. fileN");
 
-    argList::addBoolOption("mask");
-    argList::addBoolOption("count");
-    argList::addBoolOption("info");
+    argList::addBoolOption("mask", "report information about the bit masks");
+    argList::addBoolOption("count", "test the count() method");
+    argList::addBoolOption
+    (
+        "info",
+        "print an ascii representation of the storage"
+    );
 
     argList args(argc, argv, false, true);
 
diff --git a/src/OpenFOAM/containers/Lists/PackedList/PackedListI.H b/src/OpenFOAM/containers/Lists/PackedList/PackedListI.H
index df7786f61b8..92d6c02d72d 100644
--- a/src/OpenFOAM/containers/Lists/PackedList/PackedListI.H
+++ b/src/OpenFOAM/containers/Lists/PackedList/PackedListI.H
@@ -839,7 +839,24 @@ Foam::PackedList<nBits>::operator[](const label i)
 }
 
 
-// specialization for nBits=1 isn't worth the bother
+namespace Foam
+{
+    // specialization for nBits=1
+    template<>
+    inline void Foam::PackedList<1>::operator=(const unsigned int val)
+    {
+        if (val)
+        {
+            StorageList::operator=(~0u);
+        }
+        else
+        {
+            StorageList::operator=(0u);
+        }
+    }
+}
+
+
 template<unsigned nBits>
 inline void Foam::PackedList<nBits>::operator=(const unsigned int val)
 {
-- 
GitLab