From 063d8edea114cbb6431d5345a5745f35b66fd667 Mon Sep 17 00:00:00 2001 From: Mark Olesen 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 1e0ca6f385..e5670b3cbe 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 df7786f61b..92d6c02d72 100644 --- a/src/OpenFOAM/containers/Lists/PackedList/PackedListI.H +++ b/src/OpenFOAM/containers/Lists/PackedList/PackedListI.H @@ -839,7 +839,24 @@ Foam::PackedList::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 inline void Foam::PackedList::operator=(const unsigned int val) {